aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Zotlabs/Extend/Hook.php86
-rw-r--r--Zotlabs/Module/Achievements.php93
-rw-r--r--Zotlabs/Module/Acl.php314
-rw-r--r--Zotlabs/Module/Admin.php1786
-rw-r--r--Zotlabs/Module/Api.php122
-rw-r--r--Zotlabs/Module/Appman.php108
-rw-r--r--Zotlabs/Module/Apps.php46
-rw-r--r--Zotlabs/Module/Attach.php61
-rw-r--r--Zotlabs/Module/Authtest.php61
-rw-r--r--Zotlabs/Module/Block.php92
-rw-r--r--Zotlabs/Module/Blocks.php172
-rw-r--r--Zotlabs/Module/Bookmarks.php105
-rw-r--r--Zotlabs/Module/Branchtopic.php47
-rw-r--r--Zotlabs/Module/Cal.php357
-rw-r--r--Zotlabs/Module/Channel.php (renamed from mod/channel.php)90
-rw-r--r--Zotlabs/Module/Chanview.php110
-rw-r--r--Zotlabs/Module/Chat.php261
-rw-r--r--Zotlabs/Module/Chatsvc.php168
-rw-r--r--Zotlabs/Module/Cloud.php110
-rw-r--r--Zotlabs/Module/Common.php73
-rw-r--r--Zotlabs/Module/Connect.php130
-rw-r--r--Zotlabs/Module/Connections.php324
-rw-r--r--Zotlabs/Module/Connedit.php763
-rw-r--r--Zotlabs/Module/Contactgroup.php54
-rw-r--r--Zotlabs/Module/Cover_photo.php423
-rw-r--r--Zotlabs/Module/Dav.php150
-rw-r--r--Zotlabs/Module/Directory.php425
-rw-r--r--Zotlabs/Module/Dirsearch.php462
-rw-r--r--Zotlabs/Module/Display.php346
-rw-r--r--Zotlabs/Module/Dreport.php145
-rw-r--r--Zotlabs/Module/Editblock.php198
-rw-r--r--Zotlabs/Module/Editlayout.php195
-rw-r--r--Zotlabs/Module/Editpost.php181
-rw-r--r--Zotlabs/Module/Editwebpage.php239
-rw-r--r--Zotlabs/Module/Events.php714
-rw-r--r--Zotlabs/Module/Fbrowser.php136
-rw-r--r--Zotlabs/Module/Feed.php48
-rw-r--r--Zotlabs/Module/Ffsapi.php71
-rw-r--r--Zotlabs/Module/Fhublocs.php85
-rw-r--r--Zotlabs/Module/Filer.php61
-rw-r--r--Zotlabs/Module/Filerm.php39
-rw-r--r--Zotlabs/Module/Filestorage.php173
-rw-r--r--Zotlabs/Module/Follow.php65
-rw-r--r--Zotlabs/Module/Fsuggest.php117
-rw-r--r--Zotlabs/Module/Getfile.php102
-rw-r--r--Zotlabs/Module/Group.php244
-rw-r--r--Zotlabs/Module/Hcard.php60
-rw-r--r--Zotlabs/Module/Help.php146
-rw-r--r--Zotlabs/Module/Home.php89
-rw-r--r--Zotlabs/Module/Hostxrd.php24
-rw-r--r--Zotlabs/Module/Id.php319
-rw-r--r--Zotlabs/Module/Impel.php207
-rw-r--r--Zotlabs/Module/Import.php553
-rw-r--r--Zotlabs/Module/Import_items.php129
-rw-r--r--Zotlabs/Module/Invite.php152
-rw-r--r--Zotlabs/Module/Item.php1265
-rw-r--r--Zotlabs/Module/Lang.php12
-rw-r--r--Zotlabs/Module/Layouts.php199
-rw-r--r--Zotlabs/Module/Like.php547
-rw-r--r--Zotlabs/Module/Linkinfo.php381
-rw-r--r--Zotlabs/Module/Lockview.php121
-rw-r--r--Zotlabs/Module/Locs.php132
-rw-r--r--Zotlabs/Module/Login.php13
-rw-r--r--Zotlabs/Module/Lostpass.php138
-rw-r--r--Zotlabs/Module/Magic.php173
-rw-r--r--Zotlabs/Module/Mail.php397
-rw-r--r--Zotlabs/Module/Manage.php181
-rw-r--r--Zotlabs/Module/Match.php84
-rw-r--r--Zotlabs/Module/Menu.php173
-rw-r--r--Zotlabs/Module/Message.php110
-rw-r--r--Zotlabs/Module/Mitem.php245
-rw-r--r--Zotlabs/Module/Mood.php146
-rw-r--r--Zotlabs/Module/Msearch.php47
-rw-r--r--Zotlabs/Module/Network.php531
-rw-r--r--Zotlabs/Module/New_channel.php151
-rw-r--r--Zotlabs/Module/Nojs.php15
-rw-r--r--Zotlabs/Module/Notes.php40
-rw-r--r--Zotlabs/Module/Notifications.php111
-rw-r--r--Zotlabs/Module/Notify.php69
-rw-r--r--Zotlabs/Module/Oembed.php36
-rw-r--r--Zotlabs/Module/Oep.php403
-rw-r--r--Zotlabs/Module/Oexchange.php77
-rw-r--r--Zotlabs/Module/Online.php17
-rw-r--r--Zotlabs/Module/Openid.php198
-rw-r--r--Zotlabs/Module/Opensearch.php24
-rw-r--r--Zotlabs/Module/Page.php150
-rw-r--r--Zotlabs/Module/Pconfig.php122
-rw-r--r--Zotlabs/Module/Pdledit.php72
-rw-r--r--Zotlabs/Module/Photo.php250
-rw-r--r--Zotlabs/Module/Photos.php1385
-rw-r--r--Zotlabs/Module/Ping.php497
-rw-r--r--Zotlabs/Module/Poco.php13
-rw-r--r--Zotlabs/Module/Poke.php194
-rw-r--r--Zotlabs/Module/Post.php36
-rw-r--r--Zotlabs/Module/Prate.php105
-rw-r--r--Zotlabs/Module/Pretheme.php28
-rw-r--r--Zotlabs/Module/Probe.php47
-rw-r--r--Zotlabs/Module/Profile.php90
-rw-r--r--Zotlabs/Module/Profile_photo.php436
-rw-r--r--Zotlabs/Module/Profiles.php796
-rw-r--r--Zotlabs/Module/Profperm.php172
-rw-r--r--Zotlabs/Module/Pubsites.php59
-rw-r--r--Zotlabs/Module/Pubstream.php168
-rw-r--r--Zotlabs/Module/Randprof.php18
-rw-r--r--Zotlabs/Module/Rate.php178
-rw-r--r--Zotlabs/Module/Ratings.php115
-rw-r--r--Zotlabs/Module/Ratingsearch.php76
-rw-r--r--Zotlabs/Module/Rbmark.php121
-rw-r--r--Zotlabs/Module/Regdir.php109
-rw-r--r--Zotlabs/Module/Register.php270
-rw-r--r--Zotlabs/Module/Regmod.php40
-rw-r--r--Zotlabs/Module/Regver.php28
-rw-r--r--Zotlabs/Module/Removeaccount.php72
-rw-r--r--Zotlabs/Module/Removeme.php72
-rw-r--r--Zotlabs/Module/Rmagic.php95
-rw-r--r--Zotlabs/Module/Rpost.php144
-rw-r--r--Zotlabs/Module/Rsd_xml.php17
-rw-r--r--Zotlabs/Module/Search.php228
-rw-r--r--Zotlabs/Module/Search_ac.php82
-rw-r--r--Zotlabs/Module/Service_limits.php28
-rw-r--r--Zotlabs/Module/Settings.php1150
-rw-r--r--Zotlabs/Module/Setup.php754
-rw-r--r--Zotlabs/Module/Share.php93
-rw-r--r--Zotlabs/Module/Sharedwithme.php113
-rw-r--r--Zotlabs/Module/Siteinfo.php94
-rw-r--r--Zotlabs/Module/Siteinfo_json.php14
-rw-r--r--Zotlabs/Module/Sitelist.php67
-rw-r--r--Zotlabs/Module/Smilies.php21
-rw-r--r--Zotlabs/Module/Sources.php173
-rw-r--r--Zotlabs/Module/Sslify.php30
-rw-r--r--Zotlabs/Module/Starred.php39
-rw-r--r--Zotlabs/Module/Subthread.php169
-rw-r--r--Zotlabs/Module/Suggest.php72
-rw-r--r--Zotlabs/Module/Tagger.php140
-rw-r--r--Zotlabs/Module/Tagrm.php147
-rw-r--r--Zotlabs/Module/Tasks.php112
-rw-r--r--Zotlabs/Module/Thing.php368
-rw-r--r--Zotlabs/Module/Toggle_mobile.php23
-rw-r--r--Zotlabs/Module/Toggle_safesearch.php31
-rw-r--r--Zotlabs/Module/Uexport.php71
-rw-r--r--Zotlabs/Module/Update_channel.php (renamed from mod/update_channel.php)11
-rw-r--r--Zotlabs/Module/Update_display.php48
-rw-r--r--Zotlabs/Module/Update_home.php42
-rw-r--r--Zotlabs/Module/Update_network.php44
-rw-r--r--Zotlabs/Module/Update_pubstream.php42
-rw-r--r--Zotlabs/Module/Update_search.php69
-rw-r--r--Zotlabs/Module/View.php20
-rw-r--r--Zotlabs/Module/Viewconnections.php117
-rw-r--r--Zotlabs/Module/Viewsrc.php53
-rw-r--r--Zotlabs/Module/Wall_attach.php55
-rw-r--r--Zotlabs/Module/Wall_upload.php57
-rw-r--r--Zotlabs/Module/Webfinger.php54
-rw-r--r--Zotlabs/Module/Webpages.php207
-rw-r--r--Zotlabs/Module/Well_known.php69
-rw-r--r--Zotlabs/Module/Wfinger.php140
-rw-r--r--Zotlabs/Module/Xchan.php47
-rw-r--r--Zotlabs/Module/Xpoco.php13
-rw-r--r--Zotlabs/Module/Xrd.php81
-rw-r--r--Zotlabs/Module/Xref.php26
-rw-r--r--Zotlabs/Module/Zfinger.php18
-rw-r--r--Zotlabs/Module/Zotfeed.php52
-rw-r--r--Zotlabs/Module/Zping.php33
-rw-r--r--Zotlabs/Web/CheckJS.php13
-rw-r--r--Zotlabs/Web/Controller.php12
-rw-r--r--Zotlabs/Web/Router.php117
-rwxr-xr-xboot.php21
-rw-r--r--doc/Webpages.md2
-rw-r--r--doc/context/channel/help.html24
-rw-r--r--doc/context/cloud/help.html22
-rw-r--r--doc/context/en/admin/security/help.html (renamed from doc/context/admin/security/help.html)0
-rw-r--r--doc/context/en/channel/help.html8
-rw-r--r--doc/context/en/cloud/help.html6
-rw-r--r--doc/context/en/mail/help.html (renamed from doc/context/mail/help.html)0
-rw-r--r--doc/context/en/network/help.html (renamed from doc/context/network/help.html)20
-rw-r--r--doc/context/en/photos/help.html6
-rw-r--r--doc/context/en/profile/help.html6
-rw-r--r--doc/context/photos/help.html22
-rw-r--r--doc/context/profile/help.html22
-rw-r--r--doc/hidden_configs.bb115
-rw-r--r--doc/hooklist.bb35
-rw-r--r--doc/plugins.bb92
-rw-r--r--doc/webpages.bb2
-rw-r--r--include/api.php39
-rw-r--r--include/bb2diaspora.php34
-rw-r--r--include/bbcode.php44
-rw-r--r--include/config.php157
-rwxr-xr-xinclude/dba/dba_mysqli.php18
-rw-r--r--include/help.php150
-rw-r--r--include/import.php30
-rwxr-xr-xinclude/importdoc.php2
-rwxr-xr-xinclude/items.php163
-rw-r--r--include/nav.php19
-rw-r--r--include/network.php5
-rw-r--r--include/notifier.php21
-rw-r--r--include/photos.php40
-rwxr-xr-xinclude/plugin.php57
-rw-r--r--include/text.php29
-rw-r--r--include/zot.php13
-rw-r--r--install/schema_mysql.sql4
-rw-r--r--install/schema_postgres.sql2
-rw-r--r--install/update.php15
-rw-r--r--library/Smarty/NEW_FEATURES.txt8
-rw-r--r--library/Smarty/change_log.txt42
-rw-r--r--library/Smarty/libs/Smarty.class.php25
-rw-r--r--library/Smarty/libs/sysplugins/smarty_cacheresource.php9
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_compile_block.php2
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_compile_capture.php9
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_compile_foreach.php12
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_compile_private_foreachsection.php11
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_compile_private_special_variable.php37
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_compile_section.php4
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_data.php15
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_extension_clear.php8
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_method_clearallcache.php5
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_method_clearcache.php5
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_method_clearcompiledtemplate.php16
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_method_configload.php2
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_resource_extends.php13
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_runtime_codeframe.php2
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_runtime_foreach.php3
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_runtime_inheritance.php70
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_runtime_tplfunction.php2
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_runtime_updatecache.php16
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_runtime_updatescope.php2
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_runtime_validatecompiled.php9
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_runtime_var.php2
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_templatecompilerbase.php252
-rw-r--r--library/Smarty/libs/sysplugins/smarty_internal_templateparser.php2110
-rw-r--r--library/Smarty/libs/sysplugins/smarty_resource.php10
-rw-r--r--library/Smarty/libs/sysplugins/smarty_template_resource_base.php7
-rw-r--r--library/jquery-textcomplete/jquery.textcomplete.js583
-rw-r--r--library/jquery-textcomplete/jquery.textcomplete.min.js3
-rw-r--r--mod/_well_known.php64
-rw-r--r--mod/achievements.php87
-rw-r--r--mod/acl.php308
-rw-r--r--mod/admin.php1776
-rw-r--r--mod/api.php115
-rw-r--r--mod/appman.php102
-rw-r--r--mod/apps.php40
-rw-r--r--mod/attach.php55
-rw-r--r--mod/authtest.php54
-rw-r--r--mod/block.php86
-rw-r--r--mod/blocks.php166
-rw-r--r--mod/bookmarks.php99
-rw-r--r--mod/branchtopic.php41
-rwxr-xr-xmod/cal.php351
-rw-r--r--mod/chanview.php104
-rw-r--r--mod/chat.php255
-rw-r--r--mod/chatsvc.php162
-rw-r--r--mod/cloud.php104
-rw-r--r--mod/common.php67
-rw-r--r--mod/connect.php125
-rw-r--r--mod/connections.php318
-rw-r--r--mod/connedit.php756
-rw-r--r--mod/contactgroup.php49
-rw-r--r--mod/cover_photo.php417
-rw-r--r--mod/dav.php142
-rw-r--r--mod/directory.php419
-rw-r--r--mod/dirsearch.php456
-rw-r--r--mod/display.php340
-rw-r--r--mod/dreport.php139
-rw-r--r--mod/editblock.php192
-rw-r--r--mod/editlayout.php189
-rw-r--r--mod/editpost.php175
-rw-r--r--mod/editwebpage.php233
-rwxr-xr-xmod/events.php708
-rw-r--r--mod/fbrowser.php123
-rw-r--r--mod/feed.php42
-rw-r--r--mod/ffsapi.php65
-rw-r--r--mod/fhublocs.php80
-rw-r--r--mod/filer.php55
-rw-r--r--mod/filerm.php33
-rw-r--r--mod/filestorage.php167
-rw-r--r--mod/follow.php60
-rw-r--r--mod/fsuggest.php112
-rw-r--r--mod/getfile.php97
-rw-r--r--mod/group.php238
-rw-r--r--mod/hcard.php54
-rw-r--r--mod/help.php281
-rw-r--r--mod/home.php83
-rw-r--r--mod/hostxrd.php18
-rw-r--r--mod/id.php310
-rw-r--r--mod/impel.php201
-rw-r--r--mod/import.php547
-rw-r--r--mod/import_items.php123
-rw-r--r--mod/invite.php146
-rw-r--r--mod/item.php1262
-rw-r--r--mod/lang.php6
-rw-r--r--mod/layouts.php193
-rwxr-xr-xmod/like.php541
-rw-r--r--mod/linkinfo.php371
-rw-r--r--mod/lockview.php115
-rw-r--r--mod/locs.php126
-rw-r--r--mod/login.php7
-rw-r--r--mod/lostpass.php132
-rw-r--r--mod/magic.php167
-rw-r--r--mod/mail.php391
-rw-r--r--mod/manage.php175
-rw-r--r--mod/match.php78
-rw-r--r--mod/menu.php167
-rw-r--r--mod/message.php104
-rw-r--r--mod/mitem.php239
-rwxr-xr-xmod/mood.php140
-rw-r--r--mod/msearch.php42
-rw-r--r--mod/network.php525
-rw-r--r--mod/new_channel.php145
-rw-r--r--mod/nojs.php10
-rw-r--r--mod/notes.php34
-rw-r--r--mod/notifications.php105
-rw-r--r--mod/notify.php64
-rw-r--r--mod/oembed.php30
-rw-r--r--mod/oep.php398
-rw-r--r--mod/oexchange.php71
-rw-r--r--mod/online.php11
-rw-r--r--mod/openid.php192
-rw-r--r--mod/opensearch.php18
-rw-r--r--mod/page.php144
-rwxr-xr-xmod/pconfig.php113
-rw-r--r--mod/pdledit.php66
-rw-r--r--mod/photo.php244
-rw-r--r--mod/photos.php1378
-rw-r--r--mod/ping.php491
-rw-r--r--mod/poco.php7
-rwxr-xr-xmod/poke.php189
-rw-r--r--mod/post.php30
-rw-r--r--mod/prate.php99
-rw-r--r--mod/pretheme.php22
-rw-r--r--mod/probe.php41
-rw-r--r--mod/profile.php84
-rw-r--r--mod/profile_photo.php467
-rw-r--r--mod/profiles.php789
-rw-r--r--mod/profperm.php165
-rw-r--r--mod/public.php163
-rw-r--r--mod/pubsites.php53
-rw-r--r--mod/randprof.php12
-rw-r--r--mod/rate.php173
-rw-r--r--mod/ratings.php110
-rw-r--r--mod/ratingsearch.php70
-rw-r--r--mod/rbmark.php115
-rw-r--r--mod/regdir.php104
-rw-r--r--mod/register.php264
-rw-r--r--mod/regmod.php34
-rw-r--r--mod/regver.php22
-rw-r--r--mod/removeaccount.php66
-rw-r--r--mod/removeme.php66
-rw-r--r--mod/rmagic.php90
-rw-r--r--mod/rpost.php138
-rw-r--r--mod/rsd_xml.php24
-rw-r--r--mod/search.php222
-rw-r--r--mod/search_ac.php76
-rw-r--r--mod/service_limits.php23
-rw-r--r--mod/settings.php1144
-rwxr-xr-xmod/setup.php744
-rw-r--r--mod/share.php87
-rw-r--r--mod/sharedwithme.php107
-rw-r--r--mod/siteinfo.php88
-rw-r--r--mod/siteinfo_json.php8
-rw-r--r--mod/sitelist.php62
-rw-r--r--mod/smilies.php15
-rw-r--r--mod/sources.php168
-rw-r--r--mod/sslify.php24
-rw-r--r--mod/starred.php33
-rwxr-xr-xmod/subthread.php163
-rw-r--r--mod/suggest.php66
-rw-r--r--mod/tagger.php134
-rw-r--r--mod/tagrm.php141
-rw-r--r--mod/tasks.php107
-rw-r--r--mod/thing.php362
-rw-r--r--mod/toggle_mobile.php17
-rw-r--r--mod/toggle_safesearch.php25
-rw-r--r--mod/uexport.php65
-rw-r--r--mod/update_display.php42
-rw-r--r--mod/update_home.php38
-rw-r--r--mod/update_network.php40
-rw-r--r--mod/update_public.php37
-rw-r--r--mod/update_search.php66
-rw-r--r--mod/view.php15
-rw-r--r--mod/viewconnections.php111
-rw-r--r--mod/viewsrc.php47
-rw-r--r--mod/wall_attach.php49
-rw-r--r--mod/wall_upload.php51
-rw-r--r--mod/webfinger.php48
-rw-r--r--mod/webpages.php201
-rw-r--r--mod/wfinger.php134
-rw-r--r--mod/xchan.php41
-rw-r--r--mod/xpoco.php7
-rw-r--r--mod/xrd.php75
-rw-r--r--mod/xref.php20
-rw-r--r--mod/zfinger.php12
-rw-r--r--mod/zotfeed.php46
-rw-r--r--mod/zping.php28
-rwxr-xr-xutil/config45
-rwxr-xr-xutil/importdoc2
-rwxr-xr-xutil/pconfig54
-rw-r--r--util/typo.php12
-rw-r--r--view/es-es/hmessages.po12681
-rw-r--r--view/es-es/hstrings.php2834
-rw-r--r--view/js/autocomplete.js2
-rw-r--r--view/js/main.js36
-rw-r--r--view/nl/hmessages.po12681
-rw-r--r--view/nl/hstrings.php2834
-rw-r--r--view/php/theme_init.php2
-rw-r--r--view/theme/redbasic/css/narrow_navbar.css13
-rw-r--r--view/theme/redbasic/css/style.css55
-rw-r--r--view/theme/redbasic/js/redbasic.js12
-rw-r--r--view/theme/redbasic/schema/bluegrid.css15
-rw-r--r--view/theme/redbasic/schema/dark.css11
-rw-r--r--view/theme/redbasic/schema/simple_black_on_white.css10
-rw-r--r--view/theme/redbasic/schema/simple_green_on_black.css10
-rw-r--r--view/theme/redbasic/schema/simple_white_on_black.css10
-rwxr-xr-xview/tpl/abook_edit.tpl24
-rwxr-xr-xview/tpl/admin_site.tpl1
-rwxr-xr-xview/tpl/head.tpl1
-rwxr-xr-xview/tpl/jot.tpl8
-rwxr-xr-xview/tpl/nav.tpl375
-rwxr-xr-xview/tpl/photo_view.tpl2
-rwxr-xr-xview/tpl/profile_edit.tpl2
-rw-r--r--view/tpl/rsd.tpl15
418 files changed, 47971 insertions, 45826 deletions
diff --git a/Zotlabs/Extend/Hook.php b/Zotlabs/Extend/Hook.php
new file mode 100644
index 000000000..edfacfa3b
--- /dev/null
+++ b/Zotlabs/Extend/Hook.php
@@ -0,0 +1,86 @@
+<?php
+
+namespace Zotlabs\Extend;
+
+
+class Hook {
+
+ static public function register($hook,$file,$function,$version = 1,$priority = 0) {
+ if(is_array($function)) {
+ $function = serialize($function);
+ }
+
+ $r = q("SELECT * FROM `hook` WHERE `hook` = '%s' AND `file` = '%s' AND `function` = '%s' and priority = %d and hook_version = %d LIMIT 1",
+ dbesc($hook),
+ dbesc($file),
+ dbesc($function),
+ intval($priority),
+ intval($version)
+ );
+ if($r)
+ return true;
+
+ $r = q("INSERT INTO `hook` (`hook`, `file`, `function`, `priority`, `hook_version`) VALUES ( '%s', '%s', '%s', %d, %d )",
+ dbesc($hook),
+ dbesc($file),
+ dbesc($function),
+ intval($priority),
+ intval($version)
+ );
+
+ return $r;
+ }
+
+ static public function unregister($hook,$file,$function,$version = 1,$priority = 0) {
+ if(is_array($function)) {
+ $function = serialize($function);
+ }
+ $r = q("DELETE FROM hook WHERE hook = '%s' AND `file` = '%s' AND `function` = '%s' and priority = %d and hook_version = %d",
+ dbesc($hook),
+ dbesc($file),
+ dbesc($function),
+ intval($priority),
+ intval($version)
+ );
+
+ return $r;
+ }
+
+
+ /**
+ * @brief Inserts a hook into a page request.
+ *
+ * Insert a short-lived hook into the running page request.
+ * Hooks are normally persistent so that they can be called
+ * across asynchronous processes such as delivery and poll
+ * processes.
+ *
+ * insert_hook lets you attach a hook callback immediately
+ * which will not persist beyond the life of this page request
+ * or the current process.
+ *
+ * @param string $hook
+ * name of hook to attach callback
+ * @param string $fn
+ * function name of callback handler
+ * @param int $version
+ * hook interface version, 0 uses two callback params, 1 uses one callback param
+ * @param int $priority
+ * currently not implemented in this function, would require the hook array to be resorted
+ */
+
+ static public function insert($hook, $fn, $version = 0, $priority = 0) {
+ if(is_array($fn)) {
+ $fn = serialize($fn);
+ }
+
+ if(! is_array(App::$hooks))
+ App::$hooks = array();
+
+ if(! array_key_exists($hook, App::$hooks))
+ App::$hooks[$hook] = array();
+
+ App::$hooks[$hook][] = array('', $fn, $priority, $version);
+ }
+
+} \ No newline at end of file
diff --git a/Zotlabs/Module/Achievements.php b/Zotlabs/Module/Achievements.php
new file mode 100644
index 000000000..8ddefb3e5
--- /dev/null
+++ b/Zotlabs/Module/Achievements.php
@@ -0,0 +1,93 @@
+<?php
+namespace Zotlabs\Module;
+
+
+class Achievements extends \Zotlabs\Web\Controller {
+
+ function get() {
+ // This doesn't work, so
+ if (! is_developer())
+ return;
+
+ if(argc() > 1)
+ $which = argv(1);
+ else {
+ notice( t('Requested profile is not available.') . EOL );
+ return;
+ }
+
+ $profile = 0;
+ $profile = argv(1);
+ profile_load($a,$which,$profile);
+
+ $r = q("select channel_id from channel where channel_address = '%s'",
+ dbesc($which)
+ );
+ if($r) {
+ $owner = intval($r[0]['channel_id']);
+ }
+
+ $observer = \App::get_observer();
+ $ob_hash = (($observer) ? $observer['xchan_hash'] : '');
+ $perms = get_all_perms($owner,$ob_hash);
+ if(! $perms['view_profile']) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ $newmembertext = t('Some blurb about what to do when you\'re new here');
+
+
+ // By default, all badges are false
+ $contactbadge = false;
+ $profilebadge = false;
+ $keywordsbadge = false;
+
+ // Check number of contacts. Award a badge if over 10
+ // We'll figure these out on each page load instead of
+ // writing them to the DB because that will mean one needs
+ // to retain their achievements - eg, you can't add
+ // a bunch of channels just to get your badge, and then
+ // delete them all again. If these become popular or
+ // used in profiles or something, we may need to reconsider
+ // and add a table for this - because this won't scale.
+
+ $r = q("select * from abook where abook_channel = %d",
+ intval($owner)
+ );
+
+ if (count($r))
+ $contacts = count($r);
+ // We're checking for 11 to adjust for the abook record for self
+ if ($contacts >= 11)
+ $contactbadge = true;
+
+ // Check if an about field in the profile has been created.
+
+ $r = q("select * from profile where uid = %d and about <> ''",
+ intval($owner)
+ );
+
+ if ($r)
+ $profilebadge = 1;
+
+ // Check if keywords have been set
+
+ $r = q("select * from profile where uid = %d and keywords <> ''",
+ intval($owner)
+ );
+
+ if($r)
+ $keywordsbadge = 1;
+
+ return replace_macros(get_markup_template("achievements.tpl"), array(
+ '$newmembertext' => $newmembertext,
+ '$profilebadge' => $profilebadge,
+ '$contactbadge' => $contactbadge,
+ '$keywordsbadge' => $keywordsbadge,
+ '$channelsbadge' => $channelsbadge
+ ));
+
+ }
+
+}
diff --git a/Zotlabs/Module/Acl.php b/Zotlabs/Module/Acl.php
new file mode 100644
index 000000000..5c14ab599
--- /dev/null
+++ b/Zotlabs/Module/Acl.php
@@ -0,0 +1,314 @@
+<?php
+namespace Zotlabs\Module;
+
+/* ACL selector json backend */
+require_once("include/acl_selectors.php");
+require_once("include/group.php");
+
+
+class Acl extends \Zotlabs\Web\Controller {
+
+ function init(){
+
+ // logger('mod_acl: ' . print_r($_REQUEST,true));
+
+ $start = (x($_REQUEST,'start')?$_REQUEST['start']:0);
+ $count = (x($_REQUEST,'count')?$_REQUEST['count']:100);
+ $search = (x($_REQUEST,'search')?$_REQUEST['search']:"");
+ $type = (x($_REQUEST,'type')?$_REQUEST['type']:"");
+ $noforums = (x($_REQUEST,'n') ? $_REQUEST['n'] : false);
+
+ // List of channels whose connections to also suggest, e.g. currently viewed channel or channels mentioned in a post
+ $extra_channels = (x($_REQUEST,'extra_channels') ? $_REQUEST['extra_channels'] : array());
+
+ // For use with jquery.autocomplete for private mail completion
+
+ if(x($_REQUEST,'query') && strlen($_REQUEST['query'])) {
+ if(! $type)
+ $type = 'm';
+ $search = $_REQUEST['query'];
+ }
+
+ if(!(local_channel()))
+ if(!($type == 'x' || $type == 'c'))
+ killme();
+
+ if ($search != "") {
+ $sql_extra = " AND `name` LIKE " . protect_sprintf( "'%" . dbesc($search) . "%'" ) . " ";
+ $sql_extra2 = "AND ( xchan_name LIKE " . protect_sprintf( "'%" . dbesc($search) . "%'" ) . " OR xchan_addr LIKE " . protect_sprintf( "'%" . dbesc($search) . ((strpos($search,'@') === false) ? "%@%'" : "%'")) . ") ";
+
+ // This horrible mess is needed because position also returns 0 if nothing is found. W/ould be MUCH easier if it instead returned a very large value
+ // Otherwise we could just order by LEAST(POSITION($search IN xchan_name),POSITION($search IN xchan_addr)).
+ $order_extra2 = "CASE WHEN xchan_name LIKE " . protect_sprintf( "'%" . dbesc($search) . "%'" ) ." then POSITION('".dbesc($search)."' IN xchan_name) else position('".dbesc($search)."' IN xchan_addr) end, ";
+ $col = ((strpos($search,'@') !== false) ? 'xchan_addr' : 'xchan_name' );
+ $sql_extra3 = "AND $col like " . protect_sprintf( "'%" . dbesc($search) . "%'" ) . " ";
+
+ } else {
+ $sql_extra = $sql_extra2 = $sql_extra3 = "";
+ }
+
+
+ $groups = array();
+ $contacts = array();
+
+ if ($type=='' || $type=='g'){
+
+ $r = q("SELECT `groups`.`id`, `groups`.`hash`, `groups`.`name`
+ FROM `groups`,`group_member`
+ WHERE `groups`.`deleted` = 0 AND `groups`.`uid` = %d
+ AND `group_member`.`gid`=`groups`.`id`
+ $sql_extra
+ GROUP BY `groups`.`id`
+ ORDER BY `groups`.`name`
+ LIMIT %d OFFSET %d",
+ intval(local_channel()),
+ intval($count),
+ intval($start)
+ );
+
+ foreach($r as $g){
+ // logger('acl: group: ' . $g['name'] . ' members: ' . group_get_members_xchan($g['id']));
+ $groups[] = array(
+ "type" => "g",
+ "photo" => "images/twopeople.png",
+ "name" => $g['name'],
+ "id" => $g['id'],
+ "xid" => $g['hash'],
+ "uids" => group_get_members_xchan($g['id']),
+ "link" => ''
+ );
+ }
+ }
+
+ if ($type=='' || $type=='c') {
+ $extra_channels_sql = '';
+ // Only include channels who allow the observer to view their permissions
+ foreach($extra_channels as $channel) {
+ if(perm_is_allowed(intval($channel), get_observer_hash(),'view_contacts'))
+ $extra_channels_sql .= "," . intval($channel);
+ }
+
+ $extra_channels_sql = substr($extra_channels_sql,1); // Remove initial comma
+
+ // Getting info from the abook is better for local users because it contains info about permissions
+ if(local_channel()) {
+ if($extra_channels_sql != '')
+ $extra_channels_sql = " OR (abook_channel IN ($extra_channels_sql)) and abook_hidden = 0 ";
+
+ $r = q("SELECT abook_id as id, xchan_hash as hash, xchan_name as name, xchan_photo_s as micro, xchan_url as url, xchan_addr as nick, abook_their_perms, abook_flags, abook_self
+ FROM abook left join xchan on abook_xchan = xchan_hash
+ WHERE (abook_channel = %d $extra_channels_sql) AND abook_blocked = 0 and abook_pending = 0 and xchan_deleted = 0 $sql_extra2 order by $order_extra2 xchan_name asc" ,
+ intval(local_channel())
+ );
+
+ }
+ else { // Visitors
+ $r = q("SELECT xchan_hash as id, xchan_hash as hash, xchan_name as name, xchan_photo_s as micro, xchan_url as url, xchan_addr as nick, 0 as abook_their_perms, 0 as abook_flags, 0 as abook_self
+ FROM xchan left join xlink on xlink_link = xchan_hash
+ WHERE xlink_xchan = '%s' AND xchan_deleted = 0 $sql_extra2 order by $order_extra2 xchan_name asc" ,
+ dbesc(get_observer_hash())
+ );
+
+ // Find contacts of extra channels
+ // This is probably more complicated than it needs to be
+ if($extra_channels_sql) {
+ // Build a list of hashes that we got previously so we don't get them again
+ $known_hashes = array("'".get_observer_hash()."'");
+ if($r)
+ foreach($r as $rr)
+ $known_hashes[] = "'".$rr['hash']."'";
+ $known_hashes_sql = 'AND xchan_hash not in ('.join(',',$known_hashes).')';
+
+ $r2 = q("SELECT abook_id as id, xchan_hash as hash, xchan_name as name, xchan_photo_s as micro, xchan_url as url, xchan_addr as nick, abook_their_perms, abook_flags, abook_self
+ FROM abook left join xchan on abook_xchan = xchan_hash
+ WHERE abook_channel IN ($extra_channels_sql) $known_hashes_sql AND abook_blocked = 0 and abook_pending = 0 and abook_hidden = 0 and xchan_deleted = 0 $sql_extra2 order by $order_extra2 xchan_name asc");
+ if($r2)
+ $r = array_merge($r,$r2);
+
+ // Sort accoring to match position, then alphabetically. This could be avoided if the above two SQL queries could be combined into one, and the sorting could be done on the SQl server (like in the case of a local user)
+ $matchpos = function($x) use($search) {
+ $namepos = strpos($x['name'],$search);
+ $nickpos = strpos($x['nick'],$search);
+ // Use a large position if not found
+ return min($namepos === false ? 9999 : $namepos, $nickpos === false ? 9999 : $nickpos);
+ };
+ // This could be made simpler if PHP supported stable sorting
+ usort($r,function($a,$b) use($matchpos) {
+ $pos1 = $matchpos($a);
+ $pos2 = $matchpos($b);
+ if($pos1 == $pos2) { // Order alphabetically if match position is the same
+ if($a['name'] == $b['name'])
+ return 0;
+ else
+ return ($a['name'] < $b['name']) ? -1 : 1;
+ }
+ return ($pos1 < $pos2) ? -1 : 1;
+ });
+ }
+ }
+ if(intval(get_config('system','taganyone')) || intval(get_pconfig(local_channel(),'system','taganyone'))) {
+ if((count($r) < 100) && $type == 'c') {
+ $r2 = q("SELECT substr(xchan_hash,1,18) as id, xchan_hash as hash, xchan_name as name, xchan_photo_s as micro, xchan_url as url, xchan_addr as nick, 0 as abook_their_perms, 0 as abook_flags, 0 as abook_self
+ FROM xchan
+ WHERE xchan_deleted = 0 $sql_extra2 order by $order_extra2 xchan_name asc"
+ );
+ if($r2)
+ $r = array_merge($r,$r2);
+ }
+ }
+ }
+ elseif($type == 'm') {
+
+ $r = q("SELECT xchan_hash as id, xchan_name as name, xchan_addr as nick, xchan_photo_s as micro, xchan_url as url
+ FROM abook left join xchan on abook_xchan = xchan_hash
+ WHERE abook_channel = %d and ( (abook_their_perms = null) or (abook_their_perms & %d )>0)
+ and xchan_deleted = 0
+ $sql_extra3
+ ORDER BY `xchan_name` ASC ",
+ intval(local_channel()),
+ intval(PERMS_W_MAIL)
+ );
+ }
+ elseif(($type == 'a') || ($type == 'p')) {
+
+ $r = q("SELECT abook_id as id, xchan_name as name, xchan_hash as hash, xchan_addr as nick, xchan_photo_s as micro, xchan_network as network, xchan_url as url, xchan_addr as attag , abook_their_perms FROM abook left join xchan on abook_xchan = xchan_hash
+ WHERE abook_channel = %d
+ and xchan_deleted = 0
+ $sql_extra3
+ ORDER BY xchan_name ASC ",
+ intval(local_channel())
+ );
+
+ }
+ elseif($type == 'x') {
+ $r = $this->navbar_complete($a);
+ $contacts = array();
+ if($r) {
+ foreach($r as $g) {
+ $contacts[] = array(
+ "photo" => $g['photo'],
+ "name" => $g['name'],
+ "nick" => $g['address'],
+ );
+ }
+ }
+
+ $o = array(
+ 'start' => $start,
+ 'count' => $count,
+ 'items' => $contacts,
+ );
+ echo json_encode($o);
+ killme();
+ }
+ else
+ $r = array();
+
+ if(count($r)) {
+ foreach($r as $g){
+
+ // remove RSS feeds from ACLs - they are inaccessible
+ if(strpos($g['hash'],'/') && $type != 'a')
+ continue;
+
+ if(($g['abook_their_perms'] & PERMS_W_TAGWALL) && $type == 'c' && (! $noforums)) {
+ $contacts[] = array(
+ "type" => "c",
+ "photo" => "images/twopeople.png",
+ "name" => $g['name'] . '+',
+ "id" => $g['id'] . '+',
+ "xid" => $g['hash'],
+ "link" => $g['nick'],
+ "nick" => substr($g['nick'],0,strpos($g['nick'],'@')),
+ "self" => (intval($g['abook_self']) ? 'abook-self' : ''),
+ "taggable" => 'taggable',
+ "label" => t('network')
+ );
+ }
+ $contacts[] = array(
+ "type" => "c",
+ "photo" => $g['micro'],
+ "name" => $g['name'],
+ "id" => $g['id'],
+ "xid" => $g['hash'],
+ "link" => $g['nick'],
+ "nick" => (($g['nick']) ? substr($g['nick'],0,strpos($g['nick'],'@')) : t('RSS')),
+ "self" => (intval($g['abook_self']) ? 'abook-self' : ''),
+ "taggable" => '',
+ "label" => '',
+ );
+ }
+ }
+
+ $items = array_merge($groups, $contacts);
+
+ $o = array(
+ 'start' => $start,
+ 'count' => $count,
+ 'items' => $items,
+ );
+
+
+
+ echo json_encode($o);
+
+ killme();
+ }
+
+
+ function navbar_complete(&$a) {
+
+ // logger('navbar_complete');
+
+ if((get_config('system','block_public')) && (! local_channel()) && (! remote_channel())) {
+ return;
+ }
+
+ $dirmode = intval(get_config('system','directory_mode'));
+ $search = ((x($_REQUEST,'search')) ? htmlentities($_REQUEST['search'],ENT_COMPAT,'UTF-8',false) : '');
+ if(! $search || mb_strlen($search) < 2)
+ return array();
+
+ $star = false;
+ $address = false;
+
+ if(substr($search,0,1) === '@')
+ $search = substr($search,1);
+
+ if(substr($search,0,1) === '*') {
+ $star = true;
+ $search = substr($search,1);
+ }
+
+ if(strpos($search,'@') !== false) {
+ $address = true;
+ }
+
+ if(($dirmode == DIRECTORY_MODE_PRIMARY) || ($dirmode == DIRECTORY_MODE_STANDALONE)) {
+ $url = z_root() . '/dirsearch';
+ }
+
+ if(! $url) {
+ require_once("include/dir_fns.php");
+ $directory = find_upstream_directory($dirmode);
+ $url = $directory['url'] . '/dirsearch';
+ }
+
+ $count = (x($_REQUEST,'count')?$_REQUEST['count']:100);
+ if($url) {
+ $query = $url . '?f=' ;
+ $query .= '&name=' . urlencode($search) . "&limit=$count" . (($address) ? '&address=' . urlencode($search) : '');
+
+ $x = z_fetch_url($query);
+ if($x['success']) {
+ $t = 0;
+ $j = json_decode($x['body'],true);
+ if($j && $j['results']) {
+ return $j['results'];
+ }
+ }
+ }
+ return array();
+ }
+
+}
diff --git a/Zotlabs/Module/Admin.php b/Zotlabs/Module/Admin.php
new file mode 100644
index 000000000..1ff9065cd
--- /dev/null
+++ b/Zotlabs/Module/Admin.php
@@ -0,0 +1,1786 @@
+<?php
+namespace Zotlabs\Module;
+/**
+ * @file mod/admin.php
+ * @brief Hubzilla's admin controller.
+ *
+ * Controller for the /admin/ area.
+ */
+
+require_once('include/queue_fn.php');
+require_once('include/account.php');
+
+/**
+ * @param App &$a
+ */
+
+class Admin extends \Zotlabs\Web\Controller {
+
+ function post(){
+ logger('admin_post', LOGGER_DEBUG);
+
+ if(! is_site_admin()) {
+ return;
+ }
+
+ // urls
+ if (argc() > 1) {
+ switch (argv(1)) {
+ case 'site':
+ $this->admin_page_site_post($a);
+ break;
+ case 'users':
+ $this->admin_page_users_post($a);
+ break;
+ case 'channels':
+ $this->admin_page_channels_post($a);
+ break;
+ case 'plugins':
+ if (argc() > 2 &&
+ is_file("addon/" . argv(2) . "/" . argv(2) . ".php")){
+ @include_once("addon/" . argv(2) . "/" . argv(2) . ".php");
+ if(function_exists(argv(2).'_plugin_admin_post')) {
+ $func = argv(2) . '_plugin_admin_post';
+ $func($a);
+ }
+ }
+ goaway(z_root() . '/admin/plugins/' . argv(2) );
+ break;
+ case 'themes':
+ $theme = argv(2);
+ if (is_file("view/theme/$theme/php/config.php")){
+ require_once("view/theme/$theme/php/config.php");
+ // fixme add parent theme if derived
+ if (function_exists("theme_admin_post")){
+ theme_admin_post($a);
+ }
+ }
+ info(t('Theme settings updated.'));
+ if(is_ajax()) return;
+
+ goaway(z_root() . '/admin/themes/' . $theme );
+ break;
+ case 'logs':
+ $this->admin_page_logs_post($a);
+ break;
+ case 'hubloc':
+ $this->admin_page_hubloc_post($a);
+ break;
+ case 'security':
+ $this->admin_page_security_post($a);
+ break;
+ case 'features':
+ $this->admin_page_features_post($a);
+ break;
+ case 'dbsync':
+ $this->admin_page_dbsync_post($a);
+ break;
+ case 'profs':
+ $this->admin_page_profs_post($a);
+ break;
+ }
+ }
+
+ goaway(z_root() . '/admin' );
+ }
+
+ /**
+ * @param App &$a
+ * @return string
+ */
+ function get() {
+
+ logger('admin_content', LOGGER_DEBUG);
+
+ if(! is_site_admin()) {
+ return login(false);
+ }
+
+
+ /*
+ * Page content
+ */
+ $o = '';
+
+ // urls
+ if (argc() > 1){
+ switch (argv(1)) {
+ case 'site':
+ $o = $this->admin_page_site($a);
+ break;
+ case 'users':
+ $o = $this->admin_page_users($a);
+ break;
+ case 'channels':
+ $o = $this->admin_page_channels($a);
+ break;
+ case 'plugins':
+ $o = $this->admin_page_plugins($a);
+ break;
+ case 'themes':
+ $o = $this->admin_page_themes($a);
+ break;
+ // case 'hubloc':
+ // $o = $this->admin_page_hubloc($a);
+ // break;
+ case 'security':
+ $o = $this->admin_page_security($a);
+ break;
+ case 'features':
+ $o = $this->admin_page_features($a);
+ break;
+ case 'logs':
+ $o = $this->admin_page_logs($a);
+ break;
+ case 'dbsync':
+ $o = $this->admin_page_dbsync($a);
+ break;
+ case 'profs':
+ $o = $this->admin_page_profs($a);
+ break;
+ case 'queue':
+ $o = $this->admin_page_queue($a);
+ break;
+ default:
+ notice( t('Item not found.') );
+ }
+ } else {
+ $o = $this->admin_page_summary($a);
+ }
+
+ if(is_ajax()) {
+ echo $o;
+ killme();
+ return '';
+ } else {
+ return $o;
+ }
+ }
+
+
+ /**
+ * @brief Returns content for Admin Summary Page.
+ *
+ * @param App &$a
+ * @return string HTML from parsed admin_summary.tpl
+ */
+ function admin_page_summary(&$a) {
+
+ // list total user accounts, expirations etc.
+ $accounts = array();
+ $r = q("SELECT COUNT(*) AS total, COUNT(CASE WHEN account_expires > %s THEN 1 ELSE NULL END) AS expiring, COUNT(CASE WHEN account_expires < %s AND account_expires != '%s' THEN 1 ELSE NULL END) AS expired, COUNT(CASE WHEN (account_flags & %d)>0 THEN 1 ELSE NULL END) AS blocked FROM account",
+ db_utcnow(),
+ db_utcnow(),
+ dbesc(NULL_DATE),
+ intval(ACCOUNT_BLOCKED)
+ );
+ if ($r) {
+ $accounts['total'] = array('label' => t('# Accounts'), 'val' => $r[0]['total']);
+ $accounts['blocked'] = array('label' => t('# blocked accounts'), 'val' => $r[0]['blocked']);
+ $accounts['expired'] = array('label' => t('# expired accounts'), 'val' => $r[0]['expired']);
+ $accounts['expiring'] = array('label' => t('# expiring accounts'), 'val' => $r[0]['expiring']);
+ }
+
+ // pending registrations
+ $r = q("SELECT COUNT(id) AS `count` FROM `register` WHERE `uid` != '0'");
+ $pending = $r[0]['count'];
+
+ // available channels, primary and clones
+ $channels = array();
+ $r = q("SELECT COUNT(*) AS total, COUNT(CASE WHEN channel_primary = 1 THEN 1 ELSE NULL END) AS main, COUNT(CASE WHEN channel_primary = 0 THEN 1 ELSE NULL END) AS clones FROM channel WHERE channel_removed = 0");
+ if ($r) {
+ $channels['total'] = array('label' => t('# Channels'), 'val' => $r[0]['total']);
+ $channels['main'] = array('label' => t('# primary'), 'val' => $r[0]['main']);
+ $channels['clones'] = array('label' => t('# clones'), 'val' => $r[0]['clones']);
+ }
+
+ // We can do better, but this is a quick queue status
+ $r = q("SELECT COUNT(outq_delivered) AS total FROM outq WHERE outq_delivered = 0");
+ $queue = (($r) ? $r[0]['total'] : 0);
+ $queues = array( 'label' => t('Message queues'), 'queue' => $queue );
+
+ // If no plugins active return 0, otherwise list of plugin names
+ $plugins = (count(\App::$plugins) == 0) ? count(\App::$plugins) : \App::$plugins;
+
+ // Could be extended to provide also other alerts to the admin
+ $alertmsg = '';
+ // annoy admin about upcoming unsupported PHP version
+ if (version_compare(PHP_VERSION, '5.4', '<')) {
+ $alertmsg = 'Your PHP version ' . PHP_VERSION . ' will not be supported with the next major release of $Projectname. You are strongly urged to upgrade to a current version.'
+ . '<br>PHP 5.3 has reached its <a href="http://php.net/eol.php" class="alert-link">End of Life (EOL)</a> in August 2014.'
+ . ' A list about current PHP versions can be found <a href="http://php.net/supported-versions.php" class="alert-link">here</a>.';
+ }
+
+ $t = get_markup_template('admin_summary.tpl');
+ return replace_macros($t, array(
+ '$title' => t('Administration'),
+ '$page' => t('Summary'),
+ '$adminalertmsg' => $alertmsg,
+ '$queues' => $queues,
+ '$accounts' => array( t('Registered accounts'), $accounts),
+ '$pending' => array( t('Pending registrations'), $pending),
+ '$channels' => array( t('Registered channels'), $channels),
+ '$plugins' => array( t('Active plugins'), $plugins ),
+ '$version' => array( t('Version'), RED_VERSION),
+ '$build' => get_config('system', 'db_version')
+ ));
+ }
+
+
+ /**
+ * @brief POST handler for Admin Site Page.
+ *
+ * @param App &$a
+ */
+ function admin_page_site_post(&$a){
+ if (!x($_POST, 'page_site')){
+ return;
+ }
+
+ check_form_security_token_redirectOnErr('/admin/site', 'admin_site');
+
+ $sitename = ((x($_POST,'sitename')) ? notags(trim($_POST['sitename'])) : '');
+ $banner = ((x($_POST,'banner')) ? trim($_POST['banner']) : false);
+ $admininfo = ((x($_POST,'admininfo')) ? trim($_POST['admininfo']) : false);
+ $language = ((x($_POST,'language')) ? notags(trim($_POST['language'])) : '');
+ $theme = ((x($_POST,'theme')) ? notags(trim($_POST['theme'])) : '');
+ $theme_mobile = ((x($_POST,'theme_mobile')) ? notags(trim($_POST['theme_mobile'])) : '');
+ // $site_channel = ((x($_POST,'site_channel')) ? notags(trim($_POST['site_channel'])) : '');
+ $maximagesize = ((x($_POST,'maximagesize')) ? intval(trim($_POST['maximagesize'])) : 0);
+
+ $register_policy = ((x($_POST,'register_policy')) ? intval(trim($_POST['register_policy'])) : 0);
+
+ $access_policy = ((x($_POST,'access_policy')) ? intval(trim($_POST['access_policy'])) : 0);
+ $invite_only = ((x($_POST,'invite_only')) ? True : False);
+ $abandon_days = ((x($_POST,'abandon_days')) ? intval(trim($_POST['abandon_days'])) : 0);
+
+ $register_text = ((x($_POST,'register_text')) ? notags(trim($_POST['register_text'])) : '');
+ $frontpage = ((x($_POST,'frontpage')) ? notags(trim($_POST['frontpage'])) : '');
+ $mirror_frontpage = ((x($_POST,'mirror_frontpage')) ? intval(trim($_POST['mirror_frontpage'])) : 0);
+ $directory_server = ((x($_POST,'directory_server')) ? trim($_POST['directory_server']) : '');
+ $allowed_sites = ((x($_POST,'allowed_sites')) ? notags(trim($_POST['allowed_sites'])) : '');
+ $allowed_email = ((x($_POST,'allowed_email')) ? notags(trim($_POST['allowed_email'])) : '');
+ $not_allowed_email = ((x($_POST,'not_allowed_email')) ? notags(trim($_POST['not_allowed_email'])) : '');
+ $force_publish = ((x($_POST,'publish_all')) ? True : False);
+ $disable_discover_tab = ((x($_POST,'disable_discover_tab')) ? False : True);
+ $login_on_homepage = ((x($_POST,'login_on_homepage')) ? True : False);
+ $enable_context_help = ((x($_POST,'enable_context_help')) ? True : False);
+ $global_directory = ((x($_POST,'directory_submit_url')) ? notags(trim($_POST['directory_submit_url'])) : '');
+ $no_community_page = !((x($_POST,'no_community_page')) ? True : False);
+ $default_expire_days = ((array_key_exists('default_expire_days',$_POST)) ? intval($_POST['default_expire_days']) : 0);
+
+ $verifyssl = ((x($_POST,'verifyssl')) ? True : False);
+ $proxyuser = ((x($_POST,'proxyuser')) ? notags(trim($_POST['proxyuser'])) : '');
+ $proxy = ((x($_POST,'proxy')) ? notags(trim($_POST['proxy'])) : '');
+ $timeout = ((x($_POST,'timeout')) ? intval(trim($_POST['timeout'])) : 60);
+ $delivery_interval = ((x($_POST,'delivery_interval'))? intval(trim($_POST['delivery_interval'])) : 0);
+ $delivery_batch_count = ((x($_POST,'delivery_batch_count') && $_POST['delivery_batch_count'] > 0)? intval(trim($_POST['delivery_batch_count'])) : 1);
+ $poll_interval = ((x($_POST,'poll_interval')) ? intval(trim($_POST['poll_interval'])) : 0);
+ $maxloadavg = ((x($_POST,'maxloadavg')) ? intval(trim($_POST['maxloadavg'])) : 50);
+ $feed_contacts = ((x($_POST,'feed_contacts')) ? intval($_POST['feed_contacts']) : 0);
+ $verify_email = ((x($_POST,'verify_email')) ? 1 : 0);
+
+ set_config('system', 'feed_contacts', $feed_contacts);
+ set_config('system', 'delivery_interval', $delivery_interval);
+ set_config('system', 'delivery_batch_count', $delivery_batch_count);
+ set_config('system', 'poll_interval', $poll_interval);
+ set_config('system', 'maxloadavg', $maxloadavg);
+ set_config('system', 'frontpage', $frontpage);
+ set_config('system', 'mirror_frontpage', $mirror_frontpage);
+ set_config('system', 'sitename', $sitename);
+ set_config('system', 'login_on_homepage', $login_on_homepage);
+ set_config('system', 'enable_context_help', $enable_context_help);
+ set_config('system', 'verify_email', $verify_email);
+ set_config('system', 'default_expire_days', $default_expire_days);
+
+ if($directory_server)
+ set_config('system','directory_server',$directory_server);
+
+ if ($banner == '') {
+ del_config('system', 'banner');
+ } else {
+ set_config('system', 'banner', $banner);
+ }
+
+ if ($admininfo == ''){
+ del_config('system', 'admininfo');
+ } else {
+ require_once('include/text.php');
+ linkify_tags($a, $admininfo, local_channel());
+ set_config('system', 'admininfo', $admininfo);
+ }
+ set_config('system', 'language', $language);
+ set_config('system', 'theme', $theme);
+ if ( $theme_mobile === '---' ) {
+ del_config('system', 'mobile_theme');
+ } else {
+ set_config('system', 'mobile_theme', $theme_mobile);
+ }
+ // set_config('system','site_channel', $site_channel);
+ set_config('system','maximagesize', $maximagesize);
+
+ set_config('system','register_policy', $register_policy);
+ set_config('system','invitation_only', $invite_only);
+ set_config('system','access_policy', $access_policy);
+ set_config('system','account_abandon_days', $abandon_days);
+ set_config('system','register_text', $register_text);
+ set_config('system','allowed_sites', $allowed_sites);
+ set_config('system','allowed_email', $allowed_email);
+ set_config('system','not_allowed_email', $not_allowed_email);
+ set_config('system','publish_all', $force_publish);
+ set_config('system','disable_discover_tab', $disable_discover_tab);
+ if ($global_directory == '') {
+ del_config('system', 'directory_submit_url');
+ } else {
+ set_config('system', 'directory_submit_url', $global_directory);
+ }
+
+ set_config('system','no_community_page', $no_community_page);
+ set_config('system','no_utf', $no_utf);
+ set_config('system','verifyssl', $verifyssl);
+ set_config('system','proxyuser', $proxyuser);
+ set_config('system','proxy', $proxy);
+ set_config('system','curl_timeout', $timeout);
+
+ info( t('Site settings updated.') . EOL);
+ goaway(z_root() . '/admin/site' );
+ }
+
+ /**
+ * @brief Admin page site.
+ *
+ * @param App $a
+ * @return string
+ */
+ function admin_page_site(&$a) {
+
+ /* Installed langs */
+ $lang_choices = array();
+ $langs = glob('view/*/hstrings.php');
+
+ if(is_array($langs) && count($langs)) {
+ if(! in_array('view/en/hstrings.php',$langs))
+ $langs[] = 'view/en/';
+ asort($langs);
+ foreach($langs as $l) {
+ $t = explode("/",$l);
+ $lang_choices[$t[1]] = $t[1];
+ }
+ }
+
+ /* Installed themes */
+ $theme_choices_mobile["---"] = t("Default");
+ $theme_choices = array();
+ $files = glob('view/theme/*');
+ if($files) {
+ foreach($files as $file) {
+ $vars = '';
+ $f = basename($file);
+ if (file_exists($file . '/library'))
+ continue;
+ if (file_exists($file . '/mobile'))
+ $vars = t('mobile');
+ if (file_exists($file . '/experimental'))
+ $vars .= t('experimental');
+ if (file_exists($file . '/unsupported'))
+ $vars .= t('unsupported');
+ if ($vars) {
+ $theme_choices[$f] = $f . ' (' . $vars . ')';
+ $theme_choices_mobile[$f] = $f . ' (' . $vars . ')';
+ }
+ else {
+ $theme_choices[$f] = $f;
+ $theme_choices_mobile[$f] = $f;
+ }
+ }
+ }
+
+ $dir_choices = null;
+ $dirmode = get_config('system','directory_mode');
+ $realm = get_directory_realm();
+
+ // directory server should not be set or settable unless we are a directory client
+
+ if($dirmode == DIRECTORY_MODE_NORMAL) {
+ $x = q("select site_url from site where site_flags in (%d,%d) and site_realm = '%s'",
+ intval(DIRECTORY_MODE_SECONDARY),
+ intval(DIRECTORY_MODE_PRIMARY),
+ dbesc($realm)
+ );
+ if($x) {
+ $dir_choices = array();
+ foreach($x as $xx) {
+ $dir_choices[$xx['site_url']] = $xx['site_url'];
+ }
+ }
+ }
+
+ /* Banner */
+
+ $banner = get_config('system', 'banner');
+ if($banner === false)
+ $banner = get_config('system','sitename');
+
+ $banner = htmlspecialchars($banner);
+
+ /* Admin Info */
+ $admininfo = get_config('system', 'admininfo');
+
+ /* Register policy */
+ $register_choices = Array(
+ REGISTER_CLOSED => t("No"),
+ REGISTER_APPROVE => t("Yes - with approval"),
+ REGISTER_OPEN => t("Yes")
+ );
+
+ /* Acess policy */
+ $access_choices = Array(
+ ACCESS_PRIVATE => t("My site is not a public server"),
+ ACCESS_PAID => t("My site has paid access only"),
+ ACCESS_FREE => t("My site has free access only"),
+ ACCESS_TIERED => t("My site offers free accounts with optional paid upgrades")
+ );
+
+ // $ssl_choices = array(
+ // SSL_POLICY_NONE => t("No SSL policy, links will track page SSL state"),
+ // SSL_POLICY_FULL => t("Force all links to use SSL")
+ // );
+
+ $discover_tab = get_config('system','disable_discover_tab');
+ // $disable public streams by default
+ if($discover_tab === false)
+ $discover_tab = 1;
+ // now invert the logic for the setting.
+ $discover_tab = (1 - $discover_tab);
+
+
+ $homelogin = get_config('system','login_on_homepage');
+ $enable_context_help = get_config('system','enable_context_help');
+
+ $t = get_markup_template("admin_site.tpl");
+ return replace_macros($t, array(
+ '$title' => t('Administration'),
+ '$page' => t('Site'),
+ '$submit' => t('Submit'),
+ '$registration' => t('Registration'),
+ '$upload' => t('File upload'),
+ '$corporate' => t('Policies'),
+ '$advanced' => t('Advanced'),
+
+ '$baseurl' => z_root(),
+ // name, label, value, help string, extra data...
+ '$sitename' => array('sitename', t("Site name"), htmlspecialchars(get_config('system','sitename'), ENT_QUOTES, 'UTF-8'),''),
+ '$banner' => array('banner', t("Banner/Logo"), $banner, ""),
+ '$admininfo' => array('admininfo', t("Administrator Information"), $admininfo, t("Contact information for site administrators. Displayed on siteinfo page. BBCode can be used here")),
+ '$language' => array('language', t("System language"), get_config('system','language'), "", $lang_choices),
+ '$theme' => array('theme', t("System theme"), get_config('system','theme'), t("Default system theme - may be over-ridden by user profiles - <a href='#' id='cnftheme'>change theme settings</a>"), $theme_choices),
+ '$theme_mobile' => array('theme_mobile', t("Mobile system theme"), get_config('system','mobile_theme'), t("Theme for mobile devices"), $theme_choices_mobile),
+ // '$site_channel' => array('site_channel', t("Channel to use for this website's static pages"), get_config('system','site_channel'), t("Site Channel")),
+ '$feed_contacts' => array('feed_contacts', t('Allow Feeds as Connections'),get_config('system','feed_contacts'),t('(Heavy system resource usage)')),
+ '$maximagesize' => array('maximagesize', t("Maximum image size"), intval(get_config('system','maximagesize')), t("Maximum size in bytes of uploaded images. Default is 0, which means no limits.")),
+ '$register_policy' => array('register_policy', t("Does this site allow new member registration?"), get_config('system','register_policy'), "", $register_choices),
+ '$invite_only' => array('invite_only', t("Invitation only"), get_config('system','invitation_only'), t("Only allow new member registrations with an invitation code. Above register policy must be set to Yes.")),
+ '$access_policy' => array('access_policy', t("Which best describes the types of account offered by this hub?"), get_config('system','access_policy'), "This is displayed on the public server site list.", $access_choices),
+ '$register_text' => array('register_text', t("Register text"), htmlspecialchars(get_config('system','register_text'), ENT_QUOTES, 'UTF-8'), t("Will be displayed prominently on the registration page.")),
+ '$frontpage' => array('frontpage', t("Site homepage to show visitors (default: login box)"), get_config('system','frontpage'), t("example: 'public' to show public stream, 'page/sys/home' to show a system webpage called 'home' or 'include:home.html' to include a file.")),
+ '$mirror_frontpage' => array('mirror_frontpage', t("Preserve site homepage URL"), get_config('system','mirror_frontpage'), t('Present the site homepage in a frame at the original location instead of redirecting')),
+ '$abandon_days' => array('abandon_days', t('Accounts abandoned after x days'), get_config('system','account_abandon_days'), t('Will not waste system resources polling external sites for abandonded accounts. Enter 0 for no time limit.')),
+ '$allowed_sites' => array('allowed_sites', t("Allowed friend domains"), get_config('system','allowed_sites'), t("Comma separated list of domains which are allowed to establish friendships with this site. Wildcards are accepted. Empty to allow any domains")),
+ '$allowed_email' => array('allowed_email', t("Allowed email domains"), get_config('system','allowed_email'), t("Comma separated list of domains which are allowed in email addresses for registrations to this site. Wildcards are accepted. Empty to allow any domains")),
+ '$not_allowed_email' => array('not_allowed_email', t("Not allowed email domains"), get_config('system','not_allowed_email'), t("Comma separated list of domains which are not allowed in email addresses for registrations to this site. Wildcards are accepted. Empty to allow any domains, unless allowed domains have been defined.")),
+ '$verify_email' => array('verify_email', t("Verify Email Addresses"), get_config('system','verify_email'), t("Check to verify email addresses used in account registration (recommended).")),
+ '$force_publish' => array('publish_all', t("Force publish"), get_config('system','publish_all'), t("Check to force all profiles on this site to be listed in the site directory.")),
+ '$disable_discover_tab' => array('disable_discover_tab', t('Import Public Streams'), $discover_tab, t('Import and allow access to public content pulled from other sites. Warning: this content is unmoderated.')),
+ '$login_on_homepage' => array('login_on_homepage', t("Login on Homepage"),((intval($homelogin) || $homelogin === false) ? 1 : '') , t("Present a login box to visitors on the home page if no other content has been configured.")),
+ '$enable_context_help' => array('enable_context_help', t("Enable context help"),((intval($enable_context_help) === 1 || $enable_context_help === false) ? 1 : 0) , t("Display contextual help for the current page when the help button is pressed.")),
+
+ '$directory_server' => (($dir_choices) ? array('directory_server', t("Directory Server URL"), get_config('system','directory_server'), t("Default directory server"), $dir_choices) : null),
+
+ '$proxyuser' => array('proxyuser', t("Proxy user"), get_config('system','proxyuser'), ""),
+ '$proxy' => array('proxy', t("Proxy URL"), get_config('system','proxy'), ""),
+ '$timeout' => array('timeout', t("Network timeout"), (x(get_config('system','curl_timeout'))?get_config('system','curl_timeout'):60), t("Value is in seconds. Set to 0 for unlimited (not recommended).")),
+ '$delivery_interval' => array('delivery_interval', t("Delivery interval"), (x(get_config('system','delivery_interval'))?get_config('system','delivery_interval'):2), t("Delay background delivery processes by this many seconds to reduce system load. Recommend: 4-5 for shared hosts, 2-3 for virtual private servers. 0-1 for large dedicated servers.")),
+ '$delivery_batch_count' => array('delivery_batch_count', t('Deliveries per process'),(x(get_config('system','delivery_batch_count'))?get_config('system','delivery_batch_count'):1), t("Number of deliveries to attempt in a single operating system process. Adjust if necessary to tune system performance. Recommend: 1-5.")),
+ '$poll_interval' => array('poll_interval', t("Poll interval"), (x(get_config('system','poll_interval'))?get_config('system','poll_interval'):2), t("Delay background polling processes by this many seconds to reduce system load. If 0, use delivery interval.")),
+ '$maxloadavg' => array('maxloadavg', t("Maximum Load Average"), ((intval(get_config('system','maxloadavg')) > 0)?get_config('system','maxloadavg'):50), t("Maximum system load before delivery and poll processes are deferred - default 50.")),
+ '$default_expire_days' => array('default_expire_days', t('Expiration period in days for imported (grid/network) content'), intval(get_config('system','default_expire_days')), t('0 for no expiration of imported content')),
+ '$form_security_token' => get_form_security_token("admin_site"),
+ ));
+ }
+
+ function admin_page_hubloc_post(&$a){
+ check_form_security_token_redirectOnErr('/admin/hubloc', 'admin_hubloc');
+ require_once('include/zot.php');
+
+ //prepare for ping
+
+ if ( $_POST['hublocid']) {
+ $hublocid = $_POST['hublocid'];
+ $arrhublocurl = q("SELECT hubloc_url FROM hubloc WHERE hubloc_id = %d ",
+ intval($hublocid)
+ );
+ $hublocurl = $arrhublocurl[0]['hubloc_url'] . '/post';
+
+ //perform ping
+ $m = zot_build_packet(\App::get_channel(),'ping');
+ $r = zot_zot($hublocurl,$m);
+ //handle results and set the hubloc flags in db to make results visible
+ $r2 = $r['body'];
+ $r3 = $r2['success'];
+ if ( $r3['success'] == True ){
+ //set HUBLOC_OFFLINE to 0
+ logger(' success = true ',LOGGER_DEBUG);
+ } else {
+ //set HUBLOC_OFFLINE to 1
+ logger(' success = false ', LOGGER_DEBUG);
+ }
+
+ //unfotunatly zping wont work, I guess return format is not correct
+ //require_once('mod/zping.php');
+ //$r = zping_content($hublocurl);
+ //logger('zping answer: ' . $r, LOGGER_DEBUG);
+
+ //in case of repair store new pub key for tested hubloc (all channel with this hubloc) in db
+ //after repair set hubloc flags to 0
+ }
+
+ goaway(z_root() . '/admin/hubloc' );
+ }
+
+ function trim_array_elems($arr) {
+ $narr = array();
+
+ if($arr && is_array($arr)) {
+ for($x = 0; $x < count($arr); $x ++) {
+ $y = trim($arr[$x]);
+ if($y)
+ $narr[] = $y;
+ }
+ }
+ return $narr;
+ }
+
+ function admin_page_security_post(&$a){
+ check_form_security_token_redirectOnErr('/admin/security', 'admin_security');
+
+ logger('post: ' . print_r($_POST,true));
+
+ $block_public = ((x($_POST,'block_public')) ? True : False);
+ set_config('system','block_public',$block_public);
+
+ $ws = trim_array_elems(explode("\n",$_POST['whitelisted_sites']));
+ set_config('system','whitelisted_sites',$ws);
+
+ $bs = trim_array_elems(explode("\n",$_POST['blacklisted_sites']));
+ set_config('system','blacklisted_sites',$bs);
+
+ $wc = trim_array_elems(explode("\n",$_POST['whitelisted_channels']));
+ set_config('system','whitelisted_channels',$wc);
+
+ $bc = trim_array_elems(explode("\n",$_POST['blacklisted_channels']));
+ set_config('system','blacklisted_channels',$bc);
+
+ $embed_coop = ((x($_POST,'embed_coop')) ? True : False);
+ set_config('system','embed_coop',$embed_coop);
+
+ $we = trim_array_elems(explode("\n",$_POST['embed_allow']));
+ set_config('system','embed_allow',$we);
+
+ $be = trim_array_elems(explode("\n",$_POST['embed_deny']));
+ set_config('system','embed_deny',$be);
+
+ goaway(z_root() . '/admin/security');
+ }
+
+
+
+
+ function admin_page_features_post(&$a) {
+
+ check_form_security_token_redirectOnErr('/admin/features', 'admin_manage_features');
+
+ logger('postvars: ' . print_r($_POST,true));
+
+ $arr = array();
+ $features = get_features(false);
+
+ foreach($features as $fname => $fdata) {
+ foreach(array_slice($fdata,1) as $f) {
+ $feature = $f[0];
+
+ if(array_key_exists('feature_' . $feature,$_POST))
+ $val = intval($_POST['feature_' . $feature]);
+ else
+ $val = 0;
+ set_config('feature',$feature,$val);
+
+ if(array_key_exists('featurelock_' . $feature,$_POST))
+ set_config('feature_lock',$feature,$val);
+ else
+ del_config('feature_lock',$feature);
+ }
+ }
+
+ goaway(z_root() . '/admin/features' );
+
+ }
+
+ function admin_page_features(&$a) {
+
+ if((argc() > 1) && (argv(1) === 'features')) {
+ $arr = array();
+ $features = get_features(false);
+
+ foreach($features as $fname => $fdata) {
+ $arr[$fname] = array();
+ $arr[$fname][0] = $fdata[0];
+ foreach(array_slice($fdata,1) as $f) {
+
+ $set = get_config('feature',$f[0]);
+ if($set === false)
+ $set = $f[3];
+ $arr[$fname][1][] = array(
+ array('feature_' .$f[0],$f[1],$set,$f[2],array(t('Off'),t('On'))),
+ array('featurelock_' .$f[0],sprintf( t('Lock feature %s'),$f[1]),(($f[4] !== false) ? 1 : 0),'',array(t('Off'),t('On')))
+ );
+ }
+ }
+
+ $tpl = get_markup_template("admin_settings_features.tpl");
+ $o .= replace_macros($tpl, array(
+ '$form_security_token' => get_form_security_token("admin_manage_features"),
+ '$title' => t('Manage Additional Features'),
+ '$features' => $arr,
+ '$submit' => t('Submit'),
+ ));
+
+ return $o;
+ }
+ }
+
+
+
+
+
+ function admin_page_hubloc(&$a) {
+ $hubloc = q("SELECT hubloc_id, hubloc_addr, hubloc_host, hubloc_status FROM hubloc");
+
+ if(! $hubloc){
+ notice( t('No server found') . EOL);
+ goaway(z_root() . '/admin/hubloc');
+ }
+
+ $t = get_markup_template('admin_hubloc.tpl');
+ return replace_macros($t, array(
+ '$hubloc' => $hubloc,
+ '$th_hubloc' => array(t('ID'), t('for channel'), t('on server'), t('Status')),
+ '$title' => t('Administration'),
+ '$page' => t('Server'),
+ '$queues' => $queues,
+ //'$accounts' => $accounts, /*$accounts is empty here*/
+ '$pending' => array( t('Pending registrations'), $pending),
+ '$plugins' => array( t('Active plugins'), \App::$plugins ),
+ '$form_security_token' => get_form_security_token('admin_hubloc')
+ ));
+ }
+
+ function admin_page_security(&$a) {
+
+ $whitesites = get_config('system','whitelisted_sites');
+ $whitesites_str = ((is_array($whitesites)) ? implode($whitesites,"\n") : '');
+
+ $blacksites = get_config('system','blacklisted_sites');
+ $blacksites_str = ((is_array($blacksites)) ? implode($blacksites,"\n") : '');
+
+
+ $whitechannels = get_config('system','whitelisted_channels');
+ $whitechannels_str = ((is_array($whitechannels)) ? implode($whitechannels,"\n") : '');
+
+ $blackchannels = get_config('system','blacklisted_channels');
+ $blackchannels_str = ((is_array($blackchannels)) ? implode($blackchannels,"\n") : '');
+
+
+ $whiteembeds = get_config('system','embed_allow');
+ $whiteembeds_str = ((is_array($whiteembeds)) ? implode($whiteembeds,"\n") : '');
+
+ $blackembeds = get_config('system','embed_deny');
+ $blackembeds_str = ((is_array($blackembeds)) ? implode($blackembeds,"\n") : '');
+
+ $embed_coop = intval(get_config('system','embed_coop'));
+
+ // wait to implement this until we have a co-op in place.
+ // if((! $whiteembeds) && (! $blackembeds) && (! $embed_coop))
+ // $whiteembeds_str = "youtube.com\nyoutu.be\ntwitter.com\nvimeo.com\nsoundcloud.com\nwikipedia.com";
+
+ $t = get_markup_template('admin_security.tpl');
+ return replace_macros($t, array(
+ '$title' => t('Administration'),
+ '$page' => t('Security'),
+ '$form_security_token' => get_form_security_token('admin_security'),
+ '$block_public' => array('block_public', t("Block public"), get_config('system','block_public'), t("Check to block public access to all otherwise public personal pages on this site unless you are currently authenticated.")),
+ '$whitelisted_sites' => array('whitelisted_sites', t('Allow communications only from these sites'), $whitesites_str, t('One site per line. Leave empty to allow communication from anywhere by default')),
+ '$blacklisted_sites' => array('blacklisted_sites', t('Block communications from these sites'), $blacksites_str, ''),
+ '$whitelisted_channels' => array('whitelisted_channels', t('Allow communications only from these channels'), $whitechannels_str, t('One channel (hash) per line. Leave empty to allow from any channel by default')),
+ '$blacklisted_channels' => array('blacklisted_channels', t('Block communications from these channels'), $blackchannels_str, ''),
+ '$embed_allow' => array('embed_allow', t('Allow embedded HTML content only from these domains'), $whiteembeds_str, t('One site per line. Leave empty to allow from any site by default')),
+ '$embed_deny' => array('embed_deny', t('Block embedded HTML from these domains'), $blackembeds_str, ''),
+
+ '$embed_coop' => array('embed_coop', t('Cooperative embed security'), $embed_coop, t('Enable to share embed security with other compatible sites/hubs')),
+ '$submit' => t('Submit')
+ ));
+ }
+
+
+
+
+ function admin_page_dbsync(&$a) {
+ $o = '';
+
+ if(argc() > 3 && intval(argv(3)) && argv(2) === 'mark') {
+ set_config('database', 'update_r' . intval(argv(3)), 'success');
+ if(intval(get_config('system','db_version')) <= intval(argv(3)))
+ set_config('system','db_version',intval(argv(3)) + 1);
+ info( t('Update has been marked successful') . EOL);
+ goaway(z_root() . '/admin/dbsync');
+ }
+
+ if(argc() > 2 && intval(argv(2))) {
+ require_once('install/update.php');
+ $func = 'update_r' . intval(argv(2));
+ if(function_exists($func)) {
+ $retval = $func();
+ if($retval === UPDATE_FAILED) {
+ $o .= sprintf( t('Executing %s failed. Check system logs.'), $func);
+ }
+ elseif($retval === UPDATE_SUCCESS) {
+ $o .= sprintf( t('Update %s was successfully applied.'), $func);
+ set_config('database',$func, 'success');
+ }
+ else
+ $o .= sprintf( t('Update %s did not return a status. Unknown if it succeeded.'), $func);
+ }
+ else
+ $o .= sprintf( t('Update function %s could not be found.'), $func);
+
+ return $o;
+ }
+
+ $failed = array();
+ $r = q("select * from config where `cat` = 'database' ");
+ if(count($r)) {
+ foreach($r as $rr) {
+ $upd = intval(substr($rr['k'],8));
+ if($rr['v'] === 'success')
+ continue;
+ $failed[] = $upd;
+ }
+ }
+ if(! count($failed))
+ return '<div class="generic-content-wrapper-styled"><h3>' . t('No failed updates.') . '</h3></div>';
+
+ $o = replace_macros(get_markup_template('failed_updates.tpl'),array(
+ '$base' => z_root(),
+ '$banner' => t('Failed Updates'),
+ '$desc' => '',
+ '$mark' => t('Mark success (if update was manually applied)'),
+ '$apply' => t('Attempt to execute this update step automatically'),
+ '$failed' => $failed
+ ));
+
+ return $o;
+ }
+
+ function admin_page_queue($a) {
+ $o = '';
+
+ $expert = ((array_key_exists('expert',$_REQUEST)) ? intval($_REQUEST['expert']) : 0);
+
+ if($_REQUEST['drophub']) {
+ require_once('hubloc.php');
+ hubloc_mark_as_down($_REQUEST['drophub']);
+ remove_queue_by_posturl($_REQUEST['drophub']);
+ }
+
+ if($_REQUEST['emptyhub']) {
+ remove_queue_by_posturl($_REQUEST['emptyhub']);
+ }
+
+ $r = q("select count(outq_posturl) as total, max(outq_priority) as priority, outq_posturl from outq
+ where outq_delivered = 0 group by outq_posturl order by total desc");
+
+ for($x = 0; $x < count($r); $x ++) {
+ $r[$x]['eurl'] = urlencode($r[$x]['outq_posturl']);
+ $r[$x]['connected'] = datetime_convert('UTC',date_default_timezone_get(),$r[$x]['connected'],'Y-m-d');
+ }
+
+ $o = replace_macros(get_markup_template('admin_queue.tpl'), array(
+ '$banner' => t('Queue Statistics'),
+ '$numentries' => t('Total Entries'),
+ '$priority' => t('Priority'),
+ '$desturl' => t('Destination URL'),
+ '$nukehub' => t('Mark hub permanently offline'),
+ '$empty' => t('Empty queue for this hub'),
+ '$lastconn' => t('Last known contact'),
+ '$hasentries' => ((count($r)) ? true : false),
+ '$entries' => $r,
+ '$expert' => $expert
+ ));
+
+ return $o;
+ }
+
+ /**
+ * @brief Handle POST actions on users admin page.
+ *
+ * This function is called when on the admin user/account page the form was
+ * submitted to handle multiple operations at once. If one of the icons next
+ * to an entry are pressed the function admin_page_users() will handle this.
+ *
+ * @param App $a
+ */
+ function admin_page_users_post($a) {
+ $pending = ( x($_POST, 'pending') ? $_POST['pending'] : array() );
+ $users = ( x($_POST, 'user') ? $_POST['user'] : array() );
+ $blocked = ( x($_POST, 'blocked') ? $_POST['blocked'] : array() );
+
+ check_form_security_token_redirectOnErr('/admin/users', 'admin_users');
+
+ // change to switch structure?
+ // account block/unblock button was submitted
+ if (x($_POST, 'page_users_block')) {
+ for ($i = 0; $i < count($users); $i++) {
+ // if account is blocked remove blocked bit-flag, otherwise add blocked bit-flag
+ $op = ($blocked[$i]) ? '& ~' : '| ';
+ q("UPDATE account SET account_flags = (account_flags $op%d) WHERE account_id = %d",
+ intval(ACCOUNT_BLOCKED),
+ intval($users[$i])
+ );
+ }
+ notice( sprintf( tt("%s account blocked/unblocked", "%s account blocked/unblocked", count($users)), count($users)) );
+ }
+ // account delete button was submitted
+ if (x($_POST, 'page_users_delete')) {
+ require_once('include/Contact.php');
+ foreach ($users as $uid){
+ account_remove($uid, true, false);
+ }
+ notice( sprintf( tt("%s account deleted", "%s accounts deleted", count($users)), count($users)) );
+ }
+ // registration approved button was submitted
+ if (x($_POST, 'page_users_approve')) {
+ foreach ($pending as $hash) {
+ account_allow($hash);
+ }
+ }
+ // registration deny button was submitted
+ if (x($_POST, 'page_users_deny')) {
+ foreach ($pending as $hash) {
+ account_deny($hash);
+ }
+ }
+
+ goaway(z_root() . '/admin/users' );
+ }
+
+ /**
+ * @brief Generate users admin page and handle single item operations.
+ *
+ * This function generates the users/account admin page and handles the actions
+ * if an icon next to an entry was clicked. If several items were selected and
+ * the form was submitted it is handled by the function admin_page_users_post().
+ *
+ * @param App &$a
+ * @return string
+ */
+ function admin_page_users(&$a){
+ if (argc() > 2) {
+ $uid = argv(3);
+ $account = q("SELECT * FROM account WHERE account_id = %d",
+ intval($uid)
+ );
+
+ if (! $account) {
+ notice( t('Account not found') . EOL);
+ goaway(z_root() . '/admin/users' );
+ }
+
+ check_form_security_token_redirectOnErr('/admin/users', 'admin_users', 't');
+
+ switch (argv(2)){
+ case 'delete':
+ // delete user
+ require_once('include/Contact.php');
+ account_remove($uid,true,false);
+
+ notice( sprintf(t("Account '%s' deleted"), $account[0]['account_email']) . EOL);
+ break;
+ case 'block':
+ q("UPDATE account SET account_flags = ( account_flags | %d ) WHERE account_id = %d",
+ intval(ACCOUNT_BLOCKED),
+ intval($uid)
+ );
+
+ notice( sprintf( t("Account '%s' blocked") , $account[0]['account_email']) . EOL);
+ break;
+ case 'unblock':
+ q("UPDATE account SET account_flags = ( account_flags & ~%d ) WHERE account_id = %d",
+ intval(ACCOUNT_BLOCKED),
+ intval($uid)
+ );
+
+ notice( sprintf( t("Account '%s' unblocked"), $account[0]['account_email']) . EOL);
+ break;
+ }
+
+ goaway(z_root() . '/admin/users' );
+ }
+
+ /* get pending */
+ $pending = q("SELECT account.*, register.hash from account left join register on account_id = register.uid where (account_flags & %d )>0 ",
+ intval(ACCOUNT_PENDING)
+ );
+
+ /* get users */
+
+ $total = q("SELECT count(*) as total FROM account");
+ if (count($total)) {
+ \App::set_pager_total($total[0]['total']);
+ \App::set_pager_itemspage(100);
+ }
+
+
+ // We'll still need to link email addresses to admin/users/channels or some such, but this bit doesn't exist yet.
+ // That's where we need to be doing last post/channel flags/etc, not here.
+
+ $serviceclass = (($_REQUEST['class']) ? " and account_service_class = '" . dbesc($_REQUEST['class']) . "' " : '');
+
+ $order = " order by account_email asc ";
+ if($_REQUEST['order'] === 'expires')
+ $order = " order by account_expires desc ";
+ if($_REQUEST['order'] === 'created')
+ $order = " order by account_created desc ";
+
+ $users = q("SELECT `account_id` , `account_email`, `account_lastlog`, `account_created`, `account_expires`, " . "`account_service_class`, ( account_flags & %d )>0 as `blocked`, " .
+ "(SELECT %s FROM channel as ch " .
+ "WHERE ch.channel_account_id = ac.account_id and ch.channel_removed = 0 ) as `channels` " .
+ "FROM account as ac where true $serviceclass $order limit %d offset %d ",
+ intval(ACCOUNT_BLOCKED),
+ db_concat('ch.channel_address', ' '),
+ intval(\App::$pager['itemspage']),
+ intval(\App::$pager['start'])
+ );
+
+ // function _setup_users($e){
+ // $accounts = Array(
+ // t('Normal Account'),
+ // t('Soapbox Account'),
+ // t('Community/Celebrity Account'),
+ // t('Automatic Friend Account')
+ // );
+
+ // $e['page_flags'] = $accounts[$e['page-flags']];
+ // $e['register_date'] = relative_date($e['register_date']);
+ // $e['login_date'] = relative_date($e['login_date']);
+ // $e['lastitem_date'] = relative_date($e['lastitem_date']);
+ // return $e;
+ // }
+ // $users = array_map("_setup_users", $users);
+
+ $t = get_markup_template('admin_users.tpl');
+ $o = replace_macros($t, array(
+ // strings //
+ '$title' => t('Administration'),
+ '$page' => t('Users'),
+ '$submit' => t('Submit'),
+ '$select_all' => t('select all'),
+ '$h_pending' => t('User registrations waiting for confirm'),
+ '$th_pending' => array( t('Request date'), t('Email') ),
+ '$no_pending' => t('No registrations.'),
+ '$approve' => t('Approve'),
+ '$deny' => t('Deny'),
+ '$delete' => t('Delete'),
+ '$block' => t('Block'),
+ '$unblock' => t('Unblock'),
+
+ '$h_users' => t('Users'),
+ '$th_users' => array( t('ID'), t('Email'), t('All Channels'), t('Register date'), t('Last login'), t('Expires'), t('Service Class')),
+
+ '$confirm_delete_multi' => t('Selected accounts will be deleted!\n\nEverything these accounts had posted on this site will be permanently deleted!\n\nAre you sure?'),
+ '$confirm_delete' => t('The account {0} will be deleted!\n\nEverything this account has posted on this site will be permanently deleted!\n\nAre you sure?'),
+
+ '$form_security_token' => get_form_security_token("admin_users"),
+
+ // values //
+ '$baseurl' => z_root(),
+
+ '$pending' => $pending,
+ '$users' => $users,
+ ));
+ $o .= paginate($a);
+
+ return $o;
+ }
+
+
+ /**
+ * @brief Channels admin page.
+ *
+ * @param App &$a
+ */
+ function admin_page_channels_post(&$a) {
+ $channels = ( x($_POST, 'channel') ? $_POST['channel'] : Array() );
+
+ check_form_security_token_redirectOnErr('/admin/channels', 'admin_channels');
+
+ $xor = db_getfunc('^');
+
+ if (x($_POST,'page_channels_block')){
+ foreach($channels as $uid){
+ q("UPDATE channel SET channel_pageflags = ( channel_pageflags $xor %d ) where channel_id = %d",
+ intval(PAGE_CENSORED),
+ intval( $uid )
+ );
+ proc_run('php','include/directory.php',$uid,'nopush');
+ }
+ notice( sprintf( tt("%s channel censored/uncensored", "%s channels censored/uncensored", count($channels)), count($channels)) );
+ }
+ if (x($_POST,'page_channels_code')){
+ foreach($channels as $uid){
+ q("UPDATE channel SET channel_pageflags = ( channel_pageflags $xor %d ) where channel_id = %d",
+ intval(PAGE_ALLOWCODE),
+ intval( $uid )
+ );
+ }
+ notice( sprintf( tt("%s channel code allowed/disallowed", "%s channels code allowed/disallowed", count($channels)), count($channels)) );
+ }
+ if (x($_POST,'page_channels_delete')){
+ require_once("include/Contact.php");
+ foreach($channels as $uid){
+ channel_remove($uid,true);
+ }
+ notice( sprintf( tt("%s channel deleted", "%s channels deleted", count($channels)), count($channels)) );
+ }
+
+ goaway(z_root() . '/admin/channels' );
+ }
+
+ /**
+ * @brief
+ *
+ * @param App &$a
+ * @return string
+ */
+ function admin_page_channels(&$a){
+ if (argc() > 2) {
+ $uid = argv(3);
+ $channel = q("SELECT * FROM channel WHERE channel_id = %d",
+ intval($uid)
+ );
+
+ if (! $channel) {
+ notice( t('Channel not found') . EOL);
+ goaway(z_root() . '/admin/channels' );
+ }
+
+ switch(argv(2)) {
+ case "delete":{
+ check_form_security_token_redirectOnErr('/admin/channels', 'admin_channels', 't');
+ // delete channel
+ require_once("include/Contact.php");
+ channel_remove($uid,true);
+
+ notice( sprintf(t("Channel '%s' deleted"), $channel[0]['channel_name']) . EOL);
+ }; break;
+
+ case "block":{
+ check_form_security_token_redirectOnErr('/admin/channels', 'admin_channels', 't');
+ $pflags = $channel[0]['channel_pageflags'] ^ PAGE_CENSORED;
+ q("UPDATE channel SET channel_pageflags = %d where channel_id = %d",
+ intval($pflags),
+ intval( $uid )
+ );
+ proc_run('php','include/directory.php',$uid,'nopush');
+
+ notice( sprintf( (($pflags & PAGE_CENSORED) ? t("Channel '%s' censored"): t("Channel '%s' uncensored")) , $channel[0]['channel_name'] . ' (' . $channel[0]['channel_address'] . ')' ) . EOL);
+ }; break;
+
+ case "code":{
+ check_form_security_token_redirectOnErr('/admin/channels', 'admin_channels', 't');
+ $pflags = $channel[0]['channel_pageflags'] ^ PAGE_ALLOWCODE;
+ q("UPDATE channel SET channel_pageflags = %d where channel_id = %d",
+ intval($pflags),
+ intval( $uid )
+ );
+
+ notice( sprintf( (($pflags & PAGE_ALLOWCODE) ? t("Channel '%s' code allowed"): t("Channel '%s' code disallowed")) , $channel[0]['channel_name'] . ' (' . $channel[0]['channel_address'] . ')' ) . EOL);
+ }; break;
+
+ default:
+ break;
+ }
+ goaway(z_root() . '/admin/channels' );
+ }
+
+ /* get channels */
+
+ $total = q("SELECT count(*) as total FROM channel where channel_removed = 0 and channel_system = 0");
+ if($total) {
+ \App::set_pager_total($total[0]['total']);
+ \App::set_pager_itemspage(100);
+ }
+
+ $order = " order by channel_name asc ";
+
+ $channels = q("SELECT * from channel where channel_removed = 0 and channel_system = 0 $order limit %d offset %d ",
+ intval(\App::$pager['itemspage']),
+ intval(\App::$pager['start'])
+ );
+
+ if($channels) {
+ for($x = 0; $x < count($channels); $x ++) {
+ if($channels[$x]['channel_pageflags'] & PAGE_CENSORED)
+ $channels[$x]['blocked'] = true;
+ else
+ $channels[$x]['blocked'] = false;
+
+ if($channels[$x]['channel_pageflags'] & PAGE_ALLOWCODE)
+ $channels[$x]['allowcode'] = true;
+ else
+ $channels[$x]['allowcode'] = false;
+ }
+ }
+
+ $t = get_markup_template("admin_channels.tpl");
+ $o = replace_macros($t, array(
+ // strings //
+ '$title' => t('Administration'),
+ '$page' => t('Channels'),
+ '$submit' => t('Submit'),
+ '$select_all' => t('select all'),
+ '$delete' => t('Delete'),
+ '$block' => t('Censor'),
+ '$unblock' => t('Uncensor'),
+ '$code' => t('Allow Code'),
+ '$uncode' => t('Disallow Code'),
+ '$h_channels' => t('Channel'),
+ '$th_channels' => array( t('UID'), t('Name'), t('Address')),
+
+ '$confirm_delete_multi' => t('Selected channels will be deleted!\n\nEverything that was posted in these channels on this site will be permanently deleted!\n\nAre you sure?'),
+ '$confirm_delete' => t('The channel {0} will be deleted!\n\nEverything that was posted in this channel on this site will be permanently deleted!\n\nAre you sure?'),
+
+ '$form_security_token' => get_form_security_token("admin_channels"),
+
+ // values //
+ '$baseurl' => z_root(),
+ '$channels' => $channels,
+ ));
+ $o .= paginate($a);
+
+ return $o;
+ }
+
+
+ /**
+ * Plugins admin page
+ *
+ * @param App $a
+ * @return string
+ */
+ function admin_page_plugins(&$a){
+
+ /*
+ * Single plugin
+ */
+ if (\App::$argc == 3){
+ $plugin = \App::$argv[2];
+ if (!is_file("addon/$plugin/$plugin.php")){
+ notice( t("Item not found.") );
+ return '';
+ }
+
+ $enabled = in_array($plugin,\App::$plugins);
+ $info = get_plugin_info($plugin);
+ $x = check_plugin_versions($info);
+
+ // disable plugins which are installed but incompatible versions
+
+ if($enabled && ! $x) {
+ $enabled = false;
+ $idz = array_search($plugin, \App::$plugins);
+ if ($idz !== false) {
+ unset(\App::$plugins[$idz]);
+ uninstall_plugin($plugin);
+ set_config("system","addon", implode(", ",\App::$plugins));
+ }
+ }
+ $info['disabled'] = 1-intval($x);
+
+ if (x($_GET,"a") && $_GET['a']=="t"){
+ check_form_security_token_redirectOnErr('/admin/plugins', 'admin_plugins', 't');
+
+ // Toggle plugin status
+ $idx = array_search($plugin, \App::$plugins);
+ if ($idx !== false){
+ unset(\App::$plugins[$idx]);
+ uninstall_plugin($plugin);
+ info( sprintf( t("Plugin %s disabled."), $plugin ) );
+ } else {
+ \App::$plugins[] = $plugin;
+ install_plugin($plugin);
+ info( sprintf( t("Plugin %s enabled."), $plugin ) );
+ }
+ set_config("system","addon", implode(", ",\App::$plugins));
+ goaway(z_root() . '/admin/plugins' );
+ }
+ // display plugin details
+ require_once('library/markdown.php');
+
+ if (in_array($plugin, \App::$plugins)){
+ $status = 'on';
+ $action = t('Disable');
+ } else {
+ $status = 'off';
+ $action = t('Enable');
+ }
+
+ $readme = null;
+ if (is_file("addon/$plugin/README.md")){
+ $readme = file_get_contents("addon/$plugin/README.md");
+ $readme = Markdown($readme);
+ } else if (is_file("addon/$plugin/README")){
+ $readme = "<pre>". file_get_contents("addon/$plugin/README") ."</pre>";
+ }
+
+ $admin_form = '';
+
+ $r = q("select * from addon where plugin_admin = 1 and name = '%s' limit 1",
+ dbesc($plugin)
+ );
+
+ if($r) {
+ @require_once("addon/$plugin/$plugin.php");
+ if(function_exists($plugin.'_plugin_admin')) {
+ $func = $plugin.'_plugin_admin';
+ $func($a, $admin_form);
+ }
+ }
+
+
+ $t = get_markup_template('admin_plugins_details.tpl');
+ return replace_macros($t, array(
+ '$title' => t('Administration'),
+ '$page' => t('Plugins'),
+ '$toggle' => t('Toggle'),
+ '$settings' => t('Settings'),
+ '$baseurl' => z_root(),
+
+ '$plugin' => $plugin,
+ '$status' => $status,
+ '$action' => $action,
+ '$info' => $info,
+ '$str_author' => t('Author: '),
+ '$str_maintainer' => t('Maintainer: '),
+ '$str_minversion' => t('Minimum project version: '),
+ '$str_maxversion' => t('Maximum project version: '),
+ '$str_minphpversion' => t('Minimum PHP version: '),
+ '$str_requires' => t('Requires: '),
+ '$disabled' => t('Disabled - version incompatibility'),
+
+ '$admin_form' => $admin_form,
+ '$function' => 'plugins',
+ '$screenshot' => '',
+ '$readme' => $readme,
+
+ '$form_security_token' => get_form_security_token('admin_plugins'),
+ ));
+ }
+
+
+ /*
+ * List plugins
+ */
+ $plugins = array();
+ $files = glob('addon/*/');
+ if($files) {
+ foreach($files as $file) {
+ if (is_dir($file)){
+ list($tmp, $id) = array_map('trim', explode('/', $file));
+ $info = get_plugin_info($id);
+ $enabled = in_array($id,\App::$plugins);
+ $x = check_plugin_versions($info);
+
+ // disable plugins which are installed but incompatible versions
+
+ if($enabled && ! $x) {
+ $enabled = false;
+ $idz = array_search($id, \App::$plugins);
+ if ($idz !== false) {
+ unset(\App::$plugins[$idz]);
+ uninstall_plugin($id);
+ set_config("system","addon", implode(", ",\App::$plugins));
+ }
+ }
+ $info['disabled'] = 1-intval($x);
+
+ $plugins[] = array( $id, (($enabled)?"on":"off") , $info);
+ }
+ }
+ }
+
+ $t = get_markup_template('admin_plugins.tpl');
+ return replace_macros($t, array(
+ '$title' => t('Administration'),
+ '$page' => t('Plugins'),
+ '$submit' => t('Submit'),
+ '$baseurl' => z_root(),
+ '$function' => 'plugins',
+ '$plugins' => $plugins,
+ '$disabled' => t('Disabled - version incompatibility'),
+ '$form_security_token' => get_form_security_token('admin_plugins'),
+ ));
+ }
+
+ /**
+ * @param array $themes
+ * @param string $th
+ * @param int $result
+ */
+ function toggle_theme(&$themes, $th, &$result) {
+ for($x = 0; $x < count($themes); $x ++) {
+ if($themes[$x]['name'] === $th) {
+ if($themes[$x]['allowed']) {
+ $themes[$x]['allowed'] = 0;
+ $result = 0;
+ }
+ else {
+ $themes[$x]['allowed'] = 1;
+ $result = 1;
+ }
+ }
+ }
+ }
+
+ /**
+ * @param array $themes
+ * @param string $th
+ * @return int
+ */
+ function theme_status($themes, $th) {
+ for($x = 0; $x < count($themes); $x ++) {
+ if($themes[$x]['name'] === $th) {
+ if($themes[$x]['allowed']) {
+ return 1;
+ }
+ else {
+ return 0;
+ }
+ }
+ }
+ return 0;
+ }
+
+
+ /**
+ * @param array $themes
+ * @return string
+ */
+ function rebuild_theme_table($themes) {
+ $o = '';
+ if(count($themes)) {
+ foreach($themes as $th) {
+ if($th['allowed']) {
+ if(strlen($o))
+ $o .= ',';
+ $o .= $th['name'];
+ }
+ }
+ }
+ return $o;
+ }
+
+
+ /**
+ * @brief Themes admin page.
+ *
+ * @param App &$a
+ * @return string
+ */
+ function admin_page_themes(&$a){
+
+ $allowed_themes_str = get_config('system', 'allowed_themes');
+ $allowed_themes_raw = explode(',', $allowed_themes_str);
+ $allowed_themes = array();
+ if(count($allowed_themes_raw))
+ foreach($allowed_themes_raw as $x)
+ if(strlen(trim($x)))
+ $allowed_themes[] = trim($x);
+
+ $themes = array();
+ $files = glob('view/theme/*');
+ if($files) {
+ foreach($files as $file) {
+ $f = basename($file);
+ $is_experimental = intval(file_exists($file . '/.experimental'));
+ $is_supported = 1-(intval(file_exists($file . '/.unsupported'))); // Is not used yet
+ $is_allowed = intval(in_array($f,$allowed_themes));
+ $themes[] = array('name' => $f, 'experimental' => $is_experimental, 'supported' => $is_supported, 'allowed' => $is_allowed);
+ }
+ }
+
+ if(! count($themes)) {
+ notice( t('No themes found.'));
+ return '';
+ }
+
+ /*
+ * Single theme
+ */
+
+ if (\App::$argc == 3){
+ $theme = \App::$argv[2];
+ if(! is_dir("view/theme/$theme")){
+ notice( t("Item not found.") );
+ return '';
+ }
+
+ if (x($_GET,"a") && $_GET['a']=="t"){
+ check_form_security_token_redirectOnErr('/admin/themes', 'admin_themes', 't');
+
+ // Toggle theme status
+
+ toggle_theme($themes, $theme, $result);
+ $s = rebuild_theme_table($themes);
+ if($result)
+ info( sprintf('Theme %s enabled.', $theme));
+ else
+ info( sprintf('Theme %s disabled.', $theme));
+
+ set_config('system', 'allowed_themes', $s);
+ goaway(z_root() . '/admin/themes' );
+ }
+
+ // display theme details
+ require_once('library/markdown.php');
+
+ if (theme_status($themes,$theme)) {
+ $status="on"; $action= t("Disable");
+ } else {
+ $status="off"; $action= t("Enable");
+ }
+
+ $readme=Null;
+ if (is_file("view/theme/$theme/README.md")){
+ $readme = file_get_contents("view/theme/$theme/README.md");
+ $readme = Markdown($readme);
+ } else if (is_file("view/theme/$theme/README")){
+ $readme = "<pre>". file_get_contents("view/theme/$theme/README") ."</pre>";
+ }
+
+ $admin_form = '';
+ if (is_file("view/theme/$theme/php/config.php")){
+ require_once("view/theme/$theme/php/config.php");
+ if(function_exists("theme_admin")){
+ $admin_form = theme_admin($a);
+ }
+ }
+
+ $screenshot = array( get_theme_screenshot($theme), t('Screenshot'));
+ if(! stristr($screenshot[0],$theme))
+ $screenshot = null;
+
+ $t = get_markup_template('admin_plugins_details.tpl');
+ return replace_macros($t, array(
+ '$title' => t('Administration'),
+ '$page' => t('Themes'),
+ '$toggle' => t('Toggle'),
+ '$settings' => t('Settings'),
+ '$baseurl' => z_root(),
+
+ '$plugin' => $theme,
+ '$status' => $status,
+ '$action' => $action,
+ '$info' => get_theme_info($theme),
+ '$function' => 'themes',
+ '$admin_form' => $admin_form,
+ '$str_author' => t('Author: '),
+ '$str_maintainer' => t('Maintainer: '),
+ '$screenshot' => $screenshot,
+ '$readme' => $readme,
+
+ '$form_security_token' => get_form_security_token('admin_themes'),
+ ));
+ }
+
+ /*
+ * List themes
+ */
+
+ $xthemes = array();
+ if($themes) {
+ foreach($themes as $th) {
+ $xthemes[] = array($th['name'],(($th['allowed']) ? "on" : "off"), get_theme_info($th['name']));
+ }
+ }
+
+ $t = get_markup_template('admin_plugins.tpl');
+ return replace_macros($t, array(
+ '$title' => t('Administration'),
+ '$page' => t('Themes'),
+ '$submit' => t('Submit'),
+ '$baseurl' => z_root(),
+ '$function' => 'themes',
+ '$plugins' => $xthemes,
+ '$experimental' => t('[Experimental]'),
+ '$unsupported' => t('[Unsupported]'),
+ '$form_security_token' => get_form_security_token('admin_themes'),
+ ));
+ }
+
+
+ /**
+ * @brief POST handler for logs admin page.
+ *
+ * @param App &$a
+ */
+ function admin_page_logs_post(&$a) {
+ if (x($_POST, 'page_logs')) {
+ check_form_security_token_redirectOnErr('/admin/logs', 'admin_logs');
+
+ $logfile = ((x($_POST,'logfile')) ? notags(trim($_POST['logfile'])) : '');
+ $debugging = ((x($_POST,'debugging')) ? true : false);
+ $loglevel = ((x($_POST,'loglevel')) ? intval(trim($_POST['loglevel'])) : 0);
+
+ set_config('system','logfile', $logfile);
+ set_config('system','debugging', $debugging);
+ set_config('system','loglevel', $loglevel);
+ }
+
+ info( t('Log settings updated.') );
+ goaway(z_root() . '/admin/logs' );
+ }
+
+ /**
+ * @brief Logs admin page.
+ *
+ * @param App $a
+ * @return string
+ */
+ function admin_page_logs(&$a){
+
+ $log_choices = Array(
+ LOGGER_NORMAL => 'Normal',
+ LOGGER_TRACE => 'Trace',
+ LOGGER_DEBUG => 'Debug',
+ LOGGER_DATA => 'Data',
+ LOGGER_ALL => 'All'
+ );
+
+ $t = get_markup_template('admin_logs.tpl');
+
+ $f = get_config('system', 'logfile');
+
+ $data = '';
+
+ if(!file_exists($f)) {
+ $data = t("Error trying to open <strong>$f</strong> log file.\r\n<br/>Check to see if file $f exist and is
+ readable.");
+ }
+ else {
+ $fp = fopen($f, 'r');
+ if(!$fp) {
+ $data = t("Couldn't open <strong>$f</strong> log file.\r\n<br/>Check to see if file $f is readable.");
+ }
+ else {
+ $fstat = fstat($fp);
+ $size = $fstat['size'];
+ if($size != 0)
+ {
+ if($size > 5000000 || $size < 0)
+ $size = 5000000;
+ $seek = fseek($fp,0-$size,SEEK_END);
+ if($seek === 0) {
+ $data = escape_tags(fread($fp,$size));
+ while(! feof($fp))
+ $data .= escape_tags(fread($fp,4096));
+ }
+ }
+ fclose($fp);
+ }
+ }
+
+ return replace_macros($t, array(
+ '$title' => t('Administration'),
+ '$page' => t('Logs'),
+ '$submit' => t('Submit'),
+ '$clear' => t('Clear'),
+ '$data' => $data,
+ '$baseurl' => z_root(),
+ '$logname' => get_config('system','logfile'),
+
+ // name, label, value, help string, extra data...
+ '$debugging' => array('debugging', t("Debugging"),get_config('system','debugging'), ""),
+ '$logfile' => array('logfile', t("Log file"), get_config('system','logfile'), t("Must be writable by web server. Relative to your Red top-level directory.")),
+ '$loglevel' => array('loglevel', t("Log level"), get_config('system','loglevel'), "", $log_choices),
+
+ '$form_security_token' => get_form_security_token('admin_logs'),
+ ));
+ }
+
+ function admin_page_profs_post(&$a) {
+
+ if(array_key_exists('basic',$_REQUEST)) {
+ $arr = explode(',',$_REQUEST['basic']);
+ for($x = 0; $x < count($arr); $x ++)
+ if(trim($arr[$x]))
+ $arr[$x] = trim($arr[$x]);
+ set_config('system','profile_fields_basic',$arr);
+
+ if(array_key_exists('advanced',$_REQUEST)) {
+ $arr = explode(',',$_REQUEST['advanced']);
+ for($x = 0; $x < count($arr); $x ++)
+ if(trim($arr[$x]))
+ $arr[$x] = trim($arr[$x]);
+ set_config('system','profile_fields_advanced',$arr);
+ }
+ goaway(z_root() . '/admin/profs');
+ }
+
+
+ if(array_key_exists('field_name',$_REQUEST)) {
+ if($_REQUEST['id']) {
+ $r = q("update profdef set field_name = '%s', field_type = '%s', field_desc = '%s' field_help = '%s', field_inputs = '%s' where id = %d",
+ dbesc($_REQUEST['field_name']),
+ dbesc($_REQUEST['field_type']),
+ dbesc($_REQUEST['field_desc']),
+ dbesc($_REQUEST['field_help']),
+ dbesc($_REQUEST['field_inputs']),
+ intval($_REQUEST['id'])
+ );
+ }
+ else {
+ $r = q("insert into profdef ( field_name, field_type, field_desc, field_help, field_inputs ) values ( '%s' , '%s', '%s', '%s', '%s' )",
+ dbesc($_REQUEST['field_name']),
+ dbesc($_REQUEST['field_type']),
+ dbesc($_REQUEST['field_desc']),
+ dbesc($_REQUEST['field_help']),
+ dbesc($_REQUEST['field_inputs'])
+ );
+ }
+ }
+
+
+ // add to chosen array basic or advanced
+
+ goaway(z_root() . '/admin/profs');
+ }
+
+ function admin_page_profs(&$a) {
+
+ if((argc() > 3) && argv(2) == 'drop' && intval(argv(3))) {
+ $r = q("delete from profdef where id = %d",
+ intval(argv(3))
+ );
+ // remove from allowed fields
+
+ goaway(z_root() . '/admin/profs');
+ }
+
+ if((argc() > 2) && argv(2) === 'new') {
+ return replace_macros(get_markup_template('profdef_edit.tpl'),array(
+ '$header' => t('New Profile Field'),
+ '$field_name' => array('field_name',t('Field nickname'),$_REQUEST['field_name'],t('System name of field')),
+ '$field_type' => array('field_type',t('Input type'),(($_REQUEST['field_type']) ? $_REQUEST['field_type'] : 'text'),''),
+ '$field_desc' => array('field_desc',t('Field Name'),$_REQUEST['field_desc'],t('Label on profile pages')),
+ '$field_help' => array('field_help',t('Help text'),$_REQUEST['field_help'],t('Additional info (optional)')),
+ '$submit' => t('Save')
+ ));
+ }
+
+ if((argc() > 2) && intval(argv(2))) {
+ $r = q("select * from profdef where id = %d limit 1",
+ intval(argv(2))
+ );
+ if(! $r) {
+ notice( t('Field definition not found') . EOL);
+ goaway(z_root() . '/admin/profs');
+ }
+
+ return replace_macros(get_markup_template('profdef_edit.tpl'),array(
+ '$id' => intval($r[0]['id']),
+ '$header' => t('Edit Profile Field'),
+ '$field_name' => array('field_name',t('Field nickname'),$r[0]['field_name'],t('System name of field')),
+ '$field_type' => array('field_type',t('Input type'),$r[0]['field_type'],''),
+ '$field_desc' => array('field_desc',t('Field Name'),$r[0]['field_desc'],t('Label on profile pages')),
+ '$field_help' => array('field_help',t('Help text'),$r[0]['field_help'],t('Additional info (optional)')),
+ '$submit' => t('Save')
+ ));
+ }
+
+ $basic = '';
+ $barr = array();
+ $fields = get_profile_fields_basic();
+ if(! $fields)
+ $fields = get_profile_fields_basic(1);
+ if($fields) {
+ foreach($fields as $k => $v) {
+ if($basic)
+ $basic .= ', ';
+ $basic .= trim($k);
+ $barr[] = trim($k);
+ }
+ }
+
+ $advanced = '';
+ $fields = get_profile_fields_advanced();
+ if(! $fields)
+ $fields = get_profile_fields_advanced(1);
+ if($fields) {
+ foreach($fields as $k => $v) {
+ if(in_array(trim($k),$barr))
+ continue;
+ if($advanced)
+ $advanced .= ', ';
+ $advanced .= trim($k);
+ }
+ }
+
+ $all = '';
+ $fields = get_profile_fields_advanced(1);
+ if($fields) {
+ foreach($fields as $k => $v) {
+ if($all)
+ $all .= ', ';
+ $all .= trim($k);
+ }
+ }
+
+ $r = q("select * from profdef where true");
+ if($r) {
+ foreach($r as $rr) {
+ if($all)
+ $all .= ', ';
+ $all .= $rr['field_name'];
+ }
+ }
+
+
+ $o = replace_macros(get_markup_template('admin_profiles.tpl'),array(
+ '$title' => t('Profile Fields'),
+ '$basic' => array('basic',t('Basic Profile Fields'),$basic,''),
+ '$advanced' => array('advanced',t('Advanced Profile Fields'),$advanced,t('(In addition to basic fields)')),
+ '$all' => $all,
+ '$all_desc' => t('All available fields'),
+ '$cust_field_desc' => t('Custom Fields'),
+ '$cust_fields' => $r,
+ '$edit' => t('Edit'),
+ '$drop' => t('Delete'),
+ '$new' => t('Create Custom Field'),
+ '$submit' => t('Submit')
+ ));
+
+ return $o;
+
+
+ }
+
+}
diff --git a/Zotlabs/Module/Api.php b/Zotlabs/Module/Api.php
new file mode 100644
index 000000000..3e7f23b6c
--- /dev/null
+++ b/Zotlabs/Module/Api.php
@@ -0,0 +1,122 @@
+<?php
+namespace Zotlabs\Module;
+
+require_once('include/api.php');
+
+
+
+class Api extends \Zotlabs\Web\Controller {
+
+ function post() {
+
+ if(! local_channel()) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ if(count(\App::$user) && x(\App::$user,'uid') && \App::$user['uid'] != local_channel()) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ }
+
+ function get() {
+ if(\App::$cmd=='api/oauth/authorize'){
+
+ /*
+ * api/oauth/authorize interact with the user. return a standard page
+ */
+
+ \App::$page['template'] = "minimal";
+
+ // get consumer/client from request token
+ try {
+ $request = OAuth1Request::from_request();
+ } catch(Exception $e) {
+ echo "<pre>"; var_dump($e); killme();
+ }
+
+
+ if(x($_POST,'oauth_yes')){
+
+ $app = $this->oauth_get_client($request);
+ if (is_null($app)) return "Invalid request. Unknown token.";
+ $consumer = new OAuth1Consumer($app['client_id'], $app['pw'], $app['redirect_uri']);
+
+ $verifier = md5($app['secret'].local_channel());
+ set_config("oauth", $verifier, local_channel());
+
+
+ if($consumer->callback_url!=null) {
+ $params = $request->get_parameters();
+ $glue="?";
+ if (strstr($consumer->callback_url,$glue)) $glue="?";
+ goaway($consumer->callback_url . $glue . "oauth_token=" . OAuth1Util::urlencode_rfc3986($params['oauth_token']) . "&oauth_verifier=" . OAuth1Util::urlencode_rfc3986($verifier));
+ killme();
+ }
+
+ $tpl = get_markup_template("oauth_authorize_done.tpl");
+ $o = replace_macros($tpl, array(
+ '$title' => t('Authorize application connection'),
+ '$info' => t('Return to your app and insert this Securty Code:'),
+ '$code' => $verifier,
+ ));
+
+ return $o;
+ }
+
+
+ if(! local_channel()) {
+ //TODO: we need login form to redirect to this page
+ notice( t('Please login to continue.') . EOL );
+ return login(false,'api-login',$request->get_parameters());
+ }
+ //FKOAuth1::loginUser(4);
+
+ $app = $this->oauth_get_client($request);
+ if (is_null($app)) return "Invalid request. Unknown token.";
+
+
+
+
+ $tpl = get_markup_template('oauth_authorize.tpl');
+ $o = replace_macros($tpl, array(
+ '$title' => t('Authorize application connection'),
+ '$app' => $app,
+ '$authorize' => t('Do you want to authorize this application to access your posts and contacts, and/or create new posts for you?'),
+ '$yes' => t('Yes'),
+ '$no' => t('No'),
+ ));
+
+ //echo "<pre>"; var_dump($app); killme();
+
+ return $o;
+ }
+
+ echo api_call($a);
+ killme();
+ }
+
+ function oauth_get_client($request){
+
+
+ $params = $request->get_parameters();
+ $token = $params['oauth_token'];
+
+ $r = q("SELECT `clients`.*
+ FROM `clients`, `tokens`
+ WHERE `clients`.`client_id`=`tokens`.`client_id`
+ AND `tokens`.`id`='%s' AND `tokens`.`scope`='request'",
+ dbesc($token));
+
+ if (!count($r))
+ return null;
+
+ return $r[0];
+ }
+
+
+
+
+}
diff --git a/Zotlabs/Module/Appman.php b/Zotlabs/Module/Appman.php
new file mode 100644
index 000000000..96e4cdd87
--- /dev/null
+++ b/Zotlabs/Module/Appman.php
@@ -0,0 +1,108 @@
+<?php
+namespace Zotlabs\Module; /** @file */
+
+require_once('include/apps.php');
+
+
+class Appman extends \Zotlabs\Web\Controller {
+
+ function post() {
+
+ if(! local_channel())
+ return;
+
+ if($_POST['url']) {
+ $arr = array(
+ 'uid' => intval($_REQUEST['uid']),
+ 'url' => escape_tags($_REQUEST['url']),
+ 'guid' => escape_tags($_REQUEST['guid']),
+ 'author' => escape_tags($_REQUEST['author']),
+ 'addr' => escape_tags($_REQUEST['addr']),
+ 'name' => escape_tags($_REQUEST['name']),
+ 'desc' => escape_tags($_REQUEST['desc']),
+ 'photo' => escape_tags($_REQUEST['photo']),
+ 'version' => escape_tags($_REQUEST['version']),
+ 'price' => escape_tags($_REQUEST['price']),
+ 'sig' => escape_tags($_REQUEST['sig'])
+ );
+
+ $_REQUEST['appid'] = app_install(local_channel(),$arr);
+
+ if(app_installed(local_channel(),$arr))
+ info( t('App installed.') . EOL);
+
+ return;
+ }
+
+
+ $papp = app_decode($_POST['papp']);
+
+ if(! is_array($papp)) {
+ notice( t('Malformed app.') . EOL);
+ return;
+ }
+
+ if($_POST['install']) {
+ app_install(local_channel(),$papp);
+ if(app_installed(local_channel(),$papp))
+ info( t('App installed.') . EOL);
+ }
+
+ if($_POST['delete']) {
+ app_destroy(local_channel(),$papp);
+ }
+
+ if($_POST['edit']) {
+ return;
+ }
+
+ if($_SESSION['return_url'])
+ goaway(z_root() . '/' . $_SESSION['return_url']);
+ goaway(z_root() . '/apps');
+
+
+ }
+
+
+ function get() {
+
+ if(! local_channel()) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ $channel = \App::get_channel();
+ $app = null;
+ $embed = null;
+ if($_REQUEST['appid']) {
+ $r = q("select * from app where app_id = '%s' and app_channel = %d limit 1",
+ dbesc($_REQUEST['appid']),
+ dbesc(local_channel())
+ );
+ if($r)
+ $app = $r[0];
+ $embed = array('embed', t('Embed code'), app_encode($app,true),'', 'onclick="this.select();"');
+
+ }
+
+ return replace_macros(get_markup_template('app_create.tpl'), array(
+
+ '$banner' => (($app) ? t('Edit App') : t('Create App')),
+ '$app' => $app,
+ '$guid' => (($app) ? $app['app_id'] : ''),
+ '$author' => (($app) ? $app['app_author'] : $channel['channel_hash']),
+ '$addr' => (($app) ? $app['app_addr'] : $channel['xchan_addr']),
+ '$name' => array('name', t('Name of app'),(($app) ? $app['app_name'] : ''), t('Required')),
+ '$url' => array('url', t('Location (URL) of app'),(($app) ? $app['app_url'] : ''), t('Required')),
+ '$desc' => array('desc', t('Description'),(($app) ? $app['app_desc'] : ''), ''),
+ '$photo' => array('photo', t('Photo icon URL'),(($app) ? $app['app_photo'] : ''), t('80 x 80 pixels - optional')),
+ '$version' => array('version', t('Version ID'),(($app) ? $app['app_version'] : ''), ''),
+ '$price' => array('price', t('Price of app'),(($app) ? $app['app_price'] : ''), ''),
+ '$page' => array('page', t('Location (URL) to purchase app'),(($app) ? $app['app_page'] : ''), ''),
+ '$embed' => $embed,
+ '$submit' => t('Submit')
+ ));
+
+ }
+
+}
diff --git a/Zotlabs/Module/Apps.php b/Zotlabs/Module/Apps.php
new file mode 100644
index 000000000..4066966ca
--- /dev/null
+++ b/Zotlabs/Module/Apps.php
@@ -0,0 +1,46 @@
+<?php
+namespace Zotlabs\Module;
+
+require_once('include/apps.php');
+
+
+class Apps extends \Zotlabs\Web\Controller {
+
+ function get() {
+
+ if(argc() == 2 && argv(1) == 'edit')
+ $mode = 'edit';
+ else
+ $mode = 'list';
+
+ $_SESSION['return_url'] = \App::$cmd;
+
+ $apps = array();
+
+ $syslist = get_system_apps();
+
+ if(local_channel()) {
+ $list = app_list(local_channel());
+ if($list) {
+ foreach($list as $x) {
+ $syslist[] = app_encode($x);
+ }
+ }
+ }
+ usort($syslist,'app_name_compare');
+
+ // logger('apps: ' . print_r($syslist,true));
+
+ foreach($syslist as $app) {
+ $apps[] = app_render($app,$mode);
+ }
+
+ return replace_macros(get_markup_template('myapps.tpl'), array(
+ '$sitename' => get_config('system','sitename'),
+ '$title' => t('Apps'),
+ '$apps' => $apps,
+ ));
+
+ }
+
+}
diff --git a/Zotlabs/Module/Attach.php b/Zotlabs/Module/Attach.php
new file mode 100644
index 000000000..8948b66d7
--- /dev/null
+++ b/Zotlabs/Module/Attach.php
@@ -0,0 +1,61 @@
+<?php
+namespace Zotlabs\Module;
+
+require_once('include/security.php');
+require_once('include/attach.php');
+
+
+class Attach extends \Zotlabs\Web\Controller {
+
+ function init() {
+
+ if(argc() < 2) {
+ notice( t('Item not available.') . EOL);
+ return;
+ }
+
+ $r = attach_by_hash(argv(1),((argc() > 2) ? intval(argv(2)) : 0));
+
+ if(! $r['success']) {
+ notice( $r['message'] . EOL);
+ return;
+ }
+
+ $c = q("select channel_address from channel where channel_id = %d limit 1",
+ intval($r['data']['uid'])
+ );
+
+ if(! $c)
+ return;
+
+
+ $unsafe_types = array('text/html','text/css','application/javascript');
+
+ if(in_array($r['data']['filetype'],$unsafe_types)) {
+ header('Content-type: text/plain');
+ }
+ else {
+ header('Content-type: ' . $r['data']['filetype']);
+ }
+
+ header('Content-disposition: attachment; filename="' . $r['data']['filename'] . '"');
+ if(intval($r['data']['os_storage'])) {
+ $fname = dbunescbin($r['data']['data']);
+ if(strpos($fname,'store') !== false)
+ $istream = fopen($fname,'rb');
+ else
+ $istream = fopen('store/' . $c[0]['channel_address'] . '/' . $fname,'rb');
+ $ostream = fopen('php://output','wb');
+ if($istream && $ostream) {
+ pipe_streams($istream,$ostream);
+ fclose($istream);
+ fclose($ostream);
+ }
+ }
+ else
+ echo dbunescbin($r['data']['data']);
+ killme();
+
+ }
+
+}
diff --git a/Zotlabs/Module/Authtest.php b/Zotlabs/Module/Authtest.php
new file mode 100644
index 000000000..239ae3bdb
--- /dev/null
+++ b/Zotlabs/Module/Authtest.php
@@ -0,0 +1,61 @@
+<?php
+namespace Zotlabs\Module;
+
+require_once('include/zot.php');
+
+
+class Authtest extends \Zotlabs\Web\Controller {
+
+ function get() {
+
+
+ $auth_success = false;
+ $o .= '<h3>Magic-Auth Diagnostic</h3>';
+
+ if(! local_channel()) {
+ notice( t('Permission denied.') . EOL);
+ return $o;
+ }
+
+ $o .= '<form action="authtest" method="get">';
+ $o .= 'Target URL: <input type="text" style="width: 250px;" name="dest" value="' . $_GET['dest'] .'" />';
+ $o .= '<input type="submit" name="submit" value="Submit" /></form>';
+
+ $o .= '<br /><br />';
+
+ if(x($_GET,'dest')) {
+ if(strpos($_GET['dest'],'@')) {
+ $_GET['dest'] = $_REQUEST['dest'] = 'https://' . substr($_GET['dest'],strpos($_GET['dest'],'@')+1) . '/channel/' . substr($_GET['dest'],0,strpos($_GET['dest'],'@'));
+ }
+
+ $_REQUEST['test'] = 1;
+ $mod = new Magic();
+ $x = $mod->init($a);
+
+ $o .= 'Local Setup returns: ' . print_r($x,true);
+
+
+
+ if($x['url']) {
+ $z = z_fetch_url($x['url'] . '&test=1');
+ if($z['success']) {
+ $j = json_decode($z['body'],true);
+ if(! $j)
+ $o .= 'json_decode failure from remote site. ' . print_r($z['body'],true);
+ $o .= 'Remote site responded: ' . print_r($j,true);
+ if($j['success'] && strpos($j['message'],'Authentication Success'))
+ $auth_success = true;
+ }
+ else {
+ $o .= 'fetch url failure.' . print_r($z,true);
+ }
+ }
+
+ if(! $auth_success)
+ $o .= 'Authentication Failed!' . EOL;
+ }
+
+ return str_replace("\n",'<br />',$o);
+ }
+
+}
diff --git a/Zotlabs/Module/Block.php b/Zotlabs/Module/Block.php
new file mode 100644
index 000000000..062befdb5
--- /dev/null
+++ b/Zotlabs/Module/Block.php
@@ -0,0 +1,92 @@
+<?php
+namespace Zotlabs\Module;
+
+require_once('include/items.php');
+require_once('include/conversation.php');
+require_once('include/page_widgets.php');
+
+
+class Block extends \Zotlabs\Web\Controller {
+
+ function init() {
+
+ $which = argv(1);
+ $profile = 0;
+ profile_load($a,$which,$profile);
+
+ if(\App::$profile['profile_uid'])
+ head_set_icon(\App::$profile['thumb']);
+
+ }
+
+
+ function get() {
+
+ if(! perm_is_allowed(\App::$profile['profile_uid'],get_observer_hash(),'view_pages')) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ if(argc() < 3) {
+ notice( t('Invalid item.') . EOL);
+ return;
+ }
+
+ $channel_address = argv(1);
+ $page_id = argv(2);
+
+ $u = q("select channel_id from channel where channel_address = '%s' limit 1",
+ dbesc($channel_address)
+ );
+
+ if(! $u) {
+ notice( t('Channel not found.') . EOL);
+ return;
+ }
+
+ if($_REQUEST['rev'])
+ $revision = " and revision = " . intval($_REQUEST['rev']) . " ";
+ else
+ $revision = " order by revision desc ";
+
+ require_once('include/security.php');
+ $sql_options = item_permissions_sql($u[0]['channel_id']);
+
+ $r = q("select item.* from item left join item_id on item.id = item_id.iid
+ where item.uid = %d and sid = '%s' and service = 'BUILDBLOCK' and
+ item_type = %d $sql_options $revision limit 1",
+ intval($u[0]['channel_id']),
+ dbesc($page_id),
+ intval(ITEM_TYPE_BLOCK)
+ );
+
+ if(! $r) {
+
+ // Check again with no permissions clause to see if it is a permissions issue
+
+ $x = q("select item.* from item left join item_id on item.id = item_id.iid
+ where item.uid = %d and sid = '%s' and service = 'BUILDBLOCK' and
+ item_type = %d $revision limit 1",
+ intval($u[0]['channel_id']),
+ dbesc($page_id),
+ intval(ITEM_TYPE_BLOCK)
+ );
+ if($x) {
+ // Yes, it's there. You just aren't allowed to see it.
+ notice( t('Permission denied.') . EOL);
+ }
+ else {
+ notice( t('Page not found.') . EOL);
+ }
+ return;
+ }
+
+ xchan_query($r);
+ $r = fetch_post_tags($r,true);
+
+ $o .= prepare_page($r[0]);
+ return $o;
+
+ }
+
+}
diff --git a/Zotlabs/Module/Blocks.php b/Zotlabs/Module/Blocks.php
new file mode 100644
index 000000000..192a4aded
--- /dev/null
+++ b/Zotlabs/Module/Blocks.php
@@ -0,0 +1,172 @@
+<?php
+namespace Zotlabs\Module;
+
+require_once('include/identity.php');
+require_once('include/conversation.php');
+require_once('include/acl_selectors.php');
+
+
+class Blocks extends \Zotlabs\Web\Controller {
+
+ function init() {
+
+ if(argc() > 1 && argv(1) === 'sys' && is_site_admin()) {
+ $sys = get_sys_channel();
+ if($sys && intval($sys['channel_id'])) {
+ \App::$is_sys = true;
+ }
+ }
+
+ if(argc() > 1)
+ $which = argv(1);
+ else
+ return;
+
+ profile_load($a,$which);
+
+ }
+
+
+ function get() {
+
+ if(! \App::$profile) {
+ notice( t('Requested profile is not available.') . EOL );
+ \App::$error = 404;
+ return;
+ }
+
+ $which = argv(1);
+
+ $_SESSION['return_url'] = \App::$query_string;
+
+ $uid = local_channel();
+ $owner = 0;
+ $channel = null;
+ $observer = \App::get_observer();
+
+ $channel = \App::get_channel();
+
+ if(\App::$is_sys && is_site_admin()) {
+ $sys = get_sys_channel();
+ if($sys && intval($sys['channel_id'])) {
+ $uid = $owner = intval($sys['channel_id']);
+ $channel = $sys;
+ $observer = $sys;
+ }
+ }
+
+ if(! $owner) {
+ // Figure out who the page owner is.
+ $r = q("select channel_id from channel where channel_address = '%s'",
+ dbesc($which)
+ );
+ if($r) {
+ $owner = intval($r[0]['channel_id']);
+ }
+ }
+
+ $ob_hash = (($observer) ? $observer['xchan_hash'] : '');
+
+ $perms = get_all_perms($owner,$ob_hash);
+
+ if(! $perms['write_pages']) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ // Block design features from visitors
+
+ if((! $uid) || ($uid != $owner)) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ $mimetype = (($_REQUEST['mimetype']) ? $_REQUEST['mimetype'] : get_pconfig($owner,'system','page_mimetype'));
+
+ if(! $mimetype) {
+ $mimetype = 'choose';
+ }
+
+ $x = array(
+ 'webpage' => ITEM_TYPE_BLOCK,
+ 'is_owner' => true,
+ 'nickname' => \App::$profile['channel_address'],
+ 'lockstate' => (($channel['channel_allow_cid'] || $channel['channel_allow_gid'] || $channel['channel_deny_cid'] || $channel['channel_deny_gid']) ? 'lock' : 'unlock'),
+ 'bang' => '',
+ 'showacl' => false,
+ 'visitor' => true,
+ 'mimetype' => $mimetype,
+ 'ptlabel' => t('Block Name'),
+ 'profile_uid' => intval($owner),
+ 'expanded' => true,
+ 'novoting' => true,
+ 'bbco_autocomplete' => 'bbcode',
+ 'bbcode' => true
+ );
+
+ if($_REQUEST['title'])
+ $x['title'] = $_REQUEST['title'];
+ if($_REQUEST['body'])
+ $x['body'] = $_REQUEST['body'];
+ if($_REQUEST['pagetitle'])
+ $x['pagetitle'] = $_REQUEST['pagetitle'];
+
+ $editor = status_editor($a,$x);
+
+ $r = q("select iid, sid, mid, title, body, mimetype, created, edited from item_id left join item on item_id.iid = item.id
+ where item_id.uid = %d and service = 'BUILDBLOCK' and item_type = %d order by item.created desc",
+ intval($owner),
+ intval(ITEM_TYPE_BLOCK)
+ );
+
+ $pages = null;
+
+ if($r) {
+ $pages = array();
+ foreach($r as $rr) {
+ $element_arr = array(
+ 'type' => 'block',
+ 'title' => $rr['title'],
+ 'body' => $rr['body'],
+ 'created' => $rr['created'],
+ 'edited' => $rr['edited'],
+ 'mimetype' => $rr['mimetype'],
+ 'pagetitle' => $rr['sid'],
+ 'mid' => $rr['mid']
+ );
+ $pages[$rr['iid']][] = array(
+ 'url' => $rr['iid'],
+ 'name' => $rr['sid'],
+ 'title' => $rr['title'],
+ 'created' => $rr['created'],
+ 'edited' => $rr['edited'],
+ 'bb_element' => '[element]' . base64url_encode(json_encode($element_arr)) . '[/element]'
+ );
+ }
+ }
+
+ //Build the base URL for edit links
+ $url = z_root() . '/editblock/' . $which;
+
+ $o .= replace_macros(get_markup_template('blocklist.tpl'), array(
+ '$baseurl' => $url,
+ '$title' => t('Blocks'),
+ '$name' => t('Block Name'),
+ '$blocktitle' => t('Block Title'),
+ '$created' => t('Created'),
+ '$edited' => t('Edited'),
+ '$create' => t('Create'),
+ '$edit' => t('Edit'),
+ '$share' => t('Share'),
+ '$delete' => t('Delete'),
+ '$editor' => $editor,
+ '$pages' => $pages,
+ '$channel' => $which,
+ '$view' => t('View'),
+ '$preview' => '1',
+ ));
+
+ return $o;
+ }
+
+}
diff --git a/Zotlabs/Module/Bookmarks.php b/Zotlabs/Module/Bookmarks.php
new file mode 100644
index 000000000..733bfd4e3
--- /dev/null
+++ b/Zotlabs/Module/Bookmarks.php
@@ -0,0 +1,105 @@
+<?php
+namespace Zotlabs\Module;
+
+
+class Bookmarks extends \Zotlabs\Web\Controller {
+
+ function init() {
+ if(! local_channel())
+ return;
+ $item_id = intval($_REQUEST['item']);
+ $burl = trim($_REQUEST['burl']);
+
+ if(! $item_id)
+ return;
+
+ $u = \App::get_channel();
+
+ $item_normal = item_normal();
+
+ $i = q("select * from item where id = %d and uid = %d $item_normal limit 1",
+ intval($item_id),
+ intval(local_channel())
+ );
+
+ if(! $i)
+ return;
+
+ $i = fetch_post_tags($i);
+
+ $item = $i[0];
+
+ $terms = get_terms_oftype($item['term'],TERM_BOOKMARK);
+
+ if($terms) {
+ require_once('include/bookmarks.php');
+
+ $s = q("select * from xchan where xchan_hash = '%s' limit 1",
+ dbesc($item['author_xchan'])
+ );
+ if(! $s) {
+ logger('mod_bookmarks: author lookup failed.');
+ killme();
+ }
+ foreach($terms as $t) {
+ if($burl) {
+ if($burl == $t['url']) {
+ bookmark_add($u,$s[0],$t,$item['item_private']);
+ }
+ }
+ else
+ bookmark_add($u,$s[0],$t,$item['item_private']);
+
+ info( t('Bookmark added') . EOL);
+ }
+ }
+ killme();
+ }
+
+ function get() {
+ if(! local_channel()) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+
+ require_once('include/menu.php');
+ require_once('include/conversation.php');
+
+ $channel = \App::get_channel();
+
+ $o = profile_tabs($a,true,$channel['channel_address']);
+
+ $o .= '<div class="generic-content-wrapper-styled">';
+
+ $o .= '<h3>' . t('My Bookmarks') . '</h3>';
+
+ $x = menu_list(local_channel(),'',MENU_BOOKMARK);
+
+ if($x) {
+ foreach($x as $xx) {
+ $y = menu_fetch($xx['menu_name'],local_channel(),get_observer_hash());
+ $o .= menu_render($y,'',true);
+ }
+ }
+
+ $o .= '<h3>' . t('My Connections Bookmarks') . '</h3>';
+
+
+ $x = menu_list(local_channel(),'',MENU_SYSTEM|MENU_BOOKMARK);
+
+ if($x) {
+ foreach($x as $xx) {
+ $y = menu_fetch($xx['menu_name'],local_channel(),get_observer_hash());
+ $o .= menu_render($y,'',true);
+ }
+ }
+
+ $o .= '</div>';
+
+ return $o;
+
+ }
+
+
+}
diff --git a/Zotlabs/Module/Branchtopic.php b/Zotlabs/Module/Branchtopic.php
new file mode 100644
index 000000000..87a1a43e9
--- /dev/null
+++ b/Zotlabs/Module/Branchtopic.php
@@ -0,0 +1,47 @@
+<?php
+namespace Zotlabs\Module;
+
+
+class Branchtopic extends \Zotlabs\Web\Controller {
+
+ function init() {
+
+ if(! local_channel())
+ return;
+
+ $item_id = 0;
+
+ if(argc() > 1)
+ $item_id = intval(argv(1));
+
+ if(! $item_id)
+ return;
+
+ $channel = \App::get_channel();
+
+ if(! $channel)
+ return;
+
+
+ $r = q("select * from item where id = %d and uid = %d and owner_xchan = '%s' and id != parent limit 1",
+ intval($item_id),
+ intval(local_channel()),
+ dbesc($channel['channel_hash'])
+ );
+
+ if(! $r)
+ return;
+
+ $p = q("select * from item where id = %d and uid = %d limit 1",
+ intval($r[0]['parent']),
+ intval(local_channel())
+ );
+
+ $x = q("update item set parent = id, route = '', item_thread_top = 1 where id = %d",
+ intval($item_id)
+ );
+
+ return;
+ }
+
+}
diff --git a/Zotlabs/Module/Cal.php b/Zotlabs/Module/Cal.php
new file mode 100644
index 000000000..89967bca1
--- /dev/null
+++ b/Zotlabs/Module/Cal.php
@@ -0,0 +1,357 @@
+<?php
+namespace Zotlabs\Module;
+
+require_once('include/conversation.php');
+require_once('include/bbcode.php');
+require_once('include/datetime.php');
+require_once('include/event.php');
+require_once('include/items.php');
+require_once('include/Contact.php');
+
+
+
+class Cal extends \Zotlabs\Web\Controller {
+
+ function init() {
+ if((get_config('system','block_public')) && (! local_channel()) && (! remote_channel())) {
+ return;
+ }
+
+ $o = '';
+
+ if(argc() > 1) {
+ $nick = argv(1);
+
+ profile_load($a,$nick);
+
+ $channelx = channelx_by_nick($nick);
+
+ if(! $channelx)
+ return;
+
+ \App::$data['channel'] = $channelx;
+
+ $observer = \App::get_observer();
+ \App::$data['observer'] = $observer;
+
+ $observer_xchan = (($observer) ? $observer['xchan_hash'] : '');
+
+ head_set_icon(\App::$data['channel']['xchan_photo_s']);
+
+ \App::$page['htmlhead'] .= "<script> var ispublic = '" . t('everybody') . "'; var profile_uid = " . ((\App::$data['channel']) ? \App::$data['channel']['channel_id'] : 0) . "; </script>" ;
+
+ }
+
+ return;
+ }
+
+
+
+ function get() {
+
+ if((get_config('system','block_public')) && (! local_channel()) && (! remote_channel())) {
+ return;
+ }
+
+
+ $channel = null;
+
+ if(argc() > 1) {
+ $channel = channelx_by_nick(argv(1));
+ }
+
+
+ if(! $channel) {
+ notice( t('Channel not found.') . EOL);
+ return;
+ }
+
+ // since we don't currently have an event permission - use the stream permission
+
+ if(! perm_is_allowed($channel['channel_id'], get_observer_hash(), 'view_stream')) {
+ notice( t('Permissions denied.') . EOL);
+ return;
+ }
+
+ $sql_extra = permissions_sql($channel['channel_id'],get_observer_hash(),'event');
+
+ $first_day = get_pconfig(local_channel(),'system','cal_first_day');
+ $first_day = (($first_day) ? $first_day : 0);
+
+ $htpl = get_markup_template('event_head.tpl');
+ \App::$page['htmlhead'] .= replace_macros($htpl,array(
+ '$baseurl' => z_root(),
+ '$module_url' => '/cal/' . $channel['channel_address'],
+ '$modparams' => 2,
+ '$lang' => \App::$language,
+ '$first_day' => $first_day
+ ));
+
+ $o = '';
+
+ $tabs = profile_tabs($a, True, $channel['channel_address']);
+
+ $mode = 'view';
+ $y = 0;
+ $m = 0;
+ $ignored = ((x($_REQUEST,'ignored')) ? " and ignored = " . intval($_REQUEST['ignored']) . " " : '');
+
+ // logger('args: ' . print_r(\App::$argv,true));
+
+ if(argc() > 3 && intval(argv(2)) && intval(argv(3))) {
+ $mode = 'view';
+ $y = intval(argv(2));
+ $m = intval(argv(3));
+ }
+ if(argc() <= 3) {
+ $mode = 'view';
+ $event_id = argv(2);
+ }
+
+ if($mode == 'view') {
+
+ /* edit/create form */
+ if($event_id) {
+ $r = q("SELECT * FROM `event` WHERE event_hash = '%s' AND `uid` = %d LIMIT 1",
+ dbesc($event_id),
+ intval($channel['channel_id'])
+ );
+ if(count($r))
+ $orig_event = $r[0];
+ }
+
+
+ // Passed parameters overrides anything found in the DB
+ if(!x($orig_event))
+ $orig_event = array();
+
+
+
+ $tz = date_default_timezone_get();
+ if(x($orig_event))
+ $tz = (($orig_event['adjust']) ? date_default_timezone_get() : 'UTC');
+
+ $syear = datetime_convert('UTC', $tz, $sdt, 'Y');
+ $smonth = datetime_convert('UTC', $tz, $sdt, 'm');
+ $sday = datetime_convert('UTC', $tz, $sdt, 'd');
+ $shour = datetime_convert('UTC', $tz, $sdt, 'H');
+ $sminute = datetime_convert('UTC', $tz, $sdt, 'i');
+
+ $stext = datetime_convert('UTC',$tz,$sdt);
+ $stext = substr($stext,0,14) . "00:00";
+
+ $fyear = datetime_convert('UTC', $tz, $fdt, 'Y');
+ $fmonth = datetime_convert('UTC', $tz, $fdt, 'm');
+ $fday = datetime_convert('UTC', $tz, $fdt, 'd');
+ $fhour = datetime_convert('UTC', $tz, $fdt, 'H');
+ $fminute = datetime_convert('UTC', $tz, $fdt, 'i');
+
+ $ftext = datetime_convert('UTC',$tz,$fdt);
+ $ftext = substr($ftext,0,14) . "00:00";
+
+ $type = ((x($orig_event)) ? $orig_event['type'] : 'event');
+
+ $f = get_config('system','event_input_format');
+ if(! $f)
+ $f = 'ymd';
+
+ $catsenabled = feature_enabled($channel['channel_id'],'categories');
+
+
+ $show_bd = perm_is_allowed($channel['channel_id'], get_observer_hash(), 'view_contacts');
+ if(! $show_bd) {
+ $sql_extra .= " and event.type != 'birthday' ";
+ }
+
+
+ $category = '';
+
+ $thisyear = datetime_convert('UTC',date_default_timezone_get(),'now','Y');
+ $thismonth = datetime_convert('UTC',date_default_timezone_get(),'now','m');
+ if(! $y)
+ $y = intval($thisyear);
+ if(! $m)
+ $m = intval($thismonth);
+
+ // Put some limits on dates. The PHP date functions don't seem to do so well before 1900.
+ // An upper limit was chosen to keep search engines from exploring links millions of years in the future.
+
+ if($y < 1901)
+ $y = 1900;
+ if($y > 2099)
+ $y = 2100;
+
+ $nextyear = $y;
+ $nextmonth = $m + 1;
+ if($nextmonth > 12) {
+ $nextmonth = 1;
+ $nextyear ++;
+ }
+
+ $prevyear = $y;
+ if($m > 1)
+ $prevmonth = $m - 1;
+ else {
+ $prevmonth = 12;
+ $prevyear --;
+ }
+
+ $dim = get_dim($y,$m);
+ $start = sprintf('%d-%d-%d %d:%d:%d',$y,$m,1,0,0,0);
+ $finish = sprintf('%d-%d-%d %d:%d:%d',$y,$m,$dim,23,59,59);
+
+
+ if (argv(2) === 'json'){
+ if (x($_GET,'start')) $start = $_GET['start'];
+ if (x($_GET,'end')) $finish = $_GET['end'];
+ }
+
+ $start = datetime_convert('UTC','UTC',$start);
+ $finish = datetime_convert('UTC','UTC',$finish);
+
+ $adjust_start = datetime_convert('UTC', date_default_timezone_get(), $start);
+ $adjust_finish = datetime_convert('UTC', date_default_timezone_get(), $finish);
+
+ if (x($_GET,'id')){
+ $r = q("SELECT event.*, item.plink, item.item_flags, item.author_xchan, item.owner_xchan
+ from event left join item on resource_id = event_hash where resource_type = 'event' and event.uid = %d and event.id = %d $sql_extra limit 1",
+ intval($channel['channel_id']),
+ intval($_GET['id'])
+ );
+ }
+ else {
+ // fixed an issue with "nofinish" events not showing up in the calendar.
+ // There's still an issue if the finish date crosses the end of month.
+ // Noting this for now - it will need to be fixed here and in Friendica.
+ // Ultimately the finish date shouldn't be involved in the query.
+
+ $r = q("SELECT event.*, item.plink, item.item_flags, item.author_xchan, item.owner_xchan
+ from event left join item on event_hash = resource_id
+ where resource_type = 'event' and event.uid = %d $ignored
+ AND (( adjust = 0 AND ( finish >= '%s' or nofinish = 1 ) AND start <= '%s' )
+ OR ( adjust = 1 AND ( finish >= '%s' or nofinish = 1 ) AND start <= '%s' )) $sql_extra ",
+ intval($channel['channel_id']),
+ dbesc($start),
+ dbesc($finish),
+ dbesc($adjust_start),
+ dbesc($adjust_finish)
+ );
+
+ }
+
+ $links = array();
+
+ if($r) {
+ xchan_query($r);
+ $r = fetch_post_tags($r,true);
+
+ $r = sort_by_date($r);
+ }
+
+ if($r) {
+ foreach($r as $rr) {
+ $j = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['start'], 'j') : datetime_convert('UTC','UTC',$rr['start'],'j'));
+ if(! x($links,$j))
+ $links[$j] = z_root() . '/' . \App::$cmd . '#link-' . $j;
+ }
+ }
+
+ $events=array();
+
+ $last_date = '';
+ $fmt = t('l, F j');
+
+ if($r) {
+
+ foreach($r as $rr) {
+
+ $j = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['start'], 'j') : datetime_convert('UTC','UTC',$rr['start'],'j'));
+ $d = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['start'], $fmt) : datetime_convert('UTC','UTC',$rr['start'],$fmt));
+ $d = day_translate($d);
+
+ $start = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['start'], 'c') : datetime_convert('UTC','UTC',$rr['start'],'c'));
+ if ($rr['nofinish']){
+ $end = null;
+ } else {
+ $end = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['finish'], 'c') : datetime_convert('UTC','UTC',$rr['finish'],'c'));
+ }
+
+
+ $is_first = ($d !== $last_date);
+
+ $last_date = $d;
+
+ $edit = false;
+
+ $drop = false;
+
+ $title = strip_tags(html_entity_decode(bbcode($rr['summary']),ENT_QUOTES,'UTF-8'));
+ if(! $title) {
+ list($title, $_trash) = explode("<br",bbcode($rr['desc']),2);
+ $title = strip_tags(html_entity_decode($title,ENT_QUOTES,'UTF-8'));
+ }
+ $html = format_event_html($rr);
+ $rr['desc'] = bbcode($rr['desc']);
+ $rr['location'] = bbcode($rr['location']);
+ $events[] = array(
+ 'id'=>$rr['id'],
+ 'hash' => $rr['event_hash'],
+ 'start'=> $start,
+ 'end' => $end,
+ 'drop' => $drop,
+ 'allDay' => false,
+ 'title' => $title,
+
+ 'j' => $j,
+ 'd' => $d,
+ 'edit' => $edit,
+ 'is_first'=>$is_first,
+ 'item'=>$rr,
+ 'html'=>$html,
+ 'plink' => array($rr['plink'],t('Link to Source'),'',''),
+ );
+
+
+ }
+ }
+
+ if (argv(2) === 'json'){
+ echo json_encode($events); killme();
+ }
+
+ // links: array('href', 'text', 'extra css classes', 'title')
+ if (x($_GET,'id')){
+ $tpl = get_markup_template("event_cal.tpl");
+ }
+ else {
+ $tpl = get_markup_template("events_cal-js.tpl");
+ }
+
+ $nick = $channel['channel_address'];
+
+ $o = replace_macros($tpl, array(
+ '$baseurl' => z_root(),
+ '$new_event' => array(z_root().'/cal',(($event_id) ? t('Edit Event') : t('Create Event')),'',''),
+ '$previus' => array(z_root()."/cal/$nick/$prevyear/$prevmonth",t('Previous'),'',''),
+ '$next' => array(z_root()."/cal/$nick/$nextyear/$nextmonth",t('Next'),'',''),
+ '$export' => array(z_root()."/cal/$nick/$y/$m/export",t('Export'),'',''),
+ '$calendar' => cal($y,$m,$links, ' eventcal'),
+ '$events' => $events,
+ '$upload' => t('Import'),
+ '$submit' => t('Submit'),
+ '$prev' => t('Previous'),
+ '$next' => t('Next'),
+ '$today' => t('Today'),
+ '$form' => $form,
+ '$expandform' => ((x($_GET,'expandform')) ? true : false),
+ '$tabs' => $tabs
+ ));
+
+ if (x($_GET,'id')){ echo $o; killme(); }
+
+ return $o;
+ }
+
+ }
+
+}
diff --git a/mod/channel.php b/Zotlabs/Module/Channel.php
index 9bc7332dc..36f13e775 100644
--- a/mod/channel.php
+++ b/Zotlabs/Module/Channel.php
@@ -1,4 +1,6 @@
<?php
+namespace Zotlabs\Module;
+
require_once('include/contact_widgets.php');
require_once('include/items.php');
@@ -8,15 +10,16 @@ require_once('include/conversation.php');
require_once('include/acl_selectors.php');
require_once('include/permissions.php');
+class Channel extends \Zotlabs\Web\Controller {
-function channel_init(&$a) {
+function init() {
$which = null;
if(argc() > 1)
$which = argv(1);
if(! $which) {
if(local_channel()) {
- $channel = App::get_channel();
+ $channel = \App::get_channel();
if($channel && $channel['channel_address'])
$which = $channel['channel_address'];
}
@@ -27,19 +30,19 @@ function channel_init(&$a) {
}
$profile = 0;
- $channel = App::get_channel();
+ $channel = \App::get_channel();
if((local_channel()) && (argc() > 2) && (argv(2) === 'view')) {
$which = $channel['channel_address'];
$profile = argv(1);
}
- App::$page['htmlhead'] .= '<link rel="alternate" type="application/atom+xml" title="' . t('Posts and comments') . '" href="' . z_root() . '/feed/' . $which . '" />' . "\r\n" ;
- App::$page['htmlhead'] .= '<link rel="alternate" type="application/atom+xml" title="' . t('Only posts') . '" href="' . z_root() . '/feed/' . $which . '?top=1" />' . "\r\n" ;
+ \App::$page['htmlhead'] .= '<link rel="alternate" type="application/atom+xml" title="' . t('Posts and comments') . '" href="' . z_root() . '/feed/' . $which . '" />' . "\r\n" ;
+ \App::$page['htmlhead'] .= '<link rel="alternate" type="application/atom+xml" title="' . t('Only posts') . '" href="' . z_root() . '/feed/' . $which . '?top=1" />' . "\r\n" ;
// Not yet ready for prime time
-// App::$page['htmlhead'] .= '<link rel="openid.server" href="' . z_root() . '/id/' . $which .'?f=" />' . "\r\n" ;
-// App::$page['htmlhead'] .= '<link rel="openid.delegate" href="' . z_root() . '/channel/' . $which .'" />' . "\r\n" ;
+// \App::$page['htmlhead'] .= '<link rel="openid.server" href="' . z_root() . '/id/' . $which .'?f=" />' . "\r\n" ;
+// \App::$page['htmlhead'] .= '<link rel="openid.delegate" href="' . z_root() . '/channel/' . $which .'" />' . "\r\n" ;
// Run profile_load() here to make sure the theme is set before
// we start loading content
@@ -48,13 +51,13 @@ function channel_init(&$a) {
}
-function channel_content(&$a, $update = 0, $load = false) {
+function get($update = 0, $load = false) {
if($load)
$_SESSION['loadtime'] = datetime_convert();
- $checkjs = new Zotlabs\Web\CheckJS();
+ $checkjs = new \Zotlabs\Web\CheckJS(1);
$category = $datequery = $datequery2 = '';
@@ -76,27 +79,27 @@ function channel_content(&$a, $update = 0, $load = false) {
if($update) {
// Ensure we've got a profile owner if updating.
- App::$profile['profile_uid'] = App::$profile_uid = $update;
+ \App::$profile['profile_uid'] = \App::$profile_uid = $update;
}
else {
- if(App::$profile['profile_uid'] == local_channel()) {
+ if(\App::$profile['profile_uid'] == local_channel()) {
nav_set_selected('home');
}
}
- $is_owner = (((local_channel()) && (App::$profile['profile_uid'] == local_channel())) ? true : false);
+ $is_owner = (((local_channel()) && (\App::$profile['profile_uid'] == local_channel())) ? true : false);
- $channel = App::get_channel();
- $observer = App::get_observer();
+ $channel = \App::get_channel();
+ $observer = \App::get_observer();
$ob_hash = (($observer) ? $observer['xchan_hash'] : '');
- $perms = get_all_perms(App::$profile['profile_uid'],$ob_hash);
+ $perms = get_all_perms(\App::$profile['profile_uid'],$ob_hash);
if(! $perms['view_stream']) {
// We may want to make the target of this redirect configurable
if($perms['view_profile']) {
notice( t('Insufficient permissions. Request redirected to profile page.') . EOL);
- goaway (z_root() . "/profile/" . App::$profile['channel_address']);
+ goaway (z_root() . "/profile/" . \App::$profile['channel_address']);
}
notice( t('Permission denied.') . EOL);
return;
@@ -105,9 +108,9 @@ function channel_content(&$a, $update = 0, $load = false) {
if(! $update) {
- $o .= profile_tabs($a, $is_owner, App::$profile['channel_address']);
+ $o .= profile_tabs($a, $is_owner, \App::$profile['channel_address']);
- $o .= common_friends_visitor_widget(App::$profile['profile_uid']);
+ $o .= common_friends_visitor_widget(\App::$profile['profile_uid']);
if($channel && $is_owner) {
$channel_acl = array(
@@ -125,15 +128,15 @@ function channel_content(&$a, $update = 0, $load = false) {
$x = array(
'is_owner' => $is_owner,
- 'allow_location' => ((($is_owner || $observer) && (intval(get_pconfig(App::$profile['profile_uid'],'system','use_browser_location')))) ? true : false),
- 'default_location' => (($is_owner) ? App::$profile['channel_location'] : ''),
- 'nickname' => App::$profile['channel_address'],
- 'lockstate' => (((strlen(App::$profile['channel_allow_cid'])) || (strlen(App::$profile['channel_allow_gid'])) || (strlen(App::$profile['channel_deny_cid'])) || (strlen(App::$profile['channel_deny_gid']))) ? 'lock' : 'unlock'),
- 'acl' => (($is_owner) ? populate_acl($channel_acl,true,((App::$profile['channel_r_stream'] & PERMS_PUBLIC) ? t('Public') : '')) : ''),
+ 'allow_location' => ((($is_owner || $observer) && (intval(get_pconfig(\App::$profile['profile_uid'],'system','use_browser_location')))) ? true : false),
+ 'default_location' => (($is_owner) ? \App::$profile['channel_location'] : ''),
+ 'nickname' => \App::$profile['channel_address'],
+ 'lockstate' => (((strlen(\App::$profile['channel_allow_cid'])) || (strlen(\App::$profile['channel_allow_gid'])) || (strlen(\App::$profile['channel_deny_cid'])) || (strlen(\App::$profile['channel_deny_gid']))) ? 'lock' : 'unlock'),
+ 'acl' => (($is_owner) ? populate_acl($channel_acl,true,((\App::$profile['channel_r_stream'] & PERMS_PUBLIC) ? t('Public') : '')) : ''),
'showacl' => (($is_owner) ? 'yes' : ''),
'bang' => '',
'visitor' => (($is_owner || $observer) ? true : false),
- 'profile_uid' => App::$profile['profile_uid'],
+ 'profile_uid' => \App::$profile['profile_uid'],
'editor_autocomplete' => true,
'bbco_autocomplete' => 'bbcode',
'bbcode' => true
@@ -150,18 +153,18 @@ function channel_content(&$a, $update = 0, $load = false) {
*/
$item_normal = item_normal();
- $sql_extra = item_permissions_sql(App::$profile['profile_uid']);
+ $sql_extra = item_permissions_sql(\App::$profile['profile_uid']);
- if(get_pconfig(App::$profile['profile_uid'],'system','channel_list_mode') && (! $mid))
+ if(get_pconfig(\App::$profile['profile_uid'],'system','channel_list_mode') && (! $mid))
$page_mode = 'list';
else
$page_mode = 'client';
- $abook_uids = " and abook.abook_channel = " . intval(App::$profile['profile_uid']) . " ";
+ $abook_uids = " and abook.abook_channel = " . intval(\App::$profile['profile_uid']) . " ";
$simple_update = (($update) ? " AND item_unseen = 1 " : '');
- App::$page['htmlhead'] .= "\r\n" . '<link rel="alternate" type="application/json+oembed" href="' . z_root() . '/oep?f=&url=' . urlencode(z_root() . '/' . App::$query_string) . '" title="oembed" />' . "\r\n";
+ \App::$page['htmlhead'] .= "\r\n" . '<link rel="alternate" type="application/json+oembed" href="' . z_root() . '/oep?f=&url=' . urlencode(z_root() . '/' . \App::$query_string) . '" title="oembed" />' . "\r\n";
if($update && $_SESSION['loadtime'])
$simple_update = " AND (( item_unseen = 1 AND item.changed > '" . datetime_convert('UTC','UTC',$_SESSION['loadtime']) . "' ) OR item.changed > '" . datetime_convert('UTC','UTC',$_SESSION['loadtime']) . "' ) ";
@@ -174,7 +177,7 @@ function channel_content(&$a, $update = 0, $load = false) {
$r = q("SELECT parent AS item_id from item where mid like '%s' and uid = %d $item_normal
AND item_wall = 1 AND item_unseen = 1 $sql_extra limit 1",
dbesc($mid . '%'),
- intval(App::$profile['profile_uid'])
+ intval(\App::$profile['profile_uid'])
);
} else {
$r = q("SELECT distinct parent AS `item_id`, created from item
@@ -184,7 +187,7 @@ function channel_content(&$a, $update = 0, $load = false) {
AND (abook.abook_blocked = 0 or abook.abook_flags is null)
$sql_extra
ORDER BY created DESC",
- intval(App::$profile['profile_uid'])
+ intval(\App::$profile['profile_uid'])
);
$_SESSION['loadtime'] = datetime_convert();
}
@@ -207,15 +210,15 @@ function channel_content(&$a, $update = 0, $load = false) {
}
$itemspage = get_pconfig(local_channel(),'system','itemspage');
- App::set_pager_itemspage(((intval($itemspage)) ? $itemspage : 20));
- $pager_sql = sprintf(" LIMIT %d OFFSET %d ", intval(App::$pager['itemspage']), intval(App::$pager['start']));
+ \App::set_pager_itemspage(((intval($itemspage)) ? $itemspage : 20));
+ $pager_sql = sprintf(" LIMIT %d OFFSET %d ", intval(\App::$pager['itemspage']), intval(\App::$pager['start']));
if($load || ($checkjs->disabled())) {
if ($mid) {
$r = q("SELECT parent AS item_id from item where mid = '%s' and uid = %d $item_normal
AND item_wall = 1 $sql_extra limit 1",
dbesc($mid),
- intval(App::$profile['profile_uid'])
+ intval(\App::$profile['profile_uid'])
);
if (! $r) {
notice( t('Permission denied.') . EOL);
@@ -229,7 +232,7 @@ function channel_content(&$a, $update = 0, $load = false) {
AND (abook_blocked = 0 or abook.abook_flags is null)
$sql_extra $sql_extra2
ORDER BY created DESC $pager_sql ",
- intval(App::$profile['profile_uid'])
+ intval(\App::$profile['profile_uid'])
);
}
}
@@ -247,7 +250,7 @@ function channel_content(&$a, $update = 0, $load = false) {
WHERE `item`.`uid` = %d $item_normal
AND `item`.`parent` IN ( %s )
$sql_extra ",
- intval(App::$profile['profile_uid']),
+ intval(\App::$profile['profile_uid']),
dbesc($parents_str)
);
@@ -270,19 +273,19 @@ function channel_content(&$a, $update = 0, $load = false) {
// This is ugly, but we can't pass the profile_uid through the session to the ajax updater,
// because browser prefetching might change it on us. We have to deliver it with the page.
- $maxheight = get_pconfig(App::$profile['profile_uid'],'system','channel_divmore_height');
+ $maxheight = get_pconfig(\App::$profile['profile_uid'],'system','channel_divmore_height');
if(! $maxheight)
$maxheight = 400;
$o .= '<div id="live-channel"></div>' . "\r\n";
- $o .= "<script> var profile_uid = " . App::$profile['profile_uid']
- . "; var netargs = '?f='; var profile_page = " . App::$pager['page']
+ $o .= "<script> var profile_uid = " . \App::$profile['profile_uid']
+ . "; var netargs = '?f='; var profile_page = " . \App::$pager['page']
. "; divmore_height = " . intval($maxheight) . "; </script>\r\n";
- App::$page['htmlhead'] .= replace_macros(get_markup_template("build_query.tpl"),array(
+ \App::$page['htmlhead'] .= replace_macros(get_markup_template("build_query.tpl"),array(
'$baseurl' => z_root(),
'$pgtype' => 'channel',
- '$uid' => ((App::$profile['profile_uid']) ? App::$profile['profile_uid'] : '0'),
+ '$uid' => ((\App::$profile['profile_uid']) ? \App::$profile['profile_uid'] : '0'),
'$gid' => '0',
'$cid' => '0',
'$cmin' => '0',
@@ -294,7 +297,7 @@ function channel_content(&$a, $update = 0, $load = false) {
'$nouveau' => '0',
'$wall' => '1',
'$fh' => '0',
- '$page' => ((App::$pager['page'] != 1) ? App::$pager['page'] : 1),
+ '$page' => ((\App::$pager['page'] != 1) ? \App::$pager['page'] : 1),
'$search' => '',
'$order' => '',
'$list' => ((x($_REQUEST,'list')) ? intval($_REQUEST['list']) : 0),
@@ -348,7 +351,7 @@ function channel_content(&$a, $update = 0, $load = false) {
if((! $update) || ($checkjs->disabled())) {
$o .= alt_pager($a,count($items));
if ($mid && $items[0]['title'])
- App::$page['title'] = $items[0]['title'] . " - " . App::$page['title'];
+ \App::$page['title'] = $items[0]['title'] . " - " . \App::$page['title'];
}
if($mid)
@@ -356,3 +359,6 @@ function channel_content(&$a, $update = 0, $load = false) {
return $o;
}
+
+
+} \ No newline at end of file
diff --git a/Zotlabs/Module/Chanview.php b/Zotlabs/Module/Chanview.php
new file mode 100644
index 000000000..f70444816
--- /dev/null
+++ b/Zotlabs/Module/Chanview.php
@@ -0,0 +1,110 @@
+<?php
+namespace Zotlabs\Module;
+
+require_once('include/Contact.php');
+require_once('include/zot.php');
+
+
+class Chanview extends \Zotlabs\Web\Controller {
+
+ function get() {
+
+ $observer = \App::get_observer();
+ $xchan = null;
+
+ $r = null;
+
+ if($_REQUEST['hash']) {
+ $r = q("select * from xchan where xchan_hash = '%s' limit 1",
+ dbesc($_REQUEST['hash'])
+ );
+ }
+ if($_REQUEST['address']) {
+ $r = q("select * from xchan where xchan_addr = '%s' limit 1",
+ dbesc($_REQUEST['address'])
+ );
+ }
+ elseif(local_channel() && intval($_REQUEST['cid'])) {
+ $r = q("SELECT abook.*, xchan.*
+ FROM abook left join xchan on abook_xchan = xchan_hash
+ WHERE abook_channel = %d and abook_id = %d LIMIT 1",
+ intval(local_channel()),
+ intval($_REQUEST['cid'])
+ );
+ }
+ elseif($_REQUEST['url']) {
+
+ // if somebody re-installed they will have more than one xchan, use the most recent name date as this is
+ // the most useful consistently ascending table item we have.
+
+ $r = q("select * from xchan where xchan_url = '%s' order by xchan_name_date desc limit 1",
+ dbesc($_REQUEST['url'])
+ );
+ }
+ if($r) {
+ \App::$poi = $r[0];
+ }
+
+
+ // Here, let's see if we have an xchan. If we don't, how we proceed is determined by what
+ // info we do have. If it's a URL, we can offer to visit it directly. If it's a webbie or
+ // address, we can and should try to import it. If it's just a hash, we can't continue, but we
+ // probably wouldn't have a hash if we don't already have an xchan for this channel.
+
+ if(! \App::$poi) {
+ logger('mod_chanview: fallback');
+ // This is hackish - construct a zot address from the url
+ if($_REQUEST['url']) {
+ if(preg_match('/https?\:\/\/(.*?)(\/channel\/|\/profile\/)(.*?)$/ism',$_REQUEST['url'],$matches)) {
+ $_REQUEST['address'] = $matches[3] . '@' . $matches[1];
+ }
+ logger('mod_chanview: constructed address ' . print_r($matches,true));
+ }
+
+ if($_REQUEST['address']) {
+ $ret = zot_finger($_REQUEST['address'],null);
+ if($ret['success']) {
+ $j = json_decode($ret['body'],true);
+ if($j)
+ import_xchan($j);
+ $r = q("select * from xchan where xchan_addr = '%s' limit 1",
+ dbesc($_REQUEST['address'])
+ );
+ if($r)
+ \App::$poi = $r[0];
+ }
+
+ }
+ }
+
+ if(! \App::$poi) {
+ // We don't know who this is, and we can't figure it out from the URL
+ // On the plus side, there's a good chance we know somebody else at that
+ // hub so sending them there with a Zid will probably work anyway.
+ $url = ($_REQUEST['url']);
+ if($observer)
+ $url = zid($url);
+ }
+
+ if (\App::$poi) {
+ $url = \App::$poi['xchan_url'];
+ if($observer)
+ $url = zid($url);
+ }
+ // let somebody over-ride the iframed viewport presentation
+ // or let's just declare this a failed experiment.
+
+ // if((! local_channel()) || (get_pconfig(local_channel(),'system','chanview_full')))
+
+ goaway($url);
+
+ // $o = replace_macros(get_markup_template('chanview.tpl'),array(
+ // '$url' => $url,
+ // '$full' => t('toggle full screen mode')
+ // ));
+
+ // return $o;
+
+ }
+
+}
diff --git a/Zotlabs/Module/Chat.php b/Zotlabs/Module/Chat.php
new file mode 100644
index 000000000..9508ed3de
--- /dev/null
+++ b/Zotlabs/Module/Chat.php
@@ -0,0 +1,261 @@
+<?php
+namespace Zotlabs\Module; /** @file */
+
+require_once('include/chat.php');
+require_once('include/bookmarks.php');
+
+
+class Chat extends \Zotlabs\Web\Controller {
+
+ function init() {
+
+ $which = null;
+ if(argc() > 1)
+ $which = argv(1);
+ if(! $which) {
+ if(local_channel()) {
+ $channel = \App::get_channel();
+ if($channel && $channel['channel_address'])
+ $which = $channel['channel_address'];
+ }
+ }
+ if(! $which) {
+ notice( t('You must be logged in to see this page.') . EOL );
+ return;
+ }
+
+ $profile = 0;
+ $channel = \App::get_channel();
+
+ if((local_channel()) && (argc() > 2) && (argv(2) === 'view')) {
+ $which = $channel['channel_address'];
+ $profile = argv(1);
+ }
+
+ \App::$page['htmlhead'] .= '<link rel="alternate" type="application/atom+xml" href="' . z_root() . '/feed/' . $which .'" />' . "\r\n" ;
+
+ // Run profile_load() here to make sure the theme is set before
+ // we start loading content
+
+ profile_load($a,$which,$profile);
+
+ }
+
+ function post() {
+
+ if($_POST['room_name'])
+ $room = strip_tags(trim($_POST['room_name']));
+
+ if((! $room) || (! local_channel()))
+ return;
+
+ $channel = \App::get_channel();
+
+
+ if($_POST['action'] === 'drop') {
+ logger('delete chatroom');
+ chatroom_destroy($channel,array('cr_name' => $room));
+ goaway(z_root() . '/chat/' . $channel['channel_address']);
+ }
+
+ $acl = new \Zotlabs\Access\AccessList($channel);
+ $acl->set_from_array($_REQUEST);
+
+ $arr = $acl->get();
+ $arr['name'] = $room;
+ $arr['expire'] = intval($_POST['chat_expire']);
+ if(intval($arr['expire']) < 0)
+ $arr['expire'] = 0;
+
+ chatroom_create($channel,$arr);
+
+ $x = q("select * from chatroom where cr_name = '%s' and cr_uid = %d limit 1",
+ dbesc($room),
+ intval(local_channel())
+ );
+
+ build_sync_packet(0, array('chatroom' => $x));
+
+ if($x)
+ goaway(z_root() . '/chat/' . $channel['channel_address'] . '/' . $x[0]['cr_id']);
+
+ // that failed. Try again perhaps?
+
+ goaway(z_root() . '/chat/' . $channel['channel_address'] . '/new');
+
+
+ }
+
+
+ function get() {
+
+ if(local_channel())
+ $channel = \App::get_channel();
+
+ $ob = \App::get_observer();
+ $observer = get_observer_hash();
+ if(! $observer) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ if(! perm_is_allowed(\App::$profile['profile_uid'],$observer,'chat')) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ if((argc() > 3) && intval(argv(2)) && (argv(3) === 'leave')) {
+ chatroom_leave($observer,argv(2),$_SERVER['REMOTE_ADDR']);
+ goaway(z_root() . '/channel/' . argv(1));
+ }
+
+
+ if((argc() > 3) && intval(argv(2)) && (argv(3) === 'status')) {
+ $ret = array('success' => false);
+ $room_id = intval(argv(2));
+ if(! $room_id || ! $observer)
+ return;
+
+ $r = q("select * from chatroom where cr_id = %d limit 1",
+ intval($room_id)
+ );
+ if(! $r) {
+ json_return_and_die($ret);
+ }
+ require_once('include/security.php');
+ $sql_extra = permissions_sql($r[0]['cr_uid']);
+
+ $x = q("select * from chatroom where cr_id = %d and cr_uid = %d $sql_extra limit 1",
+ intval($room_id),
+ intval($r[0]['cr_uid'])
+ );
+ if(! $x) {
+ json_return_and_die($ret);
+ }
+ $y = q("select count(*) as total from chatpresence where cp_room = %d",
+ intval($room_id)
+ );
+ if($y) {
+ $ret['success'] = true;
+ $ret['chatroom'] = $r[0]['cr_name'];
+ $ret['inroom'] = $y[0]['total'];
+ }
+
+ // figure out how to present a timestamp of the last activity, since we don't know the observer's timezone.
+
+ $z = q("select created from chat where chat_room = %d order by created desc limit 1",
+ intval($room_id)
+ );
+ if($z) {
+ $ret['last'] = $z[0]['created'];
+ }
+ json_return_and_die($ret);
+ }
+
+
+ if(argc() > 2 && intval(argv(2))) {
+
+ $room_id = intval(argv(2));
+ $bookmark_link = get_bookmark_link($ob);
+
+ $x = chatroom_enter($observer,$room_id,'online',$_SERVER['REMOTE_ADDR']);
+ if(! $x)
+ return;
+ $x = q("select * from chatroom where cr_id = %d and cr_uid = %d $sql_extra limit 1",
+ intval($room_id),
+ intval(\App::$profile['profile_uid'])
+ );
+
+ if($x) {
+ $acl = new \Zotlabs\Access\AccessList(false);
+ $acl->set($x[0]);
+
+ $private = $acl->is_private();
+ $room_name = $x[0]['cr_name'];
+ if($bookmark_link)
+ $bookmark_link .= '&url=' . z_root() . '/chat/' . argv(1) . '/' . argv(2) . '&title=' . urlencode($x[0]['cr_name']) . (($private) ? '&private=1' : '') . '&ischat=1';
+ }
+ else {
+ notice( t('Room not found') . EOL);
+ return;
+ }
+
+ $cipher = get_pconfig(local_channel(),'system','default_cipher');
+ if(! $cipher)
+ $cipher = 'aes256';
+
+
+ $o = replace_macros(get_markup_template('chat.tpl'),array(
+ '$is_owner' => ((local_channel() && local_channel() == $x[0]['cr_uid']) ? true : false),
+ '$room_name' => $room_name,
+ '$room_id' => $room_id,
+ '$baseurl' => z_root(),
+ '$nickname' => argv(1),
+ '$submit' => t('Submit'),
+ '$leave' => t('Leave Room'),
+ '$drop' => t('Delete Room'),
+ '$away' => t('I am away right now'),
+ '$online' => t('I am online'),
+ '$bookmark_link' => $bookmark_link,
+ '$bookmark' => t('Bookmark this room'),
+ '$feature_encrypt' => ((feature_enabled(local_channel(),'content_encrypt')) ? true : false),
+ '$cipher' => $cipher,
+ '$linkurl' => t('Please enter a link URL:'),
+ '$encrypt' => t('Encrypt text'),
+ '$insert' => t('Insert web link')
+ ));
+ return $o;
+ }
+
+
+ require_once('include/conversation.php');
+
+ $o = profile_tabs($a,((local_channel() && local_channel() == \App::$profile['profile_uid']) ? true : false),\App::$profile['channel_address']);
+
+ if(! feature_enabled(\App::$profile['profile_uid'],'ajaxchat')) {
+ notice( t('Feature disabled.') . EOL);
+ return $o;
+ }
+
+
+ $acl = new \Zotlabs\Access\AccessList($channel);
+ $channel_acl = $acl->get();
+
+ $lockstate = (($channel_acl['allow_cid'] || $channel_acl['allow_gid'] || $channel_acl['deny_cid'] || $channel_acl['deny_gid']) ? 'lock' : 'unlock');
+ require_once('include/acl_selectors.php');
+
+ $chatroom_new = '';
+ if(local_channel()) {
+ $chatroom_new = replace_macros(get_markup_template('chatroom_new.tpl'),array(
+ '$header' => t('New Chatroom'),
+ '$name' => array('room_name',t('Chatroom name'),'', ''),
+ '$chat_expire' => array('chat_expire',t('Expiration of chats (minutes)'),120,''),
+ '$permissions' => t('Permissions'),
+ '$acl' => populate_acl($channel_acl,false),
+ '$lockstate' => $lockstate,
+ '$submit' => t('Submit')
+
+ ));
+ }
+
+ $rooms = chatroom_list(\App::$profile['profile_uid']);
+
+ $o .= replace_macros(get_markup_template('chatrooms.tpl'), array(
+ '$header' => sprintf( t('%1$s\'s Chatrooms'), \App::$profile['name']),
+ '$name' => t('Name'),
+ '$baseurl' => z_root(),
+ '$nickname' => \App::$profile['channel_address'],
+ '$rooms' => $rooms,
+ '$norooms' => t('No chatrooms available'),
+ '$newroom' => t('Create New'),
+ '$is_owner' => ((local_channel() && local_channel() == \App::$profile['profile_uid']) ? 1 : 0),
+ '$chatroom_new' => $chatroom_new,
+ '$expire' => t('Expiration'),
+ '$expire_unit' => t('min') //minutes
+ ));
+
+ return $o;
+
+ }
+
+}
diff --git a/Zotlabs/Module/Chatsvc.php b/Zotlabs/Module/Chatsvc.php
new file mode 100644
index 000000000..a9bc97301
--- /dev/null
+++ b/Zotlabs/Module/Chatsvc.php
@@ -0,0 +1,168 @@
+<?php
+namespace Zotlabs\Module; /** @file */
+
+require_once('include/security.php');
+
+
+class Chatsvc extends \Zotlabs\Web\Controller {
+
+ function init() {
+
+ //logger('chatsvc');
+
+ $ret = array('success' => false);
+
+ \App::$data['chat']['room_id'] = intval($_REQUEST['room_id']);
+ $x = q("select cr_uid from chatroom where cr_id = %d and cr_id != 0 limit 1",
+ intval(\App::$data['chat']['room_id'])
+ );
+ if(! $x)
+ json_return_and_die($ret);
+
+ \App::$data['chat']['uid'] = $x[0]['cr_uid'];
+
+ if(! perm_is_allowed(\App::$data['chat']['uid'],get_observer_hash(),'chat')) {
+ json_return_and_die($ret);
+ }
+
+ }
+
+ function post() {
+
+ $ret = array('success' => false);
+
+ $room_id = \App::$data['chat']['room_id'];
+ $text = escape_tags($_REQUEST['chat_text']);
+ if(! $text)
+ return;
+
+ $sql_extra = permissions_sql(\App::$data['chat']['uid']);
+
+ $r = q("select * from chatroom where cr_uid = %d and cr_id = %d $sql_extra",
+ intval(\App::$data['chat']['uid']),
+ intval(\App::$data['chat']['room_id'])
+ );
+ if(! $r)
+ json_return_and_die($ret);
+
+ $arr = array(
+ 'chat_room' => \App::$data['chat']['room_id'],
+ 'chat_xchan' => get_observer_hash(),
+ 'chat_text' => $text
+ );
+
+ call_hooks('chat_post',$arr);
+
+ $x = q("insert into chat ( chat_room, chat_xchan, created, chat_text )
+ values( %d, '%s', '%s', '%s' )",
+ intval(\App::$data['chat']['room_id']),
+ dbesc(get_observer_hash()),
+ dbesc(datetime_convert()),
+ dbesc($arr['chat_text'])
+ );
+
+ $ret['success'] = true;
+ json_return_and_die($ret);
+ }
+
+ function get() {
+
+ $status = strip_tags($_REQUEST['status']);
+ $room_id = intval(\App::$data['chat']['room_id']);
+ $stopped = ((x($_REQUEST,'stopped') && intval($_REQUEST['stopped'])) ? true : false);
+
+ if($status && $room_id) {
+
+ $x = q("select channel_address from channel where channel_id = %d limit 1",
+ intval(\App::$data['chat']['uid'])
+ );
+
+ $r = q("update chatpresence set cp_status = '%s', cp_last = '%s' where cp_room = %d and cp_xchan = '%s' and cp_client = '%s'",
+ dbesc($status),
+ dbesc(datetime_convert()),
+ intval($room_id),
+ dbesc(get_observer_hash()),
+ dbesc($_SERVER['REMOTE_ADDR'])
+ );
+
+ goaway(z_root() . '/chat/' . $x[0]['channel_address'] . '/' . $room_id);
+ }
+
+ if(! $stopped) {
+
+ $lastseen = intval($_REQUEST['last']);
+
+ $ret = array('success' => false);
+
+ $sql_extra = permissions_sql(\App::$data['chat']['uid']);
+
+ $r = q("select * from chatroom where cr_uid = %d and cr_id = %d $sql_extra",
+ intval(\App::$data['chat']['uid']),
+ intval(\App::$data['chat']['room_id'])
+ );
+ if(! $r)
+ json_return_and_die($ret);
+
+ $inroom = array();
+
+ $r = q("select * from chatpresence left join xchan on xchan_hash = cp_xchan where cp_room = %d order by xchan_name",
+ intval(\App::$data['chat']['room_id'])
+ );
+ if($r) {
+ foreach($r as $rr) {
+ switch($rr['cp_status']) {
+ case 'away':
+ $status = t('Away');
+ $status_class = 'away';
+ break;
+ case 'online':
+ default:
+ $status = t('Online');
+ $status_class = 'online';
+ break;
+ }
+
+ $inroom[] = array('img' => zid($rr['xchan_photo_m']), 'img_type' => $rr['xchan_photo_mimetype'],'name' => $rr['xchan_name'], 'status' => $status, 'status_class' => $status_class);
+ }
+ }
+
+ $chats = array();
+
+ $r = q("select * from chat left join xchan on chat_xchan = xchan_hash where chat_room = %d and chat_id > %d order by created",
+ intval(\App::$data['chat']['room_id']),
+ intval($lastseen)
+ );
+ if($r) {
+ foreach($r as $rr) {
+ $chats[] = array(
+ 'id' => $rr['chat_id'],
+ 'img' => zid($rr['xchan_photo_m']),
+ 'img_type' => $rr['xchan_photo_mimetype'],
+ 'name' => $rr['xchan_name'],
+ 'isotime' => datetime_convert('UTC', date_default_timezone_get(), $rr['created'], 'c'),
+ 'localtime' => datetime_convert('UTC', date_default_timezone_get(), $rr['created'], 'r'),
+ 'text' => smilies(bbcode($rr['chat_text'])),
+ 'self' => ((get_observer_hash() == $rr['chat_xchan']) ? 'self' : '')
+ );
+ }
+ }
+ }
+
+ $r = q("update chatpresence set cp_last = '%s' where cp_room = %d and cp_xchan = '%s' and cp_client = '%s'",
+ dbesc(datetime_convert()),
+ intval(\App::$data['chat']['room_id']),
+ dbesc(get_observer_hash()),
+ dbesc($_SERVER['REMOTE_ADDR'])
+ );
+
+ $ret['success'] = true;
+ if(! $stopped) {
+ $ret['inroom'] = $inroom;
+ $ret['chats'] = $chats;
+ }
+ json_return_and_die($ret);
+
+ }
+
+
+}
diff --git a/Zotlabs/Module/Cloud.php b/Zotlabs/Module/Cloud.php
new file mode 100644
index 000000000..5f40f4af1
--- /dev/null
+++ b/Zotlabs/Module/Cloud.php
@@ -0,0 +1,110 @@
+<?php
+namespace Zotlabs\Module;
+/**
+ * @file mod/cloud.php
+ * @brief Initialize Hubzilla's cloud (SabreDAV).
+ *
+ * Module for accessing the DAV storage area.
+ */
+
+use Sabre\DAV as SDAV;
+use \Zotlabs\Storage;
+
+// composer autoloader for SabreDAV
+require_once('vendor/autoload.php');
+
+/**
+ * @brief Fires up the SabreDAV server.
+ *
+ * @param App &$a
+ */
+
+
+class Cloud extends \Zotlabs\Web\Controller {
+
+ function init() {
+ require_once('include/reddav.php');
+
+ if (! is_dir('store'))
+ os_mkdir('store', STORAGE_DEFAULT_PERMISSIONS, false);
+
+ $which = null;
+ if (argc() > 1)
+ $which = argv(1);
+
+ $profile = 0;
+
+ \App::$page['htmlhead'] .= '<link rel="alternate" type="application/atom+xml" href="' . z_root() . '/feed/' . $which . '" />' . "\r\n";
+
+ if ($which)
+ profile_load($a, $which, $profile);
+
+ $auth = new \Zotlabs\Storage\BasicAuth();
+
+ $ob_hash = get_observer_hash();
+
+ if ($ob_hash) {
+ if (local_channel()) {
+ $channel = \App::get_channel();
+ $auth->setCurrentUser($channel['channel_address']);
+ $auth->channel_id = $channel['channel_id'];
+ $auth->channel_hash = $channel['channel_hash'];
+ $auth->channel_account_id = $channel['channel_account_id'];
+ if($channel['channel_timezone'])
+ $auth->setTimezone($channel['channel_timezone']);
+ }
+ $auth->observer = $ob_hash;
+ }
+
+ if ($_GET['davguest'])
+ $_SESSION['davguest'] = true;
+
+ $_SERVER['QUERY_STRING'] = str_replace(array('?f=', '&f='), array('', ''), $_SERVER['QUERY_STRING']);
+ $_SERVER['QUERY_STRING'] = strip_zids($_SERVER['QUERY_STRING']);
+ $_SERVER['QUERY_STRING'] = preg_replace('/[\?&]davguest=(.*?)([\?&]|$)/ism', '', $_SERVER['QUERY_STRING']);
+
+ $_SERVER['REQUEST_URI'] = str_replace(array('?f=', '&f='), array('', ''), $_SERVER['REQUEST_URI']);
+ $_SERVER['REQUEST_URI'] = strip_zids($_SERVER['REQUEST_URI']);
+ $_SERVER['REQUEST_URI'] = preg_replace('/[\?&]davguest=(.*?)([\?&]|$)/ism', '', $_SERVER['REQUEST_URI']);
+
+ $rootDirectory = new \Zotlabs\Storage\Directory('/', $auth);
+
+ // A SabreDAV server-object
+ $server = new SDAV\Server($rootDirectory);
+ // prevent overwriting changes each other with a lock backend
+ $lockBackend = new SDAV\Locks\Backend\File('store/[data]/locks');
+ $lockPlugin = new SDAV\Locks\Plugin($lockBackend);
+
+ $server->addPlugin($lockPlugin);
+
+ $is_readable = false;
+
+ if($_SERVER['REQUEST_METHOD'] === 'GET') {
+ try {
+ $x = RedFileData('/' . \App::$cmd, $auth);
+ }
+ catch(\Exception $e) {
+ if($e instanceof Sabre\DAV\Exception\Forbidden) {
+ http_status_exit(401, 'Permission denied.');
+ }
+ }
+ }
+
+ // require_once('\Zotlabs/Storage/Browser.php');
+ // provide a directory view for the cloud in Hubzilla
+ $browser = new \Zotlabs\Storage\Browser($auth);
+ $auth->setBrowserPlugin($browser);
+
+ $server->addPlugin($browser);
+
+ // Experimental QuotaPlugin
+ // require_once('\Zotlabs\Storage/QuotaPlugin.php');
+ // $server->addPlugin(new \Zotlabs\Storage\\QuotaPlugin($auth));
+
+ // All we need to do now, is to fire up the server
+ $server->exec();
+
+ killme();
+ }
+
+}
diff --git a/Zotlabs/Module/Common.php b/Zotlabs/Module/Common.php
new file mode 100644
index 000000000..1c428d256
--- /dev/null
+++ b/Zotlabs/Module/Common.php
@@ -0,0 +1,73 @@
+<?php
+namespace Zotlabs\Module;
+
+require_once('include/socgraph.php');
+
+
+class Common extends \Zotlabs\Web\Controller {
+
+ function init() {
+
+ if(argc() > 1 && intval(argv(1)))
+ $channel_id = intval(argv(1));
+ else {
+ notice( t('No channel.') . EOL );
+ \App::$error = 404;
+ return;
+ }
+
+ $x = q("select channel_address from channel where channel_id = %d limit 1",
+ intval($channel_id)
+ );
+
+ if($x)
+ profile_load($a,$x[0]['channel_address'],0);
+
+ }
+
+ function get() {
+
+ $o = '';
+
+ if(! \App::$profile['profile_uid'])
+ return;
+
+ $observer_hash = get_observer_hash();
+
+
+ if(! perm_is_allowed(\App::$profile['profile_uid'],$observer_hash,'view_contacts')) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ $o .= '<h2>' . t('Common connections') . '</h2>';
+
+ $t = count_common_friends(\App::$profile['profile_uid'],$observer_hash);
+
+ if(! $t) {
+ notice( t('No connections in common.') . EOL);
+ return $o;
+ }
+
+ $r = common_friends(\App::$profile['profile_uid'],$observer_hash);
+
+ if($r) {
+
+ $tpl = get_markup_template('common_friends.tpl');
+
+ foreach($r as $rr) {
+ $o .= replace_macros($tpl,array(
+ '$url' => $rr['xchan_url'],
+ '$name' => $rr['xchan_name'],
+ '$photo' => $rr['xchan_photo_m'],
+ '$tags' => ''
+ ));
+ }
+
+ $o .= cleardiv();
+ }
+
+ return $o;
+ }
+
+}
diff --git a/Zotlabs/Module/Connect.php b/Zotlabs/Module/Connect.php
new file mode 100644
index 000000000..6ef3577d7
--- /dev/null
+++ b/Zotlabs/Module/Connect.php
@@ -0,0 +1,130 @@
+<?php
+namespace Zotlabs\Module; /** @file */
+
+
+require_once('include/Contact.php');
+require_once('include/contact_widgets.php');
+require_once('include/items.php');
+
+
+
+class Connect extends \Zotlabs\Web\Controller {
+
+ function init() {
+ if(argc() > 1)
+ $which = argv(1);
+ else {
+ notice( t('Requested profile is not available.') . EOL );
+ \App::$error = 404;
+ return;
+ }
+
+ $r = q("select * from channel where channel_address = '%s' limit 1",
+ dbesc($which)
+ );
+
+ if($r)
+ \App::$data['channel'] = $r[0];
+
+ profile_load($a,$which,'');
+ }
+
+ function post() {
+
+ if(! array_key_exists('channel', \App::$data))
+ return;
+
+ $edit = ((local_channel() && (local_channel() == \App::$data['channel']['channel_id'])) ? true : false);
+
+ if($edit) {
+ $has_premium = ((\App::$data['channel']['channel_pageflags'] & PAGE_PREMIUM) ? 1 : 0);
+ $premium = (($_POST['premium']) ? intval($_POST['premium']) : 0);
+ $text = escape_tags($_POST['text']);
+
+ if($has_premium != $premium) {
+ $r = q("update channel set channel_pageflags = ( channel_pageflags %s %d ) where channel_id = %d",
+ db_getfunc('^'),
+ intval(PAGE_PREMIUM),
+ intval(local_channel())
+ );
+ proc_run('php','include/notifier.php','refresh_all',\App::$data['channel']['channel_id']);
+ }
+ set_pconfig(\App::$data['channel']['channel_id'],'system','selltext',$text);
+ // reload the page completely to get fresh data
+ goaway(z_root() . '/' . \App::$query_string);
+
+ }
+
+ $url = '';
+ $observer = \App::get_observer();
+ if(($observer) && ($_POST['submit'] === t('Continue'))) {
+ if($observer['xchan_follow'])
+ $url = sprintf($observer['xchan_follow'],urlencode(\App::$data['channel']['channel_address'] . '@' . \App::get_hostname()));
+ if(! $url) {
+ $r = q("select * from hubloc where hubloc_hash = '%s' order by hubloc_id desc limit 1",
+ dbesc($observer['xchan_hash'])
+ );
+ if($r)
+ $url = $r[0]['hubloc_url'] . '/follow?f=&url=' . urlencode(\App::$data['channel']['channel_address'] . '@' . \App::get_hostname());
+ }
+ }
+ if($url)
+ goaway($url . '&confirm=1');
+ else
+ notice('Unable to connect to your home hub location.');
+
+ }
+
+
+
+ function get() {
+
+ $edit = ((local_channel() && (local_channel() == \App::$data['channel']['channel_id'])) ? true : false);
+
+ $text = get_pconfig(\App::$data['channel']['channel_id'],'system','selltext');
+
+ if($edit) {
+
+ $o = replace_macros(get_markup_template('sellpage_edit.tpl'),array(
+ '$header' => t('Premium Channel Setup'),
+ '$address' => \App::$data['channel']['channel_address'],
+ '$premium' => array('premium', t('Enable premium channel connection restrictions'),((\App::$data['channel']['channel_pageflags'] & PAGE_PREMIUM) ? '1' : ''),''),
+ '$lbl_about' => t('Please enter your restrictions or conditions, such as paypal receipt, usage guidelines, etc.'),
+ '$text' => $text,
+ '$desc' => t('This channel may require additional steps or acknowledgement of the following conditions prior to connecting:'),
+ '$lbl2' => t('Potential connections will then see the following text before proceeding:'),
+ '$desc2' => t('By continuing, I certify that I have complied with any instructions provided on this page.'),
+ '$submit' => t('Submit'),
+
+
+ ));
+ return $o;
+ }
+ else {
+ if(! $text)
+ $text = t('(No specific instructions have been provided by the channel owner.)');
+
+ $submit = replace_macros(get_markup_template('sellpage_submit.tpl'), array(
+ '$continue' => t('Continue'),
+ '$address' => \App::$data['channel']['channel_address']
+ ));
+
+ $o = replace_macros(get_markup_template('sellpage_view.tpl'),array(
+ '$header' => t('Restricted or Premium Channel'),
+ '$desc' => t('This channel may require additional steps or acknowledgement of the following conditions prior to connecting:'),
+ '$text' => prepare_text($text),
+
+ '$desc2' => t('By continuing, I certify that I have complied with any instructions provided on this page.'),
+ '$submit' => $submit,
+
+ ));
+
+ $arr = array('channel' => \App::$data['channel'],'observer' => \App::get_observer(), 'sellpage' => $o, 'submit' => $submit);
+ call_hooks('connect_premium', $arr);
+ $o = $arr['sellpage'];
+
+ }
+
+ return $o;
+ }
+}
diff --git a/Zotlabs/Module/Connections.php b/Zotlabs/Module/Connections.php
new file mode 100644
index 000000000..564f4e527
--- /dev/null
+++ b/Zotlabs/Module/Connections.php
@@ -0,0 +1,324 @@
+<?php
+namespace Zotlabs\Module;
+
+require_once('include/Contact.php');
+require_once('include/socgraph.php');
+require_once('include/contact_selectors.php');
+require_once('include/group.php');
+require_once('include/contact_widgets.php');
+require_once('include/zot.php');
+require_once('include/widgets.php');
+
+
+class Connections extends \Zotlabs\Web\Controller {
+
+ function init() {
+
+ if(! local_channel())
+ return;
+
+ $channel = \App::get_channel();
+ if($channel)
+ head_set_icon($channel['xchan_photo_s']);
+
+ }
+
+ function get() {
+
+ $sort_type = 0;
+ $o = '';
+
+
+ if(! local_channel()) {
+ notice( t('Permission denied.') . EOL);
+ return login();
+ }
+
+ $blocked = false;
+ $hidden = false;
+ $ignored = false;
+ $archived = false;
+ $unblocked = false;
+ $pending = false;
+ $unconnected = false;
+ $all = false;
+
+ if(! $_REQUEST['aj'])
+ $_SESSION['return_url'] = \App::$query_string;
+
+ $search_flags = '';
+ $head = '';
+
+ if(argc() == 2) {
+ switch(argv(1)) {
+ case 'blocked':
+ $search_flags = " and abook_blocked = 1 ";
+ $head = t('Blocked');
+ $blocked = true;
+ break;
+ case 'ignored':
+ $search_flags = " and abook_ignored = 1 ";
+ $head = t('Ignored');
+ $ignored = true;
+ break;
+ case 'hidden':
+ $search_flags = " and abook_hidden = 1 ";
+ $head = t('Hidden');
+ $hidden = true;
+ break;
+ case 'archived':
+ $search_flags = " and abook_archived = 1 ";
+ $head = t('Archived');
+ $archived = true;
+ break;
+ case 'pending':
+ $search_flags = " and abook_pending = 1 ";
+ $head = t('New');
+ $pending = true;
+ nav_set_selected('intros');
+ break;
+ case 'ifpending':
+ $r = q("SELECT COUNT(abook.abook_id) AS total FROM abook left join xchan on abook.abook_xchan = xchan.xchan_hash where abook_channel = %d and abook_pending = 1 and abook_self = 0 and abook_ignored = 0 and xchan_deleted = 0 and xchan_orphan = 0 ",
+ intval(local_channel())
+ );
+ if($r && $r[0]['total']) {
+ $search_flags = " and abook_pending = 1 ";
+ $head = t('New');
+ $pending = true;
+ nav_set_selected('intros');
+ \App::$argv[1] = 'pending';
+ }
+ else {
+ $head = t('All');
+ $search_flags = '';
+ $all = true;
+ \App::$argc = 1;
+ unset(\App::$argv[1]);
+ }
+ nav_set_selected('intros');
+ break;
+ // case 'unconnected':
+ // $search_flags = " and abook_unconnected = 1 ";
+ // $head = t('Unconnected');
+ // $unconnected = true;
+ // break;
+
+ case 'all':
+ $head = t('All');
+ default:
+ $search_flags = '';
+ $all = true;
+ break;
+
+ }
+
+ $sql_extra = $search_flags;
+ if(argv(1) === 'pending')
+ $sql_extra .= " and abook_ignored = 0 ";
+
+ }
+ else {
+ $sql_extra = " and abook_blocked = 0 ";
+ $unblocked = true;
+ }
+
+ $search = ((x($_REQUEST,'search')) ? notags(trim($_REQUEST['search'])) : '');
+
+ $tabs = array(
+ /*
+ array(
+ 'label' => t('Suggestions'),
+ 'url' => z_root() . '/suggest',
+ 'sel' => '',
+ 'title' => t('Suggest new connections'),
+ ),
+ */
+
+ 'pending' => array(
+ 'label' => t('New Connections'),
+ 'url' => z_root() . '/connections/pending',
+ 'sel' => ($pending) ? 'active' : '',
+ 'title' => t('Show pending (new) connections'),
+ ),
+
+ 'all' => array(
+ 'label' => t('All Connections'),
+ 'url' => z_root() . '/connections/all',
+ 'sel' => ($all) ? 'active' : '',
+ 'title' => t('Show all connections'),
+ ),
+
+ /*
+ array(
+ 'label' => t('Unblocked'),
+ 'url' => z_root() . '/connections',
+ 'sel' => (($unblocked) && (! $search) && (! $nets)) ? 'active' : '',
+ 'title' => t('Only show unblocked connections'),
+ ),
+ */
+
+ 'blocked' => array(
+ 'label' => t('Blocked'),
+ 'url' => z_root() . '/connections/blocked',
+ 'sel' => ($blocked) ? 'active' : '',
+ 'title' => t('Only show blocked connections'),
+ ),
+
+ 'ignored' => array(
+ 'label' => t('Ignored'),
+ 'url' => z_root() . '/connections/ignored',
+ 'sel' => ($ignored) ? 'active' : '',
+ 'title' => t('Only show ignored connections'),
+ ),
+
+ 'archived' => array(
+ 'label' => t('Archived'),
+ 'url' => z_root() . '/connections/archived',
+ 'sel' => ($archived) ? 'active' : '',
+ 'title' => t('Only show archived connections'),
+ ),
+
+ 'hidden' => array(
+ 'label' => t('Hidden'),
+ 'url' => z_root() . '/connections/hidden',
+ 'sel' => ($hidden) ? 'active' : '',
+ 'title' => t('Only show hidden connections'),
+ ),
+
+ // array(
+ // 'label' => t('Unconnected'),
+ // 'url' => z_root() . '/connections/unconnected',
+ // 'sel' => ($unconnected) ? 'active' : '',
+ // 'title' => t('Only show one-way connections'),
+ // ),
+
+
+ );
+
+ //$tab_tpl = get_markup_template('common_tabs.tpl');
+ //$t = replace_macros($tab_tpl, array('$tabs'=>$tabs));
+
+ $searching = false;
+ if($search) {
+ $search_hdr = $search;
+ $search_txt = dbesc(protect_sprintf(preg_quote($search)));
+ $searching = true;
+ }
+ $sql_extra .= (($searching) ? protect_sprintf(" AND xchan_name like '%$search_txt%' ") : "");
+
+ if($_REQUEST['gid']) {
+ $sql_extra .= " and xchan_hash in ( select xchan from group_member where gid = " . intval($_REQUEST['gid']) . " and uid = " . intval(local_channel()) . " ) ";
+ }
+
+ $r = q("SELECT COUNT(abook.abook_id) AS total FROM abook left join xchan on abook.abook_xchan = xchan.xchan_hash
+ where abook_channel = %d and abook_self = 0 and xchan_deleted = 0 and xchan_orphan = 0 $sql_extra $sql_extra2 ",
+ intval(local_channel())
+ );
+ if($r) {
+ \App::set_pager_total($r[0]['total']);
+ $total = $r[0]['total'];
+ }
+
+ $r = q("SELECT abook.*, xchan.* FROM abook left join xchan on abook.abook_xchan = xchan.xchan_hash
+ WHERE abook_channel = %d and abook_self = 0 and xchan_deleted = 0 and xchan_orphan = 0 $sql_extra $sql_extra2 ORDER BY xchan_name LIMIT %d OFFSET %d ",
+ intval(local_channel()),
+ intval(\App::$pager['itemspage']),
+ intval(\App::$pager['start'])
+ );
+
+ $contacts = array();
+
+ if(count($r)) {
+
+ foreach($r as $rr) {
+ if($rr['xchan_url']) {
+
+ $status_str = '';
+ $status = array(
+ ((intval($rr['abook_pending'])) ? t('Pending approval') : ''),
+ ((intval($rr['abook_archived'])) ? t('Archived') : ''),
+ ((intval($rr['abook_hidden'])) ? t('Hidden') : ''),
+ ((intval($rr['abook_ignored'])) ? t('Ignored') : ''),
+ ((intval($rr['abook_blocked'])) ? t('Blocked') : '')
+ );
+
+ foreach($status as $str) {
+ if(!$str)
+ continue;
+ $status_str .= $str;
+ $status_str .= ', ';
+ }
+ $status_str = rtrim($status_str, ', ');
+
+ $contacts[] = array(
+ 'img_hover' => sprintf( t('%1$s [%2$s]'),$rr['xchan_name'],$rr['xchan_url']),
+ 'edit_hover' => t('Edit connection'),
+ 'delete_hover' => t('Delete connection'),
+ 'id' => $rr['abook_id'],
+ 'thumb' => $rr['xchan_photo_m'],
+ 'name' => $rr['xchan_name'],
+ 'classes' => (intval($rr['abook_archived']) ? 'archived' : ''),
+ 'link' => z_root() . '/connedit/' . $rr['abook_id'],
+ 'deletelink' => z_root() . '/connedit/' . intval($rr['abook_id']) . '/drop',
+ 'delete' => t('Delete'),
+ 'url' => chanlink_url($rr['xchan_url']),
+ 'webbie_label' => t('Channel address'),
+ 'webbie' => $rr['xchan_addr'],
+ 'network_label' => t('Network'),
+ 'network' => network_to_name($rr['xchan_network']),
+ 'public_forum' => ((intval($rr['xchan_pubforum'])) ? true : false),
+ 'status_label' => t('Status'),
+ 'status' => $status_str,
+ 'connected_label' => t('Connected'),
+ 'connected' => datetime_convert('UTC',date_default_timezone_get(),$rr['abook_created'], 'c'),
+ 'approve_hover' => t('Approve connection'),
+ 'approve' => (($rr['abook_pending']) ? t('Approve') : false),
+ 'ignore_hover' => t('Ignore connection'),
+ 'ignore' => ((! $rr['abook_ignored']) ? t('Ignore') : false),
+ 'recent_label' => t('Recent activity'),
+ 'recentlink' => z_root() . '/network/?f=&cid=' . intval($rr['abook_id'])
+ );
+ }
+ }
+ }
+
+
+ if($_REQUEST['aj']) {
+ if($contacts) {
+ $o = replace_macros(get_markup_template('contactsajax.tpl'),array(
+ '$contacts' => $contacts,
+ '$edit' => t('Edit'),
+ ));
+ }
+ else {
+ $o = '<div id="content-complete"></div>';
+ }
+ echo $o;
+ killme();
+ }
+ else {
+ $o .= "<script> var page_query = '" . $_GET['q'] . "'; var extra_args = '" . extra_query_args() . "' ; </script>";
+ $o .= replace_macros(get_markup_template('connections.tpl'),array(
+ '$header' => t('Connections') . (($head) ? ': ' . $head : ''),
+ '$tabs' => $tabs,
+ '$total' => $total,
+ '$search' => $search_hdr,
+ '$label' => t('Search'),
+ '$desc' => t('Search your connections'),
+ '$finding' => (($searching) ? t('Connections search') . ": '" . $search . "'" : ""),
+ '$submit' => t('Find'),
+ '$edit' => t('Edit'),
+ '$cmd' => \App::$cmd,
+ '$contacts' => $contacts,
+ '$paginate' => paginate($a),
+
+ ));
+ }
+
+ if(! $contacts)
+ $o .= '<div id="content-complete"></div>';
+
+ return $o;
+ }
+
+}
diff --git a/Zotlabs/Module/Connedit.php b/Zotlabs/Module/Connedit.php
new file mode 100644
index 000000000..a1268510d
--- /dev/null
+++ b/Zotlabs/Module/Connedit.php
@@ -0,0 +1,763 @@
+<?php
+namespace Zotlabs\Module;
+
+/* @file connedit.php
+ * @brief In this file the connection-editor form is generated and evaluated.
+ *
+ *
+ */
+
+require_once('include/Contact.php');
+require_once('include/socgraph.php');
+require_once('include/contact_selectors.php');
+require_once('include/group.php');
+require_once('include/contact_widgets.php');
+require_once('include/zot.php');
+require_once('include/widgets.php');
+require_once('include/photos.php');
+
+/* @brief Initialize the connection-editor
+ *
+ *
+ */
+
+
+class Connedit extends \Zotlabs\Web\Controller {
+
+ function init() {
+
+ if(! local_channel())
+ return;
+
+ if((argc() >= 2) && intval(argv(1))) {
+ $r = q("SELECT abook.*, xchan.*
+ FROM abook left join xchan on abook_xchan = xchan_hash
+ WHERE abook_channel = %d and abook_id = %d LIMIT 1",
+ intval(local_channel()),
+ intval(argv(1))
+ );
+ if($r) {
+ \App::$poi = $r[0];
+ }
+ }
+
+ $channel = \App::get_channel();
+ if($channel)
+ head_set_icon($channel['xchan_photo_s']);
+
+ }
+
+ /* @brief Evaluate posted values and set changes
+ *
+ */
+
+ function post() {
+
+ if(! local_channel())
+ return;
+
+ $contact_id = intval(argv(1));
+ if(! $contact_id)
+ return;
+
+ $channel = \App::get_channel();
+
+ // TODO if configured for hassle-free permissions, we'll post the form with ajax as soon as the
+ // connection enable is toggled to a special autopost url and set permissions immediately, leaving
+ // the other form elements alone pending a manual submit of the form. The downside is that there
+ // will be a window of opportunity when the permissions have been set but before you've had a chance
+ // to review and possibly restrict them. The upside is we won't have to warn you that your connection
+ // can't do anything until you save the bloody form.
+
+ $autopost = (((argc() > 2) && (argv(2) === 'auto')) ? true : false);
+
+ $orig_record = q("SELECT * FROM abook WHERE abook_id = %d AND abook_channel = %d LIMIT 1",
+ intval($contact_id),
+ intval(local_channel())
+ );
+
+ if(! $orig_record) {
+ notice( t('Could not access contact record.') . EOL);
+ goaway(z_root() . '/connections');
+ return; // NOTREACHED
+ }
+
+ call_hooks('contact_edit_post', $_POST);
+
+ if(intval($orig_record[0]['abook_self'])) {
+ $autoperms = intval($_POST['autoperms']);
+ $is_self = true;
+ }
+ else {
+ $autoperms = null;
+ $is_self = false;
+ }
+
+
+ $profile_id = $_POST['profile_assign'];
+ if($profile_id) {
+ $r = q("SELECT profile_guid FROM profile WHERE profile_guid = '%s' AND `uid` = %d LIMIT 1",
+ dbesc($profile_id),
+ intval(local_channel())
+ );
+ if(! count($r)) {
+ notice( t('Could not locate selected profile.') . EOL);
+ return;
+ }
+ }
+
+ $abook_incl = escape_tags($_POST['abook_incl']);
+ $abook_excl = escape_tags($_POST['abook_excl']);
+
+ $hidden = intval($_POST['hidden']);
+
+ $priority = intval($_POST['poll']);
+ if($priority > 5 || $priority < 0)
+ $priority = 0;
+
+ $closeness = intval($_POST['closeness']);
+ if($closeness < 0)
+ $closeness = 99;
+
+ $rating = intval($_POST['rating']);
+ if($rating < (-10))
+ $rating = (-10);
+ if($rating > 10)
+ $rating = 10;
+
+ $rating_text = trim(escape_tags($_REQUEST['rating_text']));
+
+ $abook_my_perms = 0;
+
+ foreach($_POST as $k => $v) {
+ if(strpos($k,'perms_') === 0) {
+ $abook_my_perms += $v;
+ }
+ }
+
+ $new_friend = false;
+
+ if(! $is_self) {
+
+ $signed = $orig_record[0]['abook_xchan'] . '.' . $rating . '.' . $rating_text;
+
+ $sig = base64url_encode(rsa_sign($signed,$channel['channel_prvkey']));
+
+ $z = q("select * from xlink where xlink_xchan = '%s' and xlink_link = '%s' and xlink_static = 1 limit 1",
+ dbesc($channel['channel_hash']),
+ dbesc($orig_record[0]['abook_xchan'])
+ );
+
+ if($z) {
+ $record = $z[0]['xlink_id'];
+ $w = q("update xlink set xlink_rating = '%d', xlink_rating_text = '%s', xlink_sig = '%s', xlink_updated = '%s'
+ where xlink_id = %d",
+ intval($rating),
+ dbesc($rating_text),
+ dbesc($sig),
+ dbesc(datetime_convert()),
+ intval($record)
+ );
+ }
+ else {
+ $w = q("insert into xlink ( xlink_xchan, xlink_link, xlink_rating, xlink_rating_text, xlink_sig, xlink_updated, xlink_static ) values ( '%s', '%s', %d, '%s', '%s', '%s', 1 ) ",
+ dbesc($channel['channel_hash']),
+ dbesc($orig_record[0]['abook_xchan']),
+ intval($rating),
+ dbesc($rating_text),
+ dbesc($sig),
+ dbesc(datetime_convert())
+ );
+ $z = q("select * from xlink where xlink_xchan = '%s' and xlink_link = '%s' and xlink_static = 1 limit 1",
+ dbesc($channel['channel_hash']),
+ dbesc($orig_record[0]['abook_xchan'])
+ );
+ if($z)
+ $record = $z[0]['xlink_id'];
+ }
+ if($record) {
+ proc_run('php','include/ratenotif.php','rating',$record);
+ }
+ }
+
+ if(($_REQUEST['pending']) && intval($orig_record[0]['abook_pending'])) {
+ $new_friend = true;
+
+ // @fixme it won't be common, but when you accept a new connection request
+ // the permissions will now be that of your permissions role and ignore
+ // any you may have set manually on the form. We'll probably see a bug if somebody
+ // tries to set the permissions *and* approve the connection in the same
+ // request. The workaround is to approve the connection, then go back and
+ // adjust permissions as desired.
+
+ $abook_my_perms = get_channel_default_perms(local_channel());
+
+ $role = get_pconfig(local_channel(),'system','permissions_role');
+ if($role) {
+ $x = get_role_perms($role);
+ if($x['perms_accept'])
+ $abook_my_perms = $x['perms_accept'];
+ }
+ }
+
+ $abook_pending = (($new_friend) ? 0 : $orig_record[0]['abook_pending']);
+
+ $r = q("UPDATE abook SET abook_profile = '%s', abook_my_perms = %d , abook_closeness = %d, abook_pending = %d,
+ abook_incl = '%s', abook_excl = '%s'
+ where abook_id = %d AND abook_channel = %d",
+ dbesc($profile_id),
+ intval($abook_my_perms),
+ intval($closeness),
+ intval($abook_pending),
+ dbesc($abook_incl),
+ dbesc($abook_excl),
+ intval($contact_id),
+ intval(local_channel())
+ );
+
+ if($orig_record[0]['abook_profile'] != $profile_id) {
+ //Update profile photo permissions
+
+ logger('A new profile was assigned - updating profile photos');
+ profile_photo_set_profile_perms($profile_id);
+
+ }
+
+ if($r)
+ info( t('Connection updated.') . EOL);
+ else
+ notice( t('Failed to update connection record.') . EOL);
+
+ if(\App::$poi && \App::$poi['abook_my_perms'] != $abook_my_perms
+ && (! intval(\App::$poi['abook_self']))) {
+ proc_run('php', 'include/notifier.php', (($new_friend) ? 'permission_create' : 'permission_update'), $contact_id);
+ }
+
+ if($new_friend) {
+ $default_group = $channel['channel_default_group'];
+ if($default_group) {
+ require_once('include/group.php');
+ $g = group_rec_byhash(local_channel(),$default_group);
+ if($g)
+ group_add_member(local_channel(),'',\App::$poi['abook_xchan'],$g['id']);
+ }
+
+ // Check if settings permit ("post new friend activity" is allowed, and
+ // friends in general or this friend in particular aren't hidden)
+ // and send out a new friend activity
+
+ $pr = q("select * from profile where uid = %d and is_default = 1 and hide_friends = 0",
+ intval($channel['channel_id'])
+ );
+ if(($pr) && (! intval($orig_record[0]['abook_hidden'])) && (intval(get_pconfig($channel['channel_id'],'system','post_newfriend')))) {
+ $xarr = array();
+ $xarr['verb'] = ACTIVITY_FRIEND;
+ $xarr['item_wall'] = 1;
+ $xarr['item_origin'] = 1;
+ $xarr['item_thread_top'] = 1;
+ $xarr['owner_xchan'] = $xarr['author_xchan'] = $channel['channel_hash'];
+ $xarr['allow_cid'] = $channel['channel_allow_cid'];
+ $xarr['allow_gid'] = $channel['channel_allow_gid'];
+ $xarr['deny_cid'] = $channel['channel_deny_cid'];
+ $xarr['deny_gid'] = $channel['channel_deny_gid'];
+ $xarr['item_private'] = (($xarr['allow_cid']||$xarr['allow_gid']||$xarr['deny_cid']||$xarr['deny_gid']) ? 1 : 0);
+ $obj = array(
+ 'type' => ACTIVITY_OBJ_PERSON,
+ 'title' => \App::$poi['xchan_name'],
+ 'id' => \App::$poi['xchan_hash'],
+ 'link' => array(
+ array('rel' => 'alternate', 'type' => 'text/html', 'href' => \App::$poi['xchan_url']),
+ array('rel' => 'photo', 'type' => \App::$poi['xchan_photo_mimetype'], 'href' => \App::$poi['xchan_photo_l'])
+ ),
+ );
+ $xarr['object'] = json_encode($obj);
+ $xarr['obj_type'] = ACTIVITY_OBJ_PERSON;
+
+ $xarr['body'] = '[zrl=' . $channel['xchan_url'] . ']' . $channel['xchan_name'] . '[/zrl]' . ' ' . t('is now connected to') . ' ' . '[zrl=' . \App::$poi['xchan_url'] . ']' . \App::$poi['xchan_name'] . '[/zrl]';
+
+ $xarr['body'] .= "\n\n\n" . '[zrl=' . \App::$poi['xchan_url'] . '][zmg=80x80]' . \App::$poi['xchan_photo_m'] . '[/zmg][/zrl]';
+
+ post_activity_item($xarr);
+
+ }
+
+
+ // pull in a bit of content if there is any to pull in
+ proc_run('php','include/onepoll.php',$contact_id);
+
+ }
+
+ // Refresh the structure in memory with the new data
+
+ $r = q("SELECT abook.*, xchan.*
+ FROM abook left join xchan on abook_xchan = xchan_hash
+ WHERE abook_channel = %d and abook_id = %d LIMIT 1",
+ intval(local_channel()),
+ intval($contact_id)
+ );
+ if($r) {
+ \App::$poi = $r[0];
+ }
+
+ if($new_friend) {
+ $arr = array('channel_id' => local_channel(), 'abook' => \App::$poi);
+ call_hooks('accept_follow', $arr);
+ }
+
+ if(! is_null($autoperms))
+ set_pconfig(local_channel(),'system','autoperms',(($autoperms) ? $abook_my_perms : 0));
+
+ $this->connedit_clone($a);
+
+ if(($_REQUEST['pending']) && (!$_REQUEST['done']))
+ goaway(z_root() . '/connections/ifpending');
+
+ return;
+
+ }
+
+ /* @brief Clone connection
+ *
+ *
+ */
+
+ function connedit_clone(&$a) {
+
+ if(! \App::$poi)
+ return;
+
+
+ $channel = \App::get_channel();
+
+ $r = q("SELECT abook.*, xchan.*
+ FROM abook left join xchan on abook_xchan = xchan_hash
+ WHERE abook_channel = %d and abook_id = %d LIMIT 1",
+ intval(local_channel()),
+ intval(\App::$poi['abook_id'])
+ );
+ if($r) {
+ \App::$poi = $r[0];
+ }
+
+ $clone = \App::$poi;
+
+ unset($clone['abook_id']);
+ unset($clone['abook_account']);
+ unset($clone['abook_channel']);
+
+ $abconfig = load_abconfig($channel['channel_hash'],$clone['abook_xchan']);
+ if($abconfig)
+ $clone['abconfig'] = $abconfig;
+
+ build_sync_packet(0 /* use the current local_channel */, array('abook' => array($clone)));
+ }
+
+ /* @brief Generate content of connection edit page
+ *
+ *
+ */
+
+ function get() {
+
+ $sort_type = 0;
+ $o = '';
+
+ if(! local_channel()) {
+ notice( t('Permission denied.') . EOL);
+ return login();
+ }
+
+ $channel = \App::get_channel();
+ $my_perms = get_channel_default_perms(local_channel());
+ $role = get_pconfig(local_channel(),'system','permissions_role');
+ if($role) {
+ $x = get_role_perms($role);
+ if($x['perms_accept'])
+ $my_perms = $x['perms_accept'];
+ }
+
+ $yes_no = array(t('No'),t('Yes'));
+
+ if($my_perms) {
+ $o .= "<script>function connectDefaultShare() {
+ \$('.abook-edit-me').each(function() {
+ if(! $(this).is(':disabled'))
+ $(this).prop('checked', false);
+ });\n\n";
+ $perms = get_perms();
+ foreach($perms as $p => $v) {
+ if($my_perms & $v[1]) {
+ $o .= "\$('#me_id_perms_" . $p . "').prop('checked', true); \n";
+ }
+ }
+ $o .= " }\n</script>\n";
+ }
+
+ if(argc() == 3) {
+
+ $contact_id = intval(argv(1));
+ if(! $contact_id)
+ return;
+
+ $cmd = argv(2);
+
+ $orig_record = q("SELECT abook.*, xchan.* FROM abook left join xchan on abook_xchan = xchan_hash
+ WHERE abook_id = %d AND abook_channel = %d AND abook_self = 0 LIMIT 1",
+ intval($contact_id),
+ intval(local_channel())
+ );
+
+ if(! count($orig_record)) {
+ notice( t('Could not access address book record.') . EOL);
+ goaway(z_root() . '/connections');
+ }
+
+ if($cmd === 'update') {
+ // pull feed and consume it, which should subscribe to the hub.
+ proc_run('php',"include/poller.php","$contact_id");
+ goaway(z_root() . '/connedit/' . $contact_id);
+
+ }
+
+ if($cmd === 'refresh') {
+ if($orig_record[0]['xchan_network'] === 'zot') {
+ if(! zot_refresh($orig_record[0],\App::get_channel()))
+ notice( t('Refresh failed - channel is currently unavailable.') );
+ }
+ else {
+
+ // if you are on a different network we'll force a refresh of the connection basic info
+ proc_run('php','include/notifier.php','permission_update',$contact_id);
+ }
+ goaway(z_root() . '/connedit/' . $contact_id);
+ }
+
+ if($cmd === 'block') {
+ if(abook_toggle_flag($orig_record[0],ABOOK_FLAG_BLOCKED)) {
+ $this->connedit_clone($a);
+ }
+ else
+ notice(t('Unable to set address book parameters.') . EOL);
+ goaway(z_root() . '/connedit/' . $contact_id);
+ }
+
+ if($cmd === 'ignore') {
+ if(abook_toggle_flag($orig_record[0],ABOOK_FLAG_IGNORED)) {
+ $this->connedit_clone($a);
+ }
+ else
+ notice(t('Unable to set address book parameters.') . EOL);
+ goaway(z_root() . '/connedit/' . $contact_id);
+ }
+
+ if($cmd === 'archive') {
+ if(abook_toggle_flag($orig_record[0],ABOOK_FLAG_ARCHIVED)) {
+ $this->connedit_clone($a);
+ }
+ else
+ notice(t('Unable to set address book parameters.') . EOL);
+ goaway(z_root() . '/connedit/' . $contact_id);
+ }
+
+ if($cmd === 'hide') {
+ if(abook_toggle_flag($orig_record[0],ABOOK_FLAG_HIDDEN)) {
+ $this->connedit_clone($a);
+ }
+ else
+ notice(t('Unable to set address book parameters.') . EOL);
+ goaway(z_root() . '/connedit/' . $contact_id);
+ }
+
+ // We'll prevent somebody from unapproving an already approved contact.
+ // Though maybe somebody will want this eventually (??)
+
+ if($cmd === 'approve') {
+ if(intval($orig_record[0]['abook_pending'])) {
+ if(abook_toggle_flag($orig_record[0],ABOOK_FLAG_PENDING)) {
+ $this->connedit_clone($a);
+ }
+ else
+ notice(t('Unable to set address book parameters.') . EOL);
+ }
+ goaway(z_root() . '/connedit/' . $contact_id);
+ }
+
+
+ if($cmd === 'drop') {
+
+ require_once('include/Contact.php');
+
+ // FIXME
+ // We need to send either a purge or a refresh packet to the other side (the channel being unfriended).
+ // The issue is that the abook DB record _may_ get destroyed when we call contact_remove. As the notifier runs
+ // in the background there could be a race condition preventing this packet from being sent in all cases.
+ // PLACEHOLDER
+
+ contact_remove(local_channel(), $orig_record[0]['abook_id']);
+ build_sync_packet(0 /* use the current local_channel */,
+ array('abook' => array(array(
+ 'abook_xchan' => $orig_record[0]['abook_xchan'],
+ 'entry_deleted' => true))
+ )
+ );
+
+ info( t('Connection has been removed.') . EOL );
+ if(x($_SESSION,'return_url'))
+ goaway(z_root() . '/' . $_SESSION['return_url']);
+ goaway(z_root() . '/contacts');
+
+ }
+ }
+
+ if(\App::$poi) {
+
+ $contact_id = \App::$poi['abook_id'];
+ $contact = \App::$poi;
+
+ $tools = array(
+
+ 'view' => array(
+ 'label' => t('View Profile'),
+ 'url' => chanlink_cid($contact['abook_id']),
+ 'sel' => '',
+ 'title' => sprintf( t('View %s\'s profile'), $contact['xchan_name']),
+ ),
+
+ 'refresh' => array(
+ 'label' => t('Refresh Permissions'),
+ 'url' => z_root() . '/connedit/' . $contact['abook_id'] . '/refresh',
+ 'sel' => '',
+ 'title' => t('Fetch updated permissions'),
+ ),
+
+ 'recent' => array(
+ 'label' => t('Recent Activity'),
+ 'url' => z_root() . '/network/?f=&cid=' . $contact['abook_id'],
+ 'sel' => '',
+ 'title' => t('View recent posts and comments'),
+ ),
+
+ 'block' => array(
+ 'label' => (intval($contact['abook_blocked']) ? t('Unblock') : t('Block')),
+ 'url' => z_root() . '/connedit/' . $contact['abook_id'] . '/block',
+ 'sel' => (intval($contact['abook_blocked']) ? 'active' : ''),
+ 'title' => t('Block (or Unblock) all communications with this connection'),
+ 'info' => (intval($contact['abook_blocked']) ? t('This connection is blocked!') : ''),
+ ),
+
+ 'ignore' => array(
+ 'label' => (intval($contact['abook_ignored']) ? t('Unignore') : t('Ignore')),
+ 'url' => z_root() . '/connedit/' . $contact['abook_id'] . '/ignore',
+ 'sel' => (intval($contact['abook_ignored']) ? 'active' : ''),
+ 'title' => t('Ignore (or Unignore) all inbound communications from this connection'),
+ 'info' => (intval($contact['abook_ignored']) ? t('This connection is ignored!') : ''),
+ ),
+
+ 'archive' => array(
+ 'label' => (intval($contact['abook_archived']) ? t('Unarchive') : t('Archive')),
+ 'url' => z_root() . '/connedit/' . $contact['abook_id'] . '/archive',
+ 'sel' => (intval($contact['abook_archived']) ? 'active' : ''),
+ 'title' => t('Archive (or Unarchive) this connection - mark channel dead but keep content'),
+ 'info' => (intval($contact['abook_archived']) ? t('This connection is archived!') : ''),
+ ),
+
+ 'hide' => array(
+ 'label' => (intval($contact['abook_hidden']) ? t('Unhide') : t('Hide')),
+ 'url' => z_root() . '/connedit/' . $contact['abook_id'] . '/hide',
+ 'sel' => (intval($contact['abook_hidden']) ? 'active' : ''),
+ 'title' => t('Hide or Unhide this connection from your other connections'),
+ 'info' => (intval($contact['abook_hidden']) ? t('This connection is hidden!') : ''),
+ ),
+
+ 'delete' => array(
+ 'label' => t('Delete'),
+ 'url' => z_root() . '/connedit/' . $contact['abook_id'] . '/drop',
+ 'sel' => '',
+ 'title' => t('Delete this connection'),
+ ),
+
+ );
+
+ $self = false;
+
+ if(intval($contact['abook_self']))
+ $self = true;
+
+ require_once('include/contact_selectors.php');
+
+ $tpl = get_markup_template("abook_edit.tpl");
+
+ if(feature_enabled(local_channel(),'affinity')) {
+
+ $labels = array(
+ t('Me'),
+ t('Family'),
+ t('Friends'),
+ t('Acquaintances'),
+ t('All')
+ );
+ call_hooks('affinity_labels',$labels);
+ $label_str = '';
+
+ if($labels) {
+ foreach($labels as $l) {
+ if($label_str) {
+ $label_str .= ", '|'";
+ $label_str .= ", '" . $l . "'";
+ }
+ else
+ $label_str .= "'" . $l . "'";
+ }
+ }
+
+ $slider_tpl = get_markup_template('contact_slider.tpl');
+ $slide = replace_macros($slider_tpl,array(
+ '$min' => 1,
+ '$val' => (($contact['abook_closeness']) ? $contact['abook_closeness'] : 99),
+ '$labels' => $label_str,
+ ));
+ }
+
+ $rating_val = 0;
+ $rating_text = '';
+
+ $xl = q("select * from xlink where xlink_xchan = '%s' and xlink_link = '%s' and xlink_static = 1",
+ dbesc($channel['channel_hash']),
+ dbesc($contact['xchan_hash'])
+ );
+
+ if($xl) {
+ $rating_val = intval($xl[0]['xlink_rating']);
+ $rating_text = $xl[0]['xlink_rating_text'];
+ }
+
+ $poco_rating = get_config('system','poco_rating_enable');
+
+ // if unset default to enabled
+ if($poco_rating === false)
+ $poco_rating = true;
+
+ if($poco_rating) {
+ $rating = replace_macros(get_markup_template('rating_slider.tpl'),array(
+ '$min' => -10,
+ '$val' => $rating_val
+ ));
+ }
+ else {
+ $rating = false;
+ }
+
+
+ $perms = array();
+ $channel = \App::get_channel();
+
+ $global_perms = get_perms();
+ $existing = get_all_perms(local_channel(),$contact['abook_xchan']);
+
+ $unapproved = array('pending', t('Approve this connection'), '', t('Accept connection to allow communication'), array(t('No'),('Yes')));
+
+ $multiprofs = ((feature_enabled(local_channel(),'multi_profiles')) ? true : false);
+
+ if($slide && !$multiprofs)
+ $affinity = t('Set Affinity');
+
+ if(!$slide && $multiprofs)
+ $affinity = t('Set Profile');
+
+ if($slide && $multiprofs)
+ $affinity = t('Set Affinity & Profile');
+
+ foreach($global_perms as $k => $v) {
+ $thisperm = (($contact['abook_my_perms'] & $v[1]) ? "1" : '');
+ $checkinherited = ((($channel[$v[0]]) && ($channel[$v[0]] != PERMS_SPECIFIC)) ? "1" : '');
+
+ // For auto permissions (when $self is true) we don't want to look at existing
+ // permissions because they are enabled for the channel owner
+ if((! $self) && ($existing[$k]))
+ $thisperm = "1";
+
+ $perms[] = array('perms_' . $k, $v[3], (($contact['abook_their_perms'] & $v[1]) ? "1" : ""),$thisperm, $v[1], (($channel[$v[0]] == PERMS_SPECIFIC) ? '' : '1'), $v[4], $checkinherited);
+ }
+
+ $locstr = '';
+
+ $locs = q("select hubloc_addr as location from hubloc left join site on hubloc_url = site_url where hubloc_hash = '%s'
+ and hubloc_deleted = 0 and site_dead = 0",
+ dbesc($contact['xchan_hash'])
+ );
+
+ if($locs) {
+ foreach($locs as $l) {
+ if(!($l['location']))
+ continue;
+ if(strpos($locstr,$l['location']) !== false)
+ continue;
+ if(strlen($locstr))
+ $locstr .= ', ';
+ $locstr .= $l['location'];
+ }
+ }
+ else
+ $locstr = t('none');
+
+ $o .= replace_macros($tpl,array(
+
+ '$header' => (($self) ? t('Connection Default Permissions') : sprintf( t('Connection: %s'),$contact['xchan_name'])),
+ '$autoperms' => array('autoperms',t('Apply these permissions automatically'), ((get_pconfig(local_channel(),'system','autoperms')) ? 1 : 0), t('Connection requests will be approved without your interaction'), $yes_no),
+ '$addr' => $contact['xchan_addr'],
+ '$addr_text' => t('This connection\'s primary address is'),
+ '$loc_text' => t('Available locations:'),
+ '$locstr' => $locstr,
+ '$notself' => (($self) ? '' : '1'),
+ '$self' => (($self) ? '1' : ''),
+ '$autolbl' => t('The permissions indicated on this page will be applied to all new connections.'),
+ '$tools_label' => t('Connection Tools'),
+ '$tools' => (($self) ? '' : $tools),
+ '$lbl_slider' => t('Slide to adjust your degree of friendship'),
+ '$lbl_rating' => t('Rating'),
+ '$lbl_rating_label' => t('Slide to adjust your rating'),
+ '$lbl_rating_txt' => t('Optionally explain your rating'),
+ '$connfilter' => feature_enabled(local_channel(),'connfilter'),
+ '$connfilter_label' => t('Custom Filter'),
+ '$incl' => array('abook_incl',t('Only import posts with this text'), $contact['abook_incl'],t('words one per line or #tags or /patterns/ or lang=xx, leave blank to import all posts')),
+ '$excl' => array('abook_excl',t('Do not import posts with this text'), $contact['abook_excl'],t('words one per line or #tags or /patterns/ or lang=xx, leave blank to import all posts')),
+ '$rating_text' => array('rating_text', t('Optionally explain your rating'),$rating_text,''),
+ '$rating_info' => t('This information is public!'),
+ '$rating' => $rating,
+ '$rating_val' => $rating_val,
+ '$slide' => $slide,
+ '$affinity' => $affinity,
+ '$pending_label' => t('Connection Pending Approval'),
+ '$is_pending' => (intval($contact['abook_pending']) ? 1 : ''),
+ '$unapproved' => $unapproved,
+ '$inherited' => t('inherited'),
+ '$submit' => t('Submit'),
+ '$lbl_vis2' => sprintf( t('Please choose the profile you would like to display to %s when viewing your profile securely.'), $contact['xchan_name']),
+ '$close' => $contact['abook_closeness'],
+ '$them' => t('Their Settings'),
+ '$me' => t('My Settings'),
+ '$perms' => $perms,
+ '$permlbl' => t('Individual Permissions'),
+ '$permnote' => t('Some permissions may be inherited from your channel\'s <a href="settings"><strong>privacy settings</strong></a>, which have higher priority than individual settings. You can <strong>not</strong> change those settings here.'),
+ '$permnote_self' => t('Some permissions may be inherited from your channel\'s <a href="settings"><strong>privacy settings</strong></a>, which have higher priority than individual settings. You can change those settings here but they wont have any impact unless the inherited setting changes.'),
+ '$lastupdtext' => t('Last update:'),
+ '$last_update' => relative_date($contact['abook_connected']),
+ '$profile_select' => contact_profile_assign($contact['abook_profile']),
+ '$multiprofs' => $multiprofs,
+ '$contact_id' => $contact['abook_id'],
+ '$name' => $contact['xchan_name'],
+
+ ));
+
+ $arr = array('contact' => $contact,'output' => $o);
+
+ call_hooks('contact_edit', $arr);
+
+ return $arr['output'];
+
+ }
+
+
+ }
+
+}
diff --git a/Zotlabs/Module/Contactgroup.php b/Zotlabs/Module/Contactgroup.php
new file mode 100644
index 000000000..497442ff4
--- /dev/null
+++ b/Zotlabs/Module/Contactgroup.php
@@ -0,0 +1,54 @@
+<?php
+namespace Zotlabs\Module;
+
+require_once('include/group.php');
+
+
+class Contactgroup extends \Zotlabs\Web\Controller {
+
+ function get() {
+
+ if(! local_channel()) {
+ killme();
+ }
+
+ if((argc() > 2) && (intval(argv(1))) && (argv(2))) {
+ $r = q("SELECT abook_xchan from abook where abook_xchan = '%s' and abook_channel = %d and abook_self = 0 limit 1",
+ dbesc(base64url_decode(argv(2))),
+ intval(local_channel())
+ );
+ if($r)
+ $change = $r[0]['abook_xchan'];
+ }
+
+ if((argc() > 1) && (intval(argv(1)))) {
+
+ $r = q("SELECT * FROM `groups` WHERE `id` = %d AND `uid` = %d AND `deleted` = 0 LIMIT 1",
+ intval(argv(1)),
+ intval(local_channel())
+ );
+ if(! $r) {
+ killme();
+ }
+
+ $group = $r[0];
+ $members = group_get_members($group['id']);
+ $preselected = array();
+ if(count($members)) {
+ foreach($members as $member)
+ $preselected[] = $member['xchan_hash'];
+ }
+
+ if($change) {
+ if(in_array($change,$preselected)) {
+ group_rmv_member(local_channel(),$group['name'],$change);
+ }
+ else {
+ group_add_member(local_channel(),$group['name'],$change);
+ }
+ }
+ }
+
+ killme();
+ }
+}
diff --git a/Zotlabs/Module/Cover_photo.php b/Zotlabs/Module/Cover_photo.php
new file mode 100644
index 000000000..aafc1bdb0
--- /dev/null
+++ b/Zotlabs/Module/Cover_photo.php
@@ -0,0 +1,423 @@
+<?php
+namespace Zotlabs\Module;
+
+/*
+ @file cover_photo.php
+ @brief Module-file with functions for handling of cover-photos
+
+*/
+
+require_once('include/photo/photo_driver.php');
+require_once('include/identity.php');
+
+
+
+/* @brief Initalize the cover-photo edit view
+ *
+ * @param $a Current application
+ * @return void
+ *
+ */
+
+
+class Cover_photo extends \Zotlabs\Web\Controller {
+
+ function init() {
+
+ if(! local_channel()) {
+ return;
+ }
+
+ $channel = \App::get_channel();
+ profile_load($a,$channel['channel_address']);
+
+ }
+
+ /* @brief Evaluate posted values
+ *
+ * @param $a Current application
+ * @return void
+ *
+ */
+
+ function post() {
+
+ if(! local_channel()) {
+ return;
+ }
+
+ $channel = \App::get_channel();
+
+ check_form_security_token_redirectOnErr('/cover_photo', 'cover_photo');
+
+ if((x($_POST,'cropfinal')) && ($_POST['cropfinal'] == 1)) {
+
+ // phase 2 - we have finished cropping
+
+ if(argc() != 2) {
+ notice( t('Image uploaded but image cropping failed.') . EOL );
+ return;
+ }
+
+ $image_id = argv(1);
+
+ if(substr($image_id,-2,1) == '-') {
+ $scale = substr($image_id,-1,1);
+ $image_id = substr($image_id,0,-2);
+ }
+
+
+ $srcX = $_POST['xstart'];
+ $srcY = $_POST['ystart'];
+ $srcW = $_POST['xfinal'] - $srcX;
+ $srcH = $_POST['yfinal'] - $srcY;
+
+
+ $r = q("select gender from profile where uid = %d and is_default = 1 limit 1",
+ intval(local_channel())
+ );
+ if($r) {
+ $profile = $r[0];
+ }
+
+ $r = q("SELECT * FROM photo WHERE resource_id = '%s' AND uid = %d AND scale = 0 LIMIT 1",
+ dbesc($image_id),
+ intval(local_channel())
+ );
+
+ if($r) {
+
+ $base_image = $r[0];
+ $base_image['data'] = (($r[0]['os_storage']) ? @file_get_contents($base_image['data']) : dbunescbin($base_image['data']));
+
+ $im = photo_factory($base_image['data'], $base_image['type']);
+ if($im->is_valid()) {
+
+ // We are scaling and cropping the relative pixel locations to the original photo instead of the
+ // scaled photo we operated on.
+
+ // First load the scaled photo to check its size. (Should probably pass this in the post form and save
+ // a query.)
+
+ $g = q("select width, height from photo where resource_id = '%s' and uid = %d and scale = 3",
+ dbesc($image_id),
+ intval(local_channel())
+ );
+
+
+ $scaled_width = $g[0]['width'];
+ $scaled_height = $g[0]['height'];
+
+ if((! $scaled_width) || (! $scaled_height)) {
+ logger('potential divide by zero scaling cover photo');
+ return;
+ }
+
+ // unset all other cover photos
+
+ q("update photo set photo_usage = %d where photo_usage = %d and uid = %d",
+ intval(PHOTO_NORMAL),
+ intval(PHOTO_COVER),
+ intval(local_channel())
+ );
+
+ $orig_srcx = ( $r[0]['width'] / $scaled_width ) * $srcX;
+ $orig_srcy = ( $r[0]['height'] / $scaled_height ) * $srcY;
+ $orig_srcw = ( $srcW / $scaled_width ) * $r[0]['width'];
+ $orig_srch = ( $srcH / $scaled_height ) * $r[0]['height'];
+
+ $im->cropImageRect(1200,435,$orig_srcx, $orig_srcy, $orig_srcw, $orig_srch);
+
+ $aid = get_account_id();
+
+ $p = array('aid' => $aid, 'uid' => local_channel(), 'resource_id' => $base_image['resource_id'],
+ 'filename' => $base_image['filename'], 'album' => t('Cover Photos'));
+
+ $p['scale'] = 7;
+ $p['photo_usage'] = PHOTO_COVER;
+
+ $r1 = $im->save($p);
+
+ $im->doScaleImage(850,310);
+ $p['scale'] = 8;
+
+ $r2 = $im->save($p);
+
+
+ $im->doScaleImage(425,160);
+ $p['scale'] = 9;
+
+ $r3 = $im->save($p);
+
+ if($r1 === false || $r2 === false || $r3 === false) {
+ // if one failed, delete them all so we can start over.
+ notice( t('Image resize failed.') . EOL );
+ $x = q("delete from photo where resource_id = '%s' and uid = %d and scale >= 7 ",
+ dbesc($base_image['resource_id']),
+ local_channel()
+ );
+ return;
+ }
+
+ $channel = \App::get_channel();
+ $this->send_cover_photo_activity($channel,$base_image,$profile);
+
+
+ }
+ else
+ notice( t('Unable to process image') . EOL);
+ }
+
+ goaway(z_root() . '/channel/' . $channel['channel_address']);
+
+ }
+
+
+ $hash = photo_new_resource();
+ $smallest = 0;
+
+ require_once('include/attach.php');
+
+ $res = attach_store(\App::get_channel(), get_observer_hash(), '', array('album' => t('Cover Photos'), 'hash' => $hash));
+
+ logger('attach_store: ' . print_r($res,true));
+
+ if($res && intval($res['data']['is_photo'])) {
+ $i = q("select * from photo where resource_id = '%s' and uid = %d and scale = 0",
+ dbesc($hash),
+ intval(local_channel())
+ );
+
+ if(! $i) {
+ notice( t('Image upload failed.') . EOL );
+ return;
+ }
+ $os_storage = false;
+
+ foreach($i as $ii) {
+ $smallest = intval($ii['scale']);
+ $os_storage = intval($ii['os_storage']);
+ $imagedata = $ii['data'];
+ $filetype = $ii['type'];
+
+ }
+ }
+
+ $imagedata = (($os_storage) ? @file_get_contents($imagedata) : $imagedata);
+ $ph = photo_factory($imagedata, $filetype);
+
+ if(! $ph->is_valid()) {
+ notice( t('Unable to process image.') . EOL );
+ return;
+ }
+
+ return $this->cover_photo_crop_ui_head($a, $ph, $hash, $smallest);
+
+ }
+
+ function send_cover_photo_activity($channel,$photo,$profile) {
+
+ $arr = array();
+ $arr['item_thread_top'] = 1;
+ $arr['item_origin'] = 1;
+ $arr['item_wall'] = 1;
+ $arr['obj_type'] = ACTIVITY_OBJ_PHOTO;
+ $arr['verb'] = ACTIVITY_UPDATE;
+
+ $arr['object'] = json_encode(array(
+ 'type' => $arr['obj_type'],
+ 'id' => z_root() . '/photo/' . $photo['resource_id'] . '-7',
+ 'link' => array('rel' => 'photo', 'type' => $photo['type'], 'href' => z_root() . '/photo/' . $photo['resource_id'] . '-7')
+ ));
+
+ if($profile && stripos($profile['gender'],t('female')) !== false)
+ $t = t('%1$s updated her %2$s');
+ elseif($profile && stripos($profile['gender'],t('male')) !== false)
+ $t = t('%1$s updated his %2$s');
+ else
+ $t = t('%1$s updated their %2$s');
+
+ $ptext = '[zrl=' . z_root() . '/photos/' . $channel['channel_address'] . '/image/' . $photo['resource_id'] . ']' . t('cover photo') . '[/zrl]';
+
+ $ltext = '[zrl=' . z_root() . '/profile/' . $channel['channel_address'] . ']' . '[zmg]' . z_root() . '/photo/' . $photo['resource_id'] . '-8[/zmg][/zrl]';
+
+ $arr['body'] = sprintf($t,$channel['channel_name'],$ptext) . "\n\n" . $ltext;
+
+ $acl = new \Zotlabs\Access\AccessList($channel);
+ $x = $acl->get();
+ $arr['allow_cid'] = $x['allow_cid'];
+
+ $arr['allow_gid'] = $x['allow_gid'];
+ $arr['deny_cid'] = $x['deny_cid'];
+ $arr['deny_gid'] = $x['deny_gid'];
+
+ $arr['uid'] = $channel['channel_id'];
+ $arr['aid'] = $channel['channel_account_id'];
+
+ $arr['owner_xchan'] = $channel['channel_hash'];
+ $arr['author_xchan'] = $channel['channel_hash'];
+
+ post_activity_item($arr);
+
+
+ }
+
+
+ /* @brief Generate content of profile-photo view
+ *
+ * @param $a Current application
+ * @return void
+ *
+ */
+
+
+ function get() {
+
+ if(! local_channel()) {
+ notice( t('Permission denied.') . EOL );
+ return;
+ }
+
+ $channel = \App::get_channel();
+
+ $newuser = false;
+
+ if(argc() == 2 && argv(1) === 'new')
+ $newuser = true;
+
+ if(argv(1) === 'use') {
+ if (argc() < 3) {
+ notice( t('Permission denied.') . EOL );
+ return;
+ };
+
+ // check_form_security_token_redirectOnErr('/cover_photo', 'cover_photo');
+
+ $resource_id = argv(2);
+
+ $r = q("SELECT id, album, scale FROM photo WHERE uid = %d AND resource_id = '%s' ORDER BY scale ASC",
+ intval(local_channel()),
+ dbesc($resource_id)
+ );
+ if(! $r) {
+ notice( t('Photo not available.') . EOL );
+ return;
+ }
+ $havescale = false;
+ foreach($r as $rr) {
+ if($rr['scale'] == 7)
+ $havescale = true;
+ }
+
+ $r = q("SELECT `data`, `type`, resource_id, os_storage FROM photo WHERE id = %d and uid = %d limit 1",
+ intval($r[0]['id']),
+ intval(local_channel())
+
+ );
+ if(! $r) {
+ notice( t('Photo not available.') . EOL );
+ return;
+ }
+
+ if(intval($r[0]['os_storage']))
+ $data = @file_get_contents($r[0]['data']);
+ else
+ $data = dbunescbin($r[0]['data']);
+
+ $ph = photo_factory($data, $r[0]['type']);
+ $smallest = 0;
+ if($ph->is_valid()) {
+ // go ahead as if we have just uploaded a new photo to crop
+ $i = q("select resource_id, scale from photo where resource_id = '%s' and uid = %d and scale = 0",
+ dbesc($r[0]['resource_id']),
+ intval(local_channel())
+ );
+
+ if($i) {
+ $hash = $i[0]['resource_id'];
+ foreach($i as $ii) {
+ $smallest = intval($ii['scale']);
+ }
+ }
+ }
+
+ cover_photo_crop_ui_head($a, $ph, $hash, $smallest);
+ }
+
+
+ if(! x(\App::$data,'imagecrop')) {
+
+ $tpl = get_markup_template('cover_photo.tpl');
+
+ $o .= replace_macros($tpl,array(
+ '$user' => \App::$channel['channel_address'],
+ '$lbl_upfile' => t('Upload File:'),
+ '$lbl_profiles' => t('Select a profile:'),
+ '$title' => t('Upload Cover Photo'),
+ '$submit' => t('Upload'),
+ '$profiles' => $profiles,
+ '$form_security_token' => get_form_security_token("cover_photo"),
+ // FIXME - yuk
+ '$select' => sprintf('%s %s', t('or'), ($newuser) ? '<a href="' . z_root() . '">' . t('skip this step') . '</a>' : '<a href="'. z_root() . '/photos/' . \App::$channel['channel_address'] . '">' . t('select a photo from your photo albums') . '</a>')
+ ));
+
+ call_hooks('cover_photo_content_end', $o);
+
+ return $o;
+ }
+ else {
+ $filename = \App::$data['imagecrop'] . '-3';
+ $resolution = 3;
+ $tpl = get_markup_template("cropcover.tpl");
+ $o .= replace_macros($tpl,array(
+ '$filename' => $filename,
+ '$profile' => intval($_REQUEST['profile']),
+ '$resource' => \App::$data['imagecrop'] . '-3',
+ '$image_url' => z_root() . '/photo/' . $filename,
+ '$title' => t('Crop Image'),
+ '$desc' => t('Please adjust the image cropping for optimum viewing.'),
+ '$form_security_token' => get_form_security_token("cover_photo"),
+ '$done' => t('Done Editing')
+ ));
+ return $o;
+ }
+
+ return; // NOTREACHED
+ }
+
+ /* @brief Generate the UI for photo-cropping
+ *
+ * @param $a Current application
+ * @param $ph Photo-Factory
+ * @return void
+ *
+ */
+
+
+
+ function cover_photo_crop_ui_head(&$a, $ph, $hash, $smallest){
+
+ $max_length = get_config('system','max_image_length');
+ if(! $max_length)
+ $max_length = MAX_IMAGE_LENGTH;
+ if($max_length > 0)
+ $ph->scaleImage($max_length);
+
+ $width = $ph->getWidth();
+ $height = $ph->getHeight();
+
+ if($width < 300 || $height < 300) {
+ $ph->scaleImageUp(240);
+ $width = $ph->getWidth();
+ $height = $ph->getHeight();
+ }
+
+
+ \App::$data['imagecrop'] = $hash;
+ \App::$data['imagecrop_resolution'] = $smallest;
+ \App::$page['htmlhead'] .= replace_macros(get_markup_template("crophead.tpl"), array());
+ return;
+ }
+
+
+}
diff --git a/Zotlabs/Module/Dav.php b/Zotlabs/Module/Dav.php
new file mode 100644
index 000000000..42eb3d0c1
--- /dev/null
+++ b/Zotlabs/Module/Dav.php
@@ -0,0 +1,150 @@
+<?php
+
+namespace Zotlabs\Module;
+/**
+ * @file mod/dav.php
+ * @brief Initialize Hubzilla's cloud (SabreDAV).
+ *
+ * Module for accessing the DAV storage area from a DAV client.
+ */
+
+use \Sabre\DAV as SDAV;
+use \Zotlabs\Storage;
+
+// composer autoloader for SabreDAV
+require_once('vendor/autoload.php');
+
+
+/**
+ * @brief Fires up the SabreDAV server.
+ *
+ * @param App &$a
+ */
+
+class Dav extends \Zotlabs\Web\Controller {
+
+ function init() {
+
+ // workaround for HTTP-auth in CGI mode
+ if (x($_SERVER, 'REDIRECT_REMOTE_USER')) {
+ $userpass = base64_decode(substr($_SERVER["REDIRECT_REMOTE_USER"], 6)) ;
+ if(strlen($userpass)) {
+ list($name, $password) = explode(':', $userpass);
+ $_SERVER['PHP_AUTH_USER'] = $name;
+ $_SERVER['PHP_AUTH_PW'] = $password;
+ }
+ }
+
+ if (x($_SERVER, 'HTTP_AUTHORIZATION')) {
+ $userpass = base64_decode(substr($_SERVER["HTTP_AUTHORIZATION"], 6)) ;
+ if(strlen($userpass)) {
+ list($name, $password) = explode(':', $userpass);
+ $_SERVER['PHP_AUTH_USER'] = $name;
+ $_SERVER['PHP_AUTH_PW'] = $password;
+ }
+ }
+
+ require_once('include/reddav.php');
+
+ if (! is_dir('store'))
+ os_mkdir('store', STORAGE_DEFAULT_PERMISSIONS, false);
+
+ $which = null;
+ if (argc() > 1)
+ $which = argv(1);
+
+ $profile = 0;
+
+ \App::$page['htmlhead'] .= '<link rel="alternate" type="application/atom+xml" href="' . z_root() . '/feed/' . $which . '" />' . "\r\n";
+
+ if ($which)
+ profile_load($a, $which, $profile);
+
+ $auth = new \Zotlabs\Storage\BasicAuth();
+
+ $ob_hash = get_observer_hash();
+
+ if ($ob_hash) {
+ if (local_channel()) {
+ $channel = \App::get_channel();
+ $auth->setCurrentUser($channel['channel_address']);
+ $auth->channel_id = $channel['channel_id'];
+ $auth->channel_hash = $channel['channel_hash'];
+ $auth->channel_account_id = $channel['channel_account_id'];
+ if($channel['channel_timezone'])
+ $auth->setTimezone($channel['channel_timezone']);
+ }
+ $auth->observer = $ob_hash;
+ }
+
+ if ($_GET['davguest'])
+ $_SESSION['davguest'] = true;
+
+ $_SERVER['QUERY_STRING'] = str_replace(array('?f=', '&f='), array('', ''), $_SERVER['QUERY_STRING']);
+ $_SERVER['QUERY_STRING'] = strip_zids($_SERVER['QUERY_STRING']);
+ $_SERVER['QUERY_STRING'] = preg_replace('/[\?&]davguest=(.*?)([\?&]|$)/ism', '', $_SERVER['QUERY_STRING']);
+
+ $_SERVER['REQUEST_URI'] = str_replace(array('?f=', '&f='), array('', ''), $_SERVER['REQUEST_URI']);
+ $_SERVER['REQUEST_URI'] = strip_zids($_SERVER['REQUEST_URI']);
+ $_SERVER['REQUEST_URI'] = preg_replace('/[\?&]davguest=(.*?)([\?&]|$)/ism', '', $_SERVER['REQUEST_URI']);
+
+ $rootDirectory = new \Zotlabs\Storage\Directory('/', $auth);
+
+ // A SabreDAV server-object
+ $server = new \SDAV\Server($rootDirectory);
+ // prevent overwriting changes each other with a lock backend
+ $lockBackend = new \SDAV\Locks\Backend\File('store/[data]/locks');
+ $lockPlugin = new \SDAV\Locks\Plugin($lockBackend);
+
+ $server->addPlugin($lockPlugin);
+
+ // The next section of code allows us to bypass prompting for http-auth if a
+ // FILE is being accessed anonymously and permissions allow this. This way
+ // one can create hotlinks to public media files in their cloud and anonymous
+ // viewers won't get asked to login.
+ // If a DIRECTORY is accessed or there are permission issues accessing the
+ // file and we aren't previously authenticated via zot, prompt for HTTP-auth.
+ // This will be the default case for mounting a DAV directory.
+ // In order to avoid prompting for passwords for viewing a DIRECTORY, add
+ // the URL query parameter 'davguest=1'.
+
+ $isapublic_file = false;
+ $davguest = ((x($_SESSION, 'davguest')) ? true : false);
+
+ if ((! $auth->observer) && ($_SERVER['REQUEST_METHOD'] === 'GET')) {
+ try {
+ $x = RedFileData('/' . \App::$cmd, $auth);
+ if($x instanceof \Zotlabs\Storage\File)
+ $isapublic_file = true;
+ }
+ catch (Exception $e) {
+ $isapublic_file = false;
+ }
+ }
+
+ if ((! $auth->observer) && (! $isapublic_file) && (! $davguest)) {
+ try {
+ $auth->Authenticate($server, t('$Projectname channel'));
+ }
+ catch (Exception $e) {
+ logger('mod_cloud: auth exception' . $e->getMessage());
+ http_status_exit($e->getHTTPCode(), $e->getMessage());
+ }
+ }
+
+ // require_once('Zotlabs/Storage/Browser.php');
+ // provide a directory view for the cloud in Hubzilla
+ $browser = new \Zotlabs\Storage\Browser($auth);
+ $auth->setBrowserPlugin($browser);
+
+ // Experimental QuotaPlugin
+ // require_once('Zotlabs/Storage/QuotaPlugin.php');
+ // $server->addPlugin(new \Zotlabs\Storage\QuotaPlugin($auth));
+
+ // All we need to do now, is to fire up the server
+ $server->exec();
+
+ killme();
+ }
+
+}
diff --git a/Zotlabs/Module/Directory.php b/Zotlabs/Module/Directory.php
new file mode 100644
index 000000000..b8bac53bb
--- /dev/null
+++ b/Zotlabs/Module/Directory.php
@@ -0,0 +1,425 @@
+<?php
+namespace Zotlabs\Module;
+
+require_once('include/socgraph.php');
+require_once('include/dir_fns.php');
+require_once('include/widgets.php');
+require_once('include/bbcode.php');
+
+
+class Directory extends \Zotlabs\Web\Controller {
+
+ function init() {
+ \App::set_pager_itemspage(60);
+
+ if(x($_GET,'ignore')) {
+ q("insert into xign ( uid, xchan ) values ( %d, '%s' ) ",
+ intval(local_channel()),
+ dbesc($_GET['ignore'])
+ );
+ goaway(z_root() . '/directory?suggest=1');
+ }
+
+ $observer = get_observer_hash();
+ $global_changed = false;
+ $safe_changed = false;
+ $pubforums_changed = false;
+
+ if(array_key_exists('global',$_REQUEST)) {
+ $globaldir = intval($_REQUEST['global']);
+ $global_changed = true;
+ }
+ if($global_changed) {
+ $_SESSION['globaldir'] = $globaldir;
+ if($observer)
+ set_xconfig($observer,'directory','globaldir',$globaldir);
+ }
+
+ if(array_key_exists('safe',$_REQUEST)) {
+ $safemode = intval($_REQUEST['safe']);
+ $safe_changed = true;
+ }
+ if($safe_changed) {
+ $_SESSION['safemode'] = $safemode;
+ if($observer)
+ set_xconfig($observer,'directory','safemode',$safemode);
+ }
+
+
+ if(array_key_exists('pubforums',$_REQUEST)) {
+ $pubforums = intval($_REQUEST['pubforums']);
+ $pubforums_changed = true;
+ }
+ if($pubforums_changed) {
+ $_SESSION['pubforums'] = $pubforums;
+ if($observer)
+ set_xconfig($observer,'directory','pubforums',$pubforums);
+ }
+ }
+
+ function get() {
+
+ if((get_config('system','block_public')) && (! local_channel()) && (! remote_channel())) {
+ notice( t('Public access denied.') . EOL);
+ return;
+ }
+
+ $observer = get_observer_hash();
+
+ $globaldir = get_directory_setting($observer, 'globaldir');
+ // override your personal global search pref if we're doing a navbar search of the directory
+ if(intval($_REQUEST['navsearch']))
+ $globaldir = 1;
+
+ $safe_mode = get_directory_setting($observer, 'safemode');
+
+ $pubforums = get_directory_setting($observer, 'pubforums');
+
+ $o = '';
+ nav_set_selected('directory');
+
+ if(x($_POST,'search'))
+ $search = notags(trim($_POST['search']));
+ else
+ $search = ((x($_GET,'search')) ? notags(trim(rawurldecode($_GET['search']))) : '');
+
+
+ if(strpos($search,'=') && local_channel() && get_pconfig(local_channel(),'feature','expert'))
+ $advanced = $search;
+
+
+ $keywords = (($_GET['keywords']) ? $_GET['keywords'] : '');
+
+ // Suggest channels if no search terms or keywords are given
+ $suggest = (local_channel() && x($_REQUEST,'suggest')) ? $_REQUEST['suggest'] : '';
+
+ if($suggest) {
+
+ $r = suggestion_query(local_channel(),get_observer_hash());
+
+ // Remember in which order the suggestions were
+ $addresses = array();
+ $common = array();
+ $index = 0;
+ foreach($r as $rr) {
+ $common[$rr['xchan_addr']] = $rr['total'];
+ $addresses[$rr['xchan_addr']] = $index++;
+ }
+
+ // Build query to get info about suggested people
+ $advanced = '';
+ foreach(array_keys($addresses) as $address) {
+ $advanced .= "address=\"$address\" ";
+ }
+ // Remove last space in the advanced query
+ $advanced = rtrim($advanced);
+
+ }
+
+ $tpl = get_markup_template('directory_header.tpl');
+
+ $dirmode = intval(get_config('system','directory_mode'));
+
+ if(($dirmode == DIRECTORY_MODE_PRIMARY) || ($dirmode == DIRECTORY_MODE_STANDALONE)) {
+ $url = z_root() . '/dirsearch';
+ }
+ if(! $url) {
+ $directory = find_upstream_directory($dirmode);
+ if((! $directory) || (! array_key_exists('url',$directory)) || (! $directory['url']))
+ logger('CRITICAL: No directory server URL');
+ $url = $directory['url'] . '/dirsearch';
+ }
+
+ $token = get_config('system','realm_token');
+
+
+ logger('mod_directory: URL = ' . $url, LOGGER_DEBUG);
+
+ $contacts = array();
+
+ if(local_channel()) {
+ $x = q("select abook_xchan from abook where abook_channel = %d",
+ intval(local_channel())
+ );
+ if($x) {
+ foreach($x as $xx)
+ $contacts[] = $xx['abook_xchan'];
+ }
+ }
+
+ if($url) {
+
+ $numtags = get_config('system','directorytags');
+
+ $kw = ((intval($numtags) > 0) ? intval($numtags) : 50);
+
+ if(get_config('system','disable_directory_keywords'))
+ $kw = 0;
+
+ $query = $url . '?f=&kw=' . $kw . (($safe_mode != 1) ? '&safe=' . $safe_mode : '');
+
+ if($token)
+ $query .= '&t=' . $token;
+
+ if(! $globaldir)
+ $query .= '&hub=' . \App::get_hostname();
+
+ if($search)
+ $query .= '&name=' . urlencode($search) . '&keywords=' . urlencode($search);
+ if(strpos($search,'@'))
+ $query .= '&address=' . urlencode($search);
+ if($keywords)
+ $query .= '&keywords=' . urlencode($keywords);
+ if($advanced)
+ $query .= '&query=' . urlencode($advanced);
+ if(! is_null($pubforums))
+ $query .= '&pubforums=' . intval($pubforums);
+
+ $directory_sort_order = get_config('system','directory_sort_order');
+ if(! $directory_sort_order)
+ $directory_sort_order = 'date';
+
+ $sort_order = ((x($_REQUEST,'order')) ? $_REQUEST['order'] : $directory_sort_order);
+
+ if($sort_order)
+ $query .= '&order=' . urlencode($sort_order);
+
+ if(\App::$pager['page'] != 1)
+ $query .= '&p=' . \App::$pager['page'];
+
+ logger('mod_directory: query: ' . $query);
+
+ $x = z_fetch_url($query);
+ logger('directory: return from upstream: ' . print_r($x,true), LOGGER_DATA);
+
+ if($x['success']) {
+ $t = 0;
+ $j = json_decode($x['body'],true);
+ if($j) {
+
+ if($j['results']) {
+
+ $entries = array();
+
+ $photo = 'thumb';
+
+ foreach($j['results'] as $rr) {
+
+ $profile_link = chanlink_url($rr['url']);
+
+ $pdesc = (($rr['description']) ? $rr['description'] . '<br />' : '');
+ $connect_link = ((local_channel()) ? z_root() . '/follow?f=&url=' . urlencode($rr['address']) : '');
+
+ // Checking status is disabled ATM until someone checks the performance impact more carefully
+ //$online = remote_online_status($rr['address']);
+ $online = '';
+
+ if(in_array($rr['hash'],$contacts))
+ $connect_link = '';
+
+ $location = '';
+ if(strlen($rr['locale']))
+ $location .= $rr['locale'];
+ if(strlen($rr['region'])) {
+ if(strlen($rr['locale']))
+ $location .= ', ';
+ $location .= $rr['region'];
+ }
+ if(strlen($rr['country'])) {
+ if(strlen($location))
+ $location .= ', ';
+ $location .= $rr['country'];
+ }
+
+ $age = '';
+ if(strlen($rr['birthday'])) {
+ if(($years = age($rr['birthday'],'UTC','')) != 0)
+ $age = $years;
+ }
+
+ $page_type = '';
+
+ if($rr['total_ratings'])
+ $total_ratings = sprintf( tt("%d rating", "%d ratings", $rr['total_ratings']), $rr['total_ratings']);
+ else
+ $total_ratings = '';
+
+ $profile = $rr;
+
+ if ((x($profile,'locale') == 1)
+ || (x($profile,'region') == 1)
+ || (x($profile,'postcode') == 1)
+ || (x($profile,'country') == 1))
+
+ $gender = ((x($profile,'gender') == 1) ? t('Gender: ') . $profile['gender']: False);
+
+ $marital = ((x($profile,'marital') == 1) ? t('Status: ') . $profile['marital']: False);
+
+ $homepage = ((x($profile,'homepage') == 1) ? t('Homepage: ') : False);
+ $homepageurl = ((x($profile,'homepage') == 1) ? $profile['homepage'] : '');
+
+ $hometown = ((x($profile,'hometown') == 1) ? $profile['hometown'] : False);
+
+ $about = ((x($profile,'about') == 1) ? bbcode($profile['about']) : False);
+
+ $keywords = ((x($profile,'keywords')) ? $profile['keywords'] : '');
+
+ $out = '';
+
+ if($keywords) {
+ $keywords = str_replace(',',' ', $keywords);
+ $keywords = str_replace(' ',' ', $keywords);
+ $karr = explode(' ', $keywords);
+
+ if($karr) {
+ if(local_channel()) {
+ $r = q("select keywords from profile where uid = %d and is_default = 1 limit 1",
+ intval(local_channel())
+ );
+ if($r) {
+ $keywords = str_replace(',',' ', $r[0]['keywords']);
+ $keywords = str_replace(' ',' ', $keywords);
+ $marr = explode(' ', $keywords);
+ }
+ }
+ foreach($karr as $k) {
+ if(strlen($out))
+ $out .= ', ';
+ if($marr && in_arrayi($k,$marr))
+ $out .= '<strong>' . $k . '</strong>';
+ else
+ $out .= $k;
+ }
+ }
+
+ }
+
+ $entry = array(
+ 'id' => ++$t,
+ 'profile_link' => $profile_link,
+ 'public_forum' => $rr['public_forum'],
+ 'photo' => $rr['photo'],
+ 'hash' => $rr['hash'],
+ 'alttext' => $rr['name'] . ((local_channel() || remote_channel()) ? ' ' . $rr['address'] : ''),
+ 'name' => $rr['name'],
+ 'age' => $age,
+ 'age_label' => t('Age:'),
+ 'profile' => $profile,
+ 'address' => $rr['address'],
+ 'nickname' => substr($rr['address'],0,strpos($rr['address'],'@')),
+ 'location' => $location,
+ 'location_label' => t('Location:'),
+ 'gender' => $gender,
+ 'total_ratings' => $total_ratings,
+ 'viewrate' => true,
+ 'canrate' => ((local_channel()) ? true : false),
+ 'pdesc' => $pdesc,
+ 'pdesc_label' => t('Description:'),
+ 'marital' => $marital,
+ 'homepage' => $homepage,
+ 'homepageurl' => linkify($homepageurl),
+ 'hometown' => $hometown,
+ 'hometown_label' => t('Hometown:'),
+ 'about' => $about,
+ 'about_label' => t('About:'),
+ 'conn_label' => t('Connect'),
+ 'forum_label' => t('Public Forum:'),
+ 'connect' => $connect_link,
+ 'online' => $online,
+ 'kw' => (($out) ? t('Keywords: ') : ''),
+ 'keywords' => $out,
+ 'ignlink' => $suggest ? z_root() . '/directory?ignore=' . $rr['hash'] : '',
+ 'ignore_label' => t('Don\'t suggest'),
+ 'common_friends' => (($common[$rr['address']]) ? intval($common[$rr['address']]) : ''),
+ 'common_label' => t('Common connections:'),
+ 'common_count' => intval($common[$rr['address']]),
+ 'safe' => $safe_mode
+ );
+
+ $arr = array('contact' => $rr, 'entry' => $entry);
+
+ call_hooks('directory_item', $arr);
+
+ unset($profile);
+ unset($location);
+
+ if(! $arr['entry']) {
+ continue;
+ }
+
+ if($sort_order == '' && $suggest) {
+ $entries[$addresses[$rr['address']]] = $arr['entry']; // Use the same indexes as originally to get the best suggestion first
+ }
+
+ else {
+ $entries[] = $arr['entry'];
+ }
+ }
+
+ ksort($entries); // Sort array by key so that foreach-constructs work as expected
+
+ if($j['keywords']) {
+ \App::$data['directory_keywords'] = $j['keywords'];
+ }
+
+ logger('mod_directory: entries: ' . print_r($entries,true), LOGGER_DATA);
+
+
+ if($_REQUEST['aj']) {
+ if($entries) {
+ $o = replace_macros(get_markup_template('directajax.tpl'),array(
+ '$entries' => $entries
+ ));
+ }
+ else {
+ $o = '<div id="content-complete"></div>';
+ }
+ echo $o;
+ killme();
+ }
+ else {
+ $maxheight = 94;
+
+ $dirtitle = (($globaldir) ? t('Global Directory') : t('Local Directory'));
+
+ $o .= "<script> var page_query = '" . $_GET['q'] . "'; var extra_args = '" . extra_query_args() . "' ; divmore_height = " . intval($maxheight) . "; </script>";
+ $o .= replace_macros($tpl, array(
+ '$search' => $search,
+ '$desc' => t('Find'),
+ '$finddsc' => t('Finding:'),
+ '$safetxt' => htmlspecialchars($search,ENT_QUOTES,'UTF-8'),
+ '$entries' => $entries,
+ '$dirlbl' => $suggest ? t('Channel Suggestions') : $dirtitle,
+ '$submit' => t('Find'),
+ '$next' => alt_pager($a,$j['records'], t('next page'), t('previous page')),
+ '$sort' => t('Sort options'),
+ '$normal' => t('Alphabetic'),
+ '$reverse' => t('Reverse Alphabetic'),
+ '$date' => t('Newest to Oldest'),
+ '$reversedate' => t('Oldest to Newest'),
+ '$suggest' => $suggest ? '&suggest=1' : ''
+ ));
+
+
+ }
+
+ }
+ else {
+ if($_REQUEST['aj']) {
+ $o = '<div id="content-complete"></div>';
+ echo $o;
+ killme();
+ }
+ if(\App::$pager['page'] == 1 && $j['records'] == 0 && strpos($search,'@')) {
+ goaway(z_root() . '/chanview/?f=&address=' . $search);
+ }
+ info( t("No entries (some entries may be hidden).") . EOL);
+ }
+ }
+ }
+ }
+ return $o;
+ }
+
+
+}
diff --git a/Zotlabs/Module/Dirsearch.php b/Zotlabs/Module/Dirsearch.php
new file mode 100644
index 000000000..8f60910f1
--- /dev/null
+++ b/Zotlabs/Module/Dirsearch.php
@@ -0,0 +1,462 @@
+<?php
+namespace Zotlabs\Module;
+
+require_once('include/dir_fns.php');
+
+
+
+class Dirsearch extends \Zotlabs\Web\Controller {
+
+ function init() {
+ \App::set_pager_itemspage(60);
+
+ }
+
+ function get() {
+
+ $ret = array('success' => false);
+
+ // logger('request: ' . print_r($_REQUEST,true));
+
+
+ $dirmode = intval(get_config('system','directory_mode'));
+
+ if($dirmode == DIRECTORY_MODE_NORMAL) {
+ $ret['message'] = t('This site is not a directory server');
+ json_return_and_die($ret);
+ }
+
+ $access_token = $_REQUEST['t'];
+
+ $token = get_config('system','realm_token');
+ if($token && $access_token != $token) {
+ $ret['message'] = t('This directory server requires an access token');
+ json_return_and_die($ret);
+ }
+
+
+ if(argc() > 1 && argv(1) === 'sites') {
+ $ret = $this->list_public_sites();
+ json_return_and_die($ret);
+ }
+
+ $sql_extra = '';
+
+
+ $tables = array('name','address','locale','region','postcode','country','gender','marital','sexual','keywords');
+
+ if($_REQUEST['query']) {
+ $advanced = $this->dir_parse_query($_REQUEST['query']);
+ if($advanced) {
+ foreach($advanced as $adv) {
+ if(in_array($adv['field'],$tables)) {
+ if($adv['field'] === 'name')
+ $sql_extra .= $this->dir_query_build($adv['logic'],'xchan_name',$adv['value']);
+ elseif($adv['field'] === 'address')
+ $sql_extra .= $this->dir_query_build($adv['logic'],'xchan_addr',$adv['value']);
+ else
+ $sql_extra .= $this->dir_query_build($adv['logic'],'xprof_' . $adv['field'],$adv['value']);
+ }
+ }
+ }
+ }
+
+ $hash = ((x($_REQUEST['hash'])) ? $_REQUEST['hash'] : '');
+
+ $name = ((x($_REQUEST,'name')) ? $_REQUEST['name'] : '');
+ $hub = ((x($_REQUEST,'hub')) ? $_REQUEST['hub'] : '');
+ $address = ((x($_REQUEST,'address')) ? $_REQUEST['address'] : '');
+ $locale = ((x($_REQUEST,'locale')) ? $_REQUEST['locale'] : '');
+ $region = ((x($_REQUEST,'region')) ? $_REQUEST['region'] : '');
+ $postcode = ((x($_REQUEST,'postcode')) ? $_REQUEST['postcode'] : '');
+ $country = ((x($_REQUEST,'country')) ? $_REQUEST['country'] : '');
+ $gender = ((x($_REQUEST,'gender')) ? $_REQUEST['gender'] : '');
+ $marital = ((x($_REQUEST,'marital')) ? $_REQUEST['marital'] : '');
+ $sexual = ((x($_REQUEST,'sexual')) ? $_REQUEST['sexual'] : '');
+ $keywords = ((x($_REQUEST,'keywords')) ? $_REQUEST['keywords'] : '');
+ $agege = ((x($_REQUEST,'agege')) ? intval($_REQUEST['agege']) : 0 );
+ $agele = ((x($_REQUEST,'agele')) ? intval($_REQUEST['agele']) : 0 );
+ $kw = ((x($_REQUEST,'kw')) ? intval($_REQUEST['kw']) : 0 );
+ $forums = ((array_key_exists('pubforums',$_REQUEST)) ? intval($_REQUEST['pubforums']) : 0);
+
+ if(get_config('system','disable_directory_keywords'))
+ $kw = 0;
+
+
+ // by default use a safe search
+ $safe = ((x($_REQUEST,'safe'))); // ? intval($_REQUEST['safe']) : 1 );
+ if ($safe === false)
+ $safe = 1;
+
+ if(array_key_exists('sync',$_REQUEST)) {
+ if($_REQUEST['sync'])
+ $sync = datetime_convert('UTC','UTC',$_REQUEST['sync']);
+ else
+ $sync = datetime_convert('UTC','UTC','2010-01-01 01:01:00');
+ }
+ else
+ $sync = false;
+
+
+ if($hub)
+ $hub_query = " and xchan_hash in (select hubloc_hash from hubloc where hubloc_host = '" . protect_sprintf(dbesc($hub)) . "') ";
+ else
+ $hub_query = '';
+
+ $sort_order = ((x($_REQUEST,'order')) ? $_REQUEST['order'] : '');
+
+ $joiner = ' OR ';
+ if($_REQUEST['and'])
+ $joiner = ' AND ';
+
+ if($name)
+ $sql_extra .= $this->dir_query_build($joiner,'xchan_name',$name);
+ if($address)
+ $sql_extra .= $this->dir_query_build($joiner,'xchan_addr',$address);
+ if($city)
+ $sql_extra .= $this->dir_query_build($joiner,'xprof_locale',$city);
+ if($region)
+ $sql_extra .= $this->dir_query_build($joiner,'xprof_region',$region);
+ if($post)
+ $sql_extra .= $this->dir_query_build($joiner,'xprof_postcode',$post);
+ if($country)
+ $sql_extra .= $this->dir_query_build($joiner,'xprof_country',$country);
+ if($gender)
+ $sql_extra .= $this->dir_query_build($joiner,'xprof_gender',$gender);
+ if($marital)
+ $sql_extra .= $this->dir_query_build($joiner,'xprof_marital',$marital);
+ if($sexual)
+ $sql_extra .= $this->dir_query_build($joiner,'xprof_sexual',$sexual);
+ if($keywords)
+ $sql_extra .= $this->dir_query_build($joiner,'xprof_keywords',$keywords);
+
+
+ // we only support an age range currently. You must set both agege
+ // (greater than or equal) and agele (less than or equal)
+
+ if($agele && $agege) {
+ $sql_extra .= " $joiner ( xprof_age <= " . intval($agele) . " ";
+ $sql_extra .= " AND xprof_age >= " . intval($agege) . ") ";
+ }
+
+
+ if($hash) {
+ $sql_extra = " AND xchan_hash like '" . dbesc($hash) . protect_sprintf('%') . "' ";
+ }
+
+
+ $perpage = (($_REQUEST['n']) ? $_REQUEST['n'] : 60);
+ $page = (($_REQUEST['p']) ? intval($_REQUEST['p'] - 1) : 0);
+ $startrec = (($page+1) * $perpage) - $perpage;
+ $limit = (($_REQUEST['limit']) ? intval($_REQUEST['limit']) : 0);
+ $return_total = ((x($_REQUEST,'return_total')) ? intval($_REQUEST['return_total']) : 0);
+
+ // mtime is not currently working
+
+ $mtime = ((x($_REQUEST,'mtime')) ? datetime_convert('UTC','UTC',$_REQUEST['mtime']) : '');
+
+ // ok a separate tag table won't work.
+ // merge them into xprof
+
+ $ret['success'] = true;
+
+ // If &limit=n, return at most n entries
+ // If &return_total=1, we count matching entries and return that as 'total_items' for use in pagination.
+ // By default we return one page (default 80 items maximum) and do not count total entries
+
+ $logic = ((strlen($sql_extra)) ? 'false' : 'true');
+
+ if($hash)
+ $logic = 'true';
+
+ if($dirmode == DIRECTORY_MODE_STANDALONE) {
+ $sql_extra .= " and xchan_addr like '%%" . \App::get_hostname() . "' ";
+ }
+
+ $safesql = (($safe > 0) ? " and xchan_censored = 0 and xchan_selfcensored = 0 " : '');
+ if($safe < 0)
+ $safesql = " and ( xchan_censored = 1 OR xchan_selfcensored = 1 ) ";
+
+ if($forums)
+ $safesql .= " and xchan_pubforum = " . ((intval($forums)) ? '1 ' : '0 ');
+
+ if($limit)
+ $qlimit = " LIMIT $limit ";
+ else {
+ $qlimit = " LIMIT " . intval($perpage) . " OFFSET " . intval($startrec);
+ if($return_total) {
+ $r = q("SELECT COUNT(xchan_hash) AS `total` FROM xchan left join xprof on xchan_hash = xprof_hash where $logic $sql_extra and xchan_network = 'zot' and xchan_hidden = 0 and xchan_orphan = 0 and xchan_deleted = 0 $safesql ");
+ if($r) {
+ $ret['total_items'] = $r[0]['total'];
+ }
+ }
+ }
+
+ if($sort_order == 'normal') {
+ $order = " order by xchan_name asc ";
+
+ // Start the alphabetic search at 'A'
+ // This will make a handful of channels whose names begin with
+ // punctuation un-searchable in this mode
+
+ $safesql .= " and ascii(substring(xchan_name FROM 1 FOR 1)) > 64 ";
+ }
+ elseif($sort_order == 'reverse')
+ $order = " order by xchan_name desc ";
+ elseif($sort_order == 'reversedate')
+ $order = " order by xchan_name_date asc ";
+ else
+ $order = " order by xchan_name_date desc ";
+
+
+ if($sync) {
+ $spkt = array('transactions' => array());
+ $r = q("select * from updates where ud_date >= '%s' and ud_guid != '' order by ud_date desc",
+ dbesc($sync)
+ );
+ if($r) {
+ foreach($r as $rr) {
+ $flags = array();
+ if($rr['ud_flags'] & UPDATE_FLAGS_DELETED)
+ $flags[] = 'deleted';
+ if($rr['ud_flags'] & UPDATE_FLAGS_FORCED)
+ $flags[] = 'forced';
+
+ $spkt['transactions'][] = array(
+ 'hash' => $rr['ud_hash'],
+ 'address' => $rr['ud_addr'],
+ 'transaction_id' => $rr['ud_guid'],
+ 'timestamp' => $rr['ud_date'],
+ 'flags' => $flags
+ );
+ }
+ }
+ $r = q("select * from xlink where xlink_static = 1 and xlink_updated >= '%s' ",
+ dbesc($sync)
+ );
+ if($r) {
+ $spkt['ratings'] = array();
+ foreach($r as $rr) {
+ $spkt['ratings'][] = array(
+ 'type' => 'rating',
+ 'encoding' => 'zot',
+ 'channel' => $rr['xlink_xchan'],
+ 'target' => $rr['xlink_link'],
+ 'rating' => intval($rr['xlink_rating']),
+ 'rating_text' => $rr['xlink_rating_text'],
+ 'signature' => $rr['xlink_sig'],
+ 'edited' => $rr['xlink_updated']
+ );
+ }
+ }
+ json_return_and_die($spkt);
+ }
+ else {
+
+ $r = q("SELECT xchan.*, xprof.* from xchan left join xprof on xchan_hash = xprof_hash
+ where ( $logic $sql_extra ) $hub_query and xchan_network = 'zot' and xchan_hidden = 0 and xchan_orphan = 0 and xchan_deleted = 0
+ $safesql $order $qlimit "
+ );
+
+
+
+ $ret['page'] = $page + 1;
+ $ret['records'] = count($r);
+ }
+
+
+
+ if($r) {
+
+ $entries = array();
+
+ foreach($r as $rr) {
+
+ $entry = array();
+
+ $pc = q("select count(xlink_rating) as total_ratings from xlink where xlink_link = '%s' and xlink_rating != 0 and xlink_static = 1 group by xlink_rating",
+ dbesc($rr['xchan_hash'])
+ );
+
+ if($pc)
+ $entry['total_ratings'] = intval($pc[0]['total_ratings']);
+ else
+ $entry['total_ratings'] = 0;
+
+ $entry['name'] = $rr['xchan_name'];
+ $entry['hash'] = $rr['xchan_hash'];
+
+ $entry['public_forum'] = (intval($rr['xchan_pubforum']) ? true : false);
+
+ $entry['url'] = $rr['xchan_url'];
+ $entry['photo_l'] = $rr['xchan_photo_l'];
+ $entry['photo'] = $rr['xchan_photo_m'];
+ $entry['address'] = $rr['xchan_addr'];
+ $entry['description'] = $rr['xprof_desc'];
+ $entry['locale'] = $rr['xprof_locale'];
+ $entry['region'] = $rr['xprof_region'];
+ $entry['postcode'] = $rr['xprof_postcode'];
+ $entry['country'] = $rr['xprof_country'];
+ $entry['birthday'] = $rr['xprof_dob'];
+ $entry['age'] = $rr['xprof_age'];
+ $entry['gender'] = $rr['xprof_gender'];
+ $entry['marital'] = $rr['xprof_marital'];
+ $entry['sexual'] = $rr['xprof_sexual'];
+ $entry['about'] = $rr['xprof_about'];
+ $entry['homepage'] = $rr['xprof_homepage'];
+ $entry['hometown'] = $rr['xprof_hometown'];
+ $entry['keywords'] = $rr['xprof_keywords'];
+
+ $entries[] = $entry;
+
+ }
+
+ $ret['results'] = $entries;
+ if($kw) {
+ $k = dir_tagadelic($kw);
+ if($k) {
+ $ret['keywords'] = array();
+ foreach($k as $kv) {
+ $ret['keywords'][] = array('term' => $kv[0],'weight' => $kv[1], 'normalise' => $kv[2]);
+ }
+ }
+ }
+ }
+
+ json_return_and_die($ret);
+ }
+
+ function dir_query_build($joiner,$field,$s) {
+ $ret = '';
+ if(trim($s))
+ $ret .= dbesc($joiner) . " " . dbesc($field) . " like '" . protect_sprintf( '%' . dbesc($s) . '%' ) . "' ";
+ return $ret;
+ }
+
+ function dir_flag_build($joiner,$field,$bit,$s) {
+ return dbesc($joiner) . " ( " . dbesc($field) . " & " . intval($bit) . " ) " . ((intval($s)) ? '>' : '=' ) . " 0 ";
+ }
+
+
+ function dir_parse_query($s) {
+
+ $ret = array();
+ $curr = array();
+ $all = explode(' ',$s);
+ $quoted_string = false;
+
+ if($all) {
+ foreach($all as $q) {
+ if($quoted_string === false) {
+ if($q === 'and') {
+ $curr['logic'] = 'and';
+ continue;
+ }
+ if($q === 'or') {
+ $curr['logic'] = 'or';
+ continue;
+ }
+ if($q === 'not') {
+ $curr['logic'] .= ' not';
+ continue;
+ }
+ if(strpos($q,'=')) {
+ if(! isset($curr['logic']))
+ $curr['logic'] = 'or';
+ $curr['field'] = trim(substr($q,0,strpos($q,'=')));
+ $curr['value'] = trim(substr($q,strpos($q,'=')+1));
+ if($curr['value'][0] == '"' && $curr['value'][strlen($curr['value'])-1] != '"') {
+ $quoted_string = true;
+ $curr['value'] = substr($curr['value'],1);
+ continue;
+ }
+ elseif($curr['value'][0] == '"' && $curr['value'][strlen($curr['value'])-1] == '"') {
+ $curr['value'] = substr($curr['value'],1,strlen($curr['value'])-2);
+ $ret[] = $curr;
+ $curr = array();
+ continue;
+ }
+ else {
+ $ret[] = $curr;
+ $curr = array();
+ continue;
+ }
+ }
+ }
+ else {
+ if($q[strlen($q)-1] == '"') {
+ $curr['value'] .= ' ' . str_replace('"','',trim($q));
+ $ret[] = $curr;
+ $curr = array();
+ $quoted_string = false;
+ }
+ else
+ $curr['value'] .= ' ' . trim(q);
+ }
+ }
+ }
+ logger('dir_parse_query:' . print_r($ret,true),LOGGER_DATA);
+ return $ret;
+ }
+
+
+
+
+
+
+
+ function list_public_sites() {
+
+ $rand = db_getfunc('rand');
+ $realm = get_directory_realm();
+ if($realm == DIRECTORY_REALM) {
+ $r = q("select * from site where site_access != 0 and site_register !=0 and ( site_realm = '%s' or site_realm = '') and site_type = %d order by $rand",
+ dbesc($realm),
+ intval(SITE_TYPE_ZOT)
+ );
+ }
+ else {
+ $r = q("select * from site where site_access != 0 and site_register !=0 and site_realm = '%s' and site_type = %d order by $rand",
+ dbesc($realm),
+ intval(SITE_TYPE_ZOT)
+ );
+ }
+
+ $ret = array('success' => false);
+
+ if($r) {
+ $ret['success'] = true;
+ $ret['sites'] = array();
+ $insecure = array();
+
+ foreach($r as $rr) {
+
+ if($rr['site_access'] == ACCESS_FREE)
+ $access = 'free';
+ elseif($rr['site_access'] == ACCESS_PAID)
+ $access = 'paid';
+ elseif($rr['site_access'] == ACCESS_TIERED)
+ $access = 'tiered';
+ else
+ $access = 'private';
+
+ if($rr['site_register'] == REGISTER_OPEN)
+ $register = 'open';
+ elseif($rr['site_register'] == REGISTER_APPROVE)
+ $register = 'approve';
+ else
+ $register = 'closed';
+
+ if(strpos($rr['site_url'],'https://') !== false)
+ $ret['sites'][] = array('url' => $rr['site_url'], 'access' => $access, 'register' => $register, 'sellpage' => $rr['site_sellpage'], 'location' => $rr['site_location'], 'project' => $rr['site_project']);
+ else
+ $insecure[] = array('url' => $rr['site_url'], 'access' => $access, 'register' => $register, 'sellpage' => $rr['site_sellpage'], 'location' => $rr['site_location'], 'project' => $rr['site_project']);
+ }
+ if($insecure) {
+ $ret['sites'] = array_merge($ret['sites'],$insecure);
+ }
+ }
+ return $ret;
+ }
+
+}
diff --git a/Zotlabs/Module/Display.php b/Zotlabs/Module/Display.php
new file mode 100644
index 000000000..2a5a04a2a
--- /dev/null
+++ b/Zotlabs/Module/Display.php
@@ -0,0 +1,346 @@
+<?php
+namespace Zotlabs\Module;
+
+
+
+class Display extends \Zotlabs\Web\Controller {
+
+ function get($update = 0, $load = false) {
+
+ // logger("mod-display: update = $update load = $load");
+
+
+ $checkjs = new \Zotlabs\Web\CheckJS(1);
+
+
+ if($load)
+ $_SESSION['loadtime'] = datetime_convert();
+
+
+ if(intval(get_config('system','block_public')) && (! local_channel()) && (! remote_channel())) {
+ notice( t('Public access denied.') . EOL);
+ return;
+ }
+
+ require_once("include/bbcode.php");
+ require_once('include/security.php');
+ require_once('include/conversation.php');
+ require_once('include/acl_selectors.php');
+ require_once('include/items.php');
+
+
+ \App::$page['htmlhead'] .= replace_macros(get_markup_template('display-head.tpl'), array());
+
+ if(argc() > 1 && argv(1) !== 'load')
+ $item_hash = argv(1);
+
+
+ if($_REQUEST['mid'])
+ $item_hash = $_REQUEST['mid'];
+
+
+ if(! $item_hash) {
+ \App::$error = 404;
+ notice( t('Item not found.') . EOL);
+ return;
+ }
+
+ $observer_is_owner = false;
+
+
+ if(local_channel() && (! $update)) {
+
+ $channel = \App::get_channel();
+
+
+ $channel_acl = array(
+ 'allow_cid' => $channel['channel_allow_cid'],
+ 'allow_gid' => $channel['channel_allow_gid'],
+ 'deny_cid' => $channel['channel_deny_cid'],
+ 'deny_gid' => $channel['channel_deny_gid']
+ );
+
+
+ $x = array(
+ 'is_owner' => true,
+ 'allow_location' => ((intval(get_pconfig($channel['channel_id'],'system','use_browser_location'))) ? '1' : ''),
+ 'default_location' => $channel['channel_location'],
+ 'nickname' => $channel['channel_address'],
+ 'lockstate' => (($group || $cid || $channel['channel_allow_cid'] || $channel['channel_allow_gid'] || $channel['channel_deny_cid'] || $channel['channel_deny_gid']) ? 'lock' : 'unlock'),
+
+ 'acl' => populate_acl($channel_acl),
+ 'bang' => '',
+ 'visitor' => true,
+ 'profile_uid' => local_channel(),
+ 'return_path' => 'channel/' . $channel['channel_address'],
+ 'expanded' => true,
+ 'editor_autocomplete' => true,
+ 'bbco_autocomplete' => 'bbcode',
+ 'bbcode' => true
+ );
+
+ $o = '<div id="jot-popup">';
+ $o .= status_editor($a,$x);
+ $o .= '</div>';
+
+ }
+
+ // This page can be viewed by anybody so the query could be complicated
+ // First we'll see if there is a copy of the item which is owned by us - if we're logged in locally.
+ // If that fails (or we aren't logged in locally),
+ // query an item in which the observer (if logged in remotely) has cid or gid rights
+ // and if that fails, look for a copy of the post that has no privacy restrictions.
+ // If we find the post, but we don't find a copy that we're allowed to look at, this fact needs to be reported.
+
+ // find a copy of the item somewhere
+
+ $target_item = null;
+
+ $r = q("select id, uid, mid, parent_mid, item_type, item_deleted from item where mid like '%s' limit 1",
+ dbesc($item_hash . '%')
+ );
+
+ if($r) {
+ $target_item = $r[0];
+ }
+
+ $r = null;
+
+ if($target_item['item_type'] == ITEM_TYPE_WEBPAGE) {
+ $x = q("select * from channel where channel_id = %d limit 1",
+ intval($target_item['uid'])
+ );
+ $y = q("select * from item_id where uid = %d and service = 'WEBPAGE' and iid = %d limit 1",
+ intval($target_item['uid']),
+ intval($target_item['id'])
+ );
+ if($x && $y) {
+ goaway(z_root() . '/page/' . $x[0]['channel_address'] . '/' . $y[0]['sid']);
+ }
+ else {
+ notice( t('Page not found.') . EOL);
+ return '';
+ }
+ }
+
+
+ $simple_update = (($update) ? " AND item_unseen = 1 " : '');
+
+ if($update && $_SESSION['loadtime'])
+ $simple_update = " AND (( item_unseen = 1 AND item.changed > '" . datetime_convert('UTC','UTC',$_SESSION['loadtime']) . "' ) OR item.changed > '" . datetime_convert('UTC','UTC',$_SESSION['loadtime']) . "' ) ";
+ if($load)
+ $simple_update = '';
+
+
+
+ if((! $update) && (! $load)) {
+
+
+ $o .= '<div id="live-display"></div>' . "\r\n";
+ $o .= "<script> var profile_uid = " . ((intval(local_channel())) ? local_channel() : (-1))
+ . "; var netargs = '?f='; var profile_page = " . \App::$pager['page'] . "; </script>\r\n";
+
+ \App::$page['htmlhead'] .= replace_macros(get_markup_template("build_query.tpl"),array(
+ '$baseurl' => z_root(),
+ '$pgtype' => 'display',
+ '$uid' => '0',
+ '$gid' => '0',
+ '$cid' => '0',
+ '$cmin' => '0',
+ '$cmax' => '99',
+ '$star' => '0',
+ '$liked' => '0',
+ '$conv' => '0',
+ '$spam' => '0',
+ '$fh' => '0',
+ '$nouveau' => '0',
+ '$wall' => '0',
+ '$page' => ((\App::$pager['page'] != 1) ? \App::$pager['page'] : 1),
+ '$list' => ((x($_REQUEST,'list')) ? intval($_REQUEST['list']) : 0),
+ '$search' => '',
+ '$order' => '',
+ '$file' => '',
+ '$cats' => '',
+ '$tags' => '',
+ '$dend' => '',
+ '$dbegin' => '',
+ '$verb' => '',
+ '$mid' => $item_hash
+ ));
+
+
+ }
+
+ $observer_hash = get_observer_hash();
+ $item_normal = item_normal();
+
+ $sql_extra = public_permissions_sql($observer_hash);
+
+ if(($update && $load) || ($checkjs->disabled())) {
+
+ $updateable = false;
+
+ $pager_sql = sprintf(" LIMIT %d OFFSET %d ", intval(\App::$pager['itemspage']),intval(\App::$pager['start']));
+
+ if($load || ($checkjs->disabled())) {
+ $r = null;
+
+ require_once('include/identity.php');
+ $sys = get_sys_channel();
+ $sysid = $sys['channel_id'];
+
+ if(local_channel()) {
+ $r = q("SELECT * from item
+ WHERE uid = %d
+ and mid = '%s'
+ $item_normal
+ limit 1",
+ intval(local_channel()),
+ dbesc($target_item['parent_mid'])
+ );
+ if($r) {
+ $updateable = true;
+
+ }
+
+ }
+ if($r === null) {
+
+ // in case somebody turned off public access to sys channel content using permissions
+ // make that content unsearchable by ensuring the owner_xchan can't match
+
+ if(! perm_is_allowed($sysid,$observer_hash,'view_stream'))
+ $sysid = 0;
+
+
+ $r = q("SELECT * from item
+ WHERE mid = '%s'
+ AND (((( `item`.`allow_cid` = '' AND `item`.`allow_gid` = '' AND `item`.`deny_cid` = ''
+ AND `item`.`deny_gid` = '' AND item_private = 0 )
+ and owner_xchan in ( " . stream_perms_xchans(($observer_hash) ? (PERMS_NETWORK|PERMS_PUBLIC) : PERMS_PUBLIC) . " ))
+ OR uid = %d )
+ $sql_extra )
+ $item_normal
+ limit 1",
+ dbesc($target_item['parent_mid']),
+ intval($sysid)
+ );
+
+ }
+ }
+ }
+
+ elseif($update && !$load) {
+ $r = null;
+
+ require_once('include/identity.php');
+ $sys = get_sys_channel();
+ $sysid = $sys['channel_id'];
+
+ if(local_channel()) {
+ $r = q("SELECT * from item
+ WHERE uid = %d
+ and mid = '%s'
+ $item_normal
+ $simple_update
+ limit 1",
+ intval(local_channel()),
+ dbesc($target_item['parent_mid'])
+ );
+ if($r) {
+ $updateable = true;
+ }
+ }
+ if($r === null) {
+ // in case somebody turned off public access to sys channel content using permissions
+ // make that content unsearchable by ensuring the owner_xchan can't match
+ if(! perm_is_allowed($sysid,$observer_hash,'view_stream'))
+ $sysid = 0;
+
+ $r = q("SELECT * from item
+ WHERE mid = '%s'
+ AND (((( `item`.`allow_cid` = '' AND `item`.`allow_gid` = '' AND `item`.`deny_cid` = ''
+ AND `item`.`deny_gid` = '' AND item_private = 0 )
+ and owner_xchan in ( " . stream_perms_xchans(($observer_hash) ? (PERMS_NETWORK|PERMS_PUBLIC) : PERMS_PUBLIC) . " ))
+ OR uid = %d )
+ $sql_extra )
+ $item_normal
+ $simple_update
+ limit 1",
+ dbesc($target_item['parent_mid']),
+ intval($sysid)
+ );
+ }
+ $_SESSION['loadtime'] = datetime_convert();
+ }
+
+ else {
+ $r = array();
+ }
+
+ if($r) {
+
+ $parents_str = ids_to_querystr($r,'id');
+ if($parents_str) {
+
+ $items = q("SELECT `item`.*, `item`.`id` AS `item_id`
+ FROM `item`
+ WHERE parent in ( %s ) $item_normal ",
+ dbesc($parents_str)
+ );
+
+ xchan_query($items);
+ $items = fetch_post_tags($items,true);
+ $items = conv_sort($items,'created');
+ }
+ } else {
+ $items = array();
+ }
+
+
+ if ($checkjs->disabled()) {
+ $o .= conversation($a, $items, 'display', $update, 'traditional');
+ if ($items[0]['title'])
+ \App::$page['title'] = $items[0]['title'] . " - " . \App::$page['title'];
+ }
+ else {
+ $o .= conversation($a, $items, 'display', $update, 'client');
+ }
+
+ if($updateable) {
+ $x = q("UPDATE item SET item_unseen = 0 where item_unseen = 1 AND uid = %d and parent = %d ",
+ intval(local_channel()),
+ intval($r[0]['parent'])
+ );
+ }
+
+ $o .= '<div id="content-complete"></div>';
+
+ return $o;
+
+
+ /*
+ elseif((! $update) && (! {
+
+ $r = q("SELECT `id`, item_flags FROM `item` WHERE `id` = '%s' OR `mid` = '%s' LIMIT 1",
+ dbesc($item_hash),
+ dbesc($item_hash)
+ );
+ if($r) {
+ if(intval($r[0]['item_deleted'])) {
+ notice( t('Item has been removed.') . EOL );
+ }
+ else {
+ notice( t('Permission denied.') . EOL );
+ }
+ }
+ else {
+ notice( t('Item not found.') . EOL );
+ }
+
+ }
+ */
+ }
+
+
+}
diff --git a/Zotlabs/Module/Dreport.php b/Zotlabs/Module/Dreport.php
new file mode 100644
index 000000000..e8709c952
--- /dev/null
+++ b/Zotlabs/Module/Dreport.php
@@ -0,0 +1,145 @@
+<?php
+namespace Zotlabs\Module;
+
+
+class Dreport extends \Zotlabs\Web\Controller {
+
+ function get() {
+
+ if(! local_channel()) {
+ notice( t('Permission denied') . EOL);
+ return;
+ }
+
+ $table = 'item';
+
+ $channel = \App::get_channel();
+
+ $mid = ((argc() > 1) ? argv(1) : '');
+
+ if($mid === 'mail') {
+ $table = 'mail';
+ $mid = ((argc() > 2) ? argv(2) : '');
+ }
+
+
+ if(! $mid) {
+ notice( t('Invalid message') . EOL);
+ return;
+ }
+
+ switch($table) {
+ case 'item':
+ $i = q("select id from item where mid = '%s' and author_xchan = '%s' ",
+ dbesc($mid),
+ dbesc($channel['channel_hash'])
+ );
+ break;
+ case 'mail':
+ $i = q("select id from mail where mid = '%s' and from_xchan = '%s'",
+ dbesc($mid),
+ dbesc($channel['channel_hash'])
+ );
+ break;
+ default:
+ break;
+ }
+
+ if(! $i) {
+ notice( t('Permission denied') . EOL);
+ return;
+ }
+
+ $r = q("select * from dreport where dreport_xchan = '%s' and dreport_mid = '%s'",
+ dbesc($channel['channel_hash']),
+ dbesc($mid)
+ );
+
+ if(! $r) {
+ notice( t('no results') . EOL);
+ return;
+ }
+
+ $o .= '<div class="generic-content-wrapper-styled">';
+ $o .= '<h2>' . sprintf( t('Delivery report for %1$s'),substr($mid,0,32)) . '...' . '</h2>';
+ $o .= '<table>';
+
+ for($x = 0; $x < count($r); $x++ ) {
+ $r[$x]['name'] = escape_tags(substr($r[$x]['dreport_recip'],strpos($r[$x]['dreport_recip'],' ')));
+
+ // This has two purposes: 1. make the delivery report strings translateable, and
+ // 2. assign an ordering to item delivery results so we can group them and provide
+ // a readable report with more interesting events listed toward the top and lesser
+ // interesting items towards the bottom
+
+ switch($r[$x]['dreport_result']) {
+ case 'channel sync processed':
+ $r[$x]['gravity'] = 0;
+ $r[$x]['dreport_result'] = t('channel sync processed');
+ break;
+ case 'queued':
+ $r[$x]['gravity'] = 2;
+ $r[$x]['dreport_result'] = t('queued');
+ break;
+ case 'posted':
+ $r[$x]['gravity'] = 3;
+ $r[$x]['dreport_result'] = t('posted');
+ break;
+ case 'accepted for delivery':
+ $r[$x]['gravity'] = 4;
+ $r[$x]['dreport_result'] = t('accepted for delivery');
+ break;
+ case 'updated':
+ $r[$x]['gravity'] = 5;
+ $r[$x]['dreport_result'] = t('updated');
+ case 'update ignored':
+ $r[$x]['gravity'] = 6;
+ $r[$x]['dreport_result'] = t('update ignored');
+ break;
+ case 'permission denied':
+ $r[$x]['dreport_result'] = t('permission denied');
+ $r[$x]['gravity'] = 6;
+ break;
+ case 'recipient not found':
+ $r[$x]['dreport_result'] = t('recipient not found');
+ break;
+ case 'mail recalled':
+ $r[$x]['dreport_result'] = t('mail recalled');
+ break;
+ case 'duplicate mail received':
+ $r[$x]['dreport_result'] = t('duplicate mail received');
+ break;
+ case 'mail delivered':
+ $r[$x]['dreport_result'] = t('mail delivered');
+ break;
+ default:
+ $r[$x]['gravity'] = 1;
+ break;
+ }
+ }
+
+ usort($r,'self::dreport_gravity_sort');
+
+
+ foreach($r as $rr) {
+ $o .= '<tr><td width="40%">' . $rr['name'] . '</td><td width="20%">' . escape_tags($rr['dreport_result']) . '</td><td width="20%">' . escape_tags($rr['dreport_time']) . '</td></tr>';
+ }
+ $o .= '</table>';
+ $o .= '</div>';
+
+ return $o;
+
+
+
+ }
+
+ private static function dreport_gravity_sort($a,$b) {
+ if($a['gravity'] == $b['gravity']) {
+ if($a['name'] === $b['name'])
+ return strcmp($a['dreport_time'],$b['dreport_time']);
+ return strcmp($a['name'],$b['name']);
+ }
+ return (($a['gravity'] > $b['gravity']) ? 1 : (-1));
+ }
+
+}
diff --git a/Zotlabs/Module/Editblock.php b/Zotlabs/Module/Editblock.php
new file mode 100644
index 000000000..90016952e
--- /dev/null
+++ b/Zotlabs/Module/Editblock.php
@@ -0,0 +1,198 @@
+<?php
+namespace Zotlabs\Module;
+
+require_once('include/identity.php');
+require_once('include/acl_selectors.php');
+
+
+class Editblock extends \Zotlabs\Web\Controller {
+
+ function init() {
+
+ if(argc() > 1 && argv(1) === 'sys' && is_site_admin()) {
+ $sys = get_sys_channel();
+ if($sys && intval($sys['channel_id'])) {
+ \App::$is_sys = true;
+ }
+ }
+
+ if(argc() > 1)
+ $which = argv(1);
+ else
+ return;
+
+ profile_load($a,$which);
+
+ }
+
+
+
+ function get() {
+
+ if(! \App::$profile) {
+ notice( t('Requested profile is not available.') . EOL );
+ \App::$error = 404;
+ return;
+ }
+
+ $which = argv(1);
+
+ $uid = local_channel();
+ $owner = 0;
+ $channel = null;
+ $observer = \App::get_observer();
+
+ $channel = \App::get_channel();
+
+ if(\App::$is_sys && is_site_admin()) {
+ $sys = get_sys_channel();
+ if($sys && intval($sys['channel_id'])) {
+ $uid = $owner = intval($sys['channel_id']);
+ $channel = $sys;
+ $observer = $sys;
+ }
+ }
+
+ if(! $owner) {
+ // Figure out who the page owner is.
+ $r = q("select channel_id from channel where channel_address = '%s'",
+ dbesc($which)
+ );
+ if($r) {
+ $owner = intval($r[0]['channel_id']);
+ }
+ }
+
+ $ob_hash = (($observer) ? $observer['xchan_hash'] : '');
+
+ if(! perm_is_allowed($owner,$ob_hash,'write_pages')) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ $is_owner = (($uid && $uid == $owner) ? true : false);
+
+ $o = '';
+
+ // Figure out which post we're editing
+ $post_id = ((argc() > 2) ? intval(argv(2)) : 0);
+
+
+ if(! ($post_id && $owner)) {
+ notice( t('Item not found') . EOL);
+ return;
+ }
+
+ $itm = q("SELECT * FROM `item` WHERE `id` = %d and uid = %s LIMIT 1",
+ intval($post_id),
+ intval($owner)
+ );
+ if($itm) {
+ $item_id = q("select * from item_id where service = 'BUILDBLOCK' and iid = %d limit 1",
+ intval($itm[0]['id'])
+ );
+ if($item_id)
+ $block_title = $item_id[0]['sid'];
+ }
+ else {
+ notice( t('Item not found') . EOL);
+ return;
+ }
+
+ $plaintext = true;
+
+ $mimeselect = '';
+ $mimetype = $itm[0]['mimetype'];
+
+ if($mimetype != 'text/bbcode')
+ $plaintext = true;
+
+ if(get_config('system','page_mimetype'))
+ $mimeselect = '<input type="hidden" name="mimetype" value="' . $mimetype . '" />';
+ else
+ $mimeselect = mimetype_select($itm[0]['uid'],$mimetype);
+
+ \App::$page['htmlhead'] .= replace_macros(get_markup_template('jot-header.tpl'), array(
+ '$baseurl' => z_root(),
+ '$editselect' => (($plaintext) ? 'none' : '/(profile-jot-text|prvmail-text)/'),
+ '$pretext' => '',
+ '$ispublic' => '&nbsp;', // t('Visible to <strong>everybody</strong>'),
+ '$geotag' => '',
+ '$nickname' => $channel['channel_address'],
+ '$confirmdelete' => t('Delete block?'),
+ '$bbco_autocomplete'=> (($mimetype == 'text/bbcode') ? 'bbcode' : 'comanche-block')
+ ));
+
+ $tpl = get_markup_template("jot.tpl");
+
+ $jotplugins = '';
+ $jotnets = '';
+
+ call_hooks('jot_tool', $jotplugins);
+ call_hooks('jot_networks', $jotnets);
+
+ $rp = 'blocks/' . $channel['channel_address'];
+
+ $editor = replace_macros($tpl,array(
+ '$return_path' => $rp,
+ '$action' => 'item',
+ '$webpage' => ITEM_TYPE_BLOCK,
+ '$share' => t('Edit'),
+ '$bold' => t('Bold'),
+ '$italic' => t('Italic'),
+ '$underline' => t('Underline'),
+ '$quote' => t('Quote'),
+ '$code' => t('Code'),
+ '$writefiles' => perm_is_allowed($owner, get_observer_hash(), 'write_storage'),
+ '$upload' => t('Upload photo'),
+ '$attach' => t('Attach file'),
+ '$weblink' => t('Insert web link'),
+ '$youtube' => t('Insert YouTube video'),
+ '$video' => t('Insert Vorbis [.ogg] video'),
+ '$audio' => t('Insert Vorbis [.ogg] audio'),
+ '$setloc' => t('Set your location'),
+ '$noloc' => t('Clear browser location'),
+ '$wait' => t('Please wait'),
+ '$permset' => t('Permission settings'),
+ '$ptyp' => $itm[0]['type'],
+ '$mimeselect' => $mimeselect,
+ '$content' => undo_post_tagging($itm[0]['body']),
+ '$post_id' => $post_id,
+ '$baseurl' => z_root(),
+ '$defloc' => $channel['channel_location'],
+ '$visitor' => false,
+ '$public' => t('Public post'),
+ '$jotnets' => $jotnets,
+ '$title' => htmlspecialchars($itm[0]['title'],ENT_COMPAT,'UTF-8'),
+ '$placeholdertitle' => t('Title (optional)'),
+ '$pagetitle' => $block_title,
+ '$category' => '',
+ '$placeholdercategory' => t('Categories (optional, comma-separated list)'),
+ '$emtitle' => t('Example: bob@example.com, mary@example.com'),
+ '$lockstate' => $lockstate,
+ '$acl' => '',
+ '$bang' => '',
+ '$profile_uid' => (intval($channel['channel_id'])),
+ '$preview' => t('Preview'),
+ '$jotplugins' => $jotplugins,
+ '$sourceapp' => $itm[0]['app'],
+ '$defexpire' => '',
+ '$feature_expire' => false,
+ '$expires' => t('Set expiration date'),
+ '$bbcode' => (($mimetype == 'text/bbcode') ? true : false)
+ ));
+
+ $o .= replace_macros(get_markup_template('edpost_head.tpl'), array(
+ '$title' => t('Edit Block'),
+ '$delete' => ((($itm[0]['author_xchan'] === $ob_hash) || ($itm[0]['owner_xchan'] === $ob_hash)) ? t('Delete') : false),
+ '$id' => $itm[0]['id'],
+ '$editor' => $editor
+ ));
+
+ return $o;
+
+ }
+
+
+
+}
diff --git a/Zotlabs/Module/Editlayout.php b/Zotlabs/Module/Editlayout.php
new file mode 100644
index 000000000..cec55f5cc
--- /dev/null
+++ b/Zotlabs/Module/Editlayout.php
@@ -0,0 +1,195 @@
+<?php
+namespace Zotlabs\Module;
+
+require_once('include/identity.php');
+require_once('include/acl_selectors.php');
+
+
+class Editlayout extends \Zotlabs\Web\Controller {
+
+ function init() {
+
+ if(argc() > 1 && argv(1) === 'sys' && is_site_admin()) {
+ $sys = get_sys_channel();
+ if($sys && intval($sys['channel_id'])) {
+ \App::$is_sys = true;
+ }
+ }
+
+ if(argc() > 1)
+ $which = argv(1);
+ else
+ return;
+
+ profile_load($a,$which);
+
+ }
+
+ function get() {
+
+ if(! \App::$profile) {
+ notice( t('Requested profile is not available.') . EOL );
+ \App::$error = 404;
+ return;
+ }
+
+ $which = argv(1);
+
+ $uid = local_channel();
+ $owner = 0;
+ $channel = null;
+ $observer = \App::get_observer();
+
+ $channel = \App::get_channel();
+
+ if(\App::$is_sys && is_site_admin()) {
+ $sys = get_sys_channel();
+ if($sys && intval($sys['channel_id'])) {
+ $uid = $owner = intval($sys['channel_id']);
+ $channel = $sys;
+ $observer = $sys;
+ }
+ }
+
+ if(! $owner) {
+ // Figure out who the page owner is.
+ $r = q("select channel_id from channel where channel_address = '%s'",
+ dbesc($which)
+ );
+ if($r) {
+ $owner = intval($r[0]['channel_id']);
+ }
+ }
+
+ $ob_hash = (($observer) ? $observer['xchan_hash'] : '');
+
+ if(! perm_is_allowed($owner,$ob_hash,'write_pages')) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ $is_owner = (($uid && $uid == $owner) ? true : false);
+
+ $o = '';
+
+ // Figure out which post we're editing
+ $post_id = ((argc() > 2) ? intval(argv(2)) : 0);
+
+
+ if(! $post_id) {
+ notice( t('Item not found') . EOL);
+ return;
+ }
+
+ // Now we've got a post and an owner, let's find out if we're allowed to edit it
+
+ $ob_hash = (($observer) ? $observer['xchan_hash'] : '');
+
+ $perms = get_all_perms($owner,$ob_hash);
+
+ if(! $perms['write_pages']) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+
+ $itm = q("SELECT * FROM `item` WHERE `id` = %d and uid = %s LIMIT 1",
+ intval($post_id),
+ intval($owner)
+ );
+
+ $item_id = q("select * from item_id where service = 'PDL' and iid = %d limit 1",
+ intval($itm[0]['id'])
+ );
+ if($item_id)
+ $layout_title = $item_id[0]['sid'];
+
+ $plaintext = true;
+
+ \App::$page['htmlhead'] .= replace_macros(get_markup_template('jot-header.tpl'), array(
+ '$baseurl' => z_root(),
+ '$editselect' => (($plaintext) ? 'none' : '/(profile-jot-text|prvmail-text)/'),
+ '$pretext' => '',
+ '$ispublic' => '&nbsp;', // t('Visible to <strong>everybody</strong>'),
+ '$geotag' => $geotag,
+ '$nickname' => $channel['channel_address'],
+ '$confirmdelete' => t('Delete layout?'),
+ '$bbco_autocomplete'=> 'comanche'
+ ));
+
+
+ $tpl = get_markup_template("jot.tpl");
+
+ $jotplugins = '';
+ $jotnets = '';
+
+ call_hooks('jot_tool', $jotplugins);
+ call_hooks('jot_networks', $jotnets);
+
+
+ // FIXME A return path with $_SESSION doesn't always work for observer - it may WSoD
+ // instead of loading a sensible page. So, send folk to the webpage list.
+
+ $rp = 'layouts/' . $which;
+
+ $editor = replace_macros($tpl,array(
+ '$return_path' => $rp,
+ '$action' => 'item',
+ '$webpage' => ITEM_TYPE_PDL,
+ '$share' => t('Edit'),
+ '$bold' => t('Bold'),
+ '$italic' => t('Italic'),
+ '$underline' => t('Underline'),
+ '$quote' => t('Quote'),
+ '$code' => t('Code'),
+ '$upload' => t('Upload photo'),
+ '$attach' => t('Attach file'),
+ '$weblink' => t('Insert web link'),
+ '$youtube' => t('Insert YouTube video'),
+ '$video' => t('Insert Vorbis [.ogg] video'),
+ '$audio' => t('Insert Vorbis [.ogg] audio'),
+ '$setloc' => t('Set your location'),
+ '$noloc' => t('Clear browser location'),
+ '$wait' => t('Please wait'),
+ '$permset' => t('Permission settings'),
+ '$ptyp' => $itm[0]['type'],
+ '$content' => undo_post_tagging($itm[0]['body']),
+ '$post_id' => $post_id,
+ '$baseurl' => z_root(),
+ '$defloc' => $channel['channel_location'],
+ '$visitor' => false,
+ '$public' => t('Public post'),
+ '$jotnets' => $jotnets,
+ '$title' => htmlspecialchars($itm[0]['title'],ENT_COMPAT,'UTF-8'),
+ '$placeholdertitle' => t('Layout Description (Optional)'),
+ '$pagetitle' => $layout_title,
+ '$placeholdpagetitle' => t('Layout Name'),
+ '$category' => '',
+ '$placeholdercategory' => t('Categories (optional, comma-separated list)'),
+ '$emtitle' => t('Example: bob@example.com, mary@example.com'),
+ '$lockstate' => $lockstate,
+ '$acl' => '',
+ '$bang' => '',
+ '$profile_uid' => (intval($owner)),
+ '$jotplugins' => $jotplugins,
+ '$sourceapp' => t(\App::$sourcename),
+ '$defexpire' => '',
+ '$feature_expire' => false,
+ '$expires' => t('Set expiration date'),
+ ));
+
+
+ $o .= replace_macros(get_markup_template('edpost_head.tpl'), array(
+ '$title' => t('Edit Layout'),
+ '$delete' => ((($itm[0]['author_xchan'] === $ob_hash) || ($itm[0]['owner_xchan'] === $ob_hash)) ? t('Delete') : false),
+ '$id' => $itm[0]['id'],
+ '$editor' => $editor
+ ));
+
+ return $o;
+
+ }
+
+
+
+}
diff --git a/Zotlabs/Module/Editpost.php b/Zotlabs/Module/Editpost.php
new file mode 100644
index 000000000..d8b971f6c
--- /dev/null
+++ b/Zotlabs/Module/Editpost.php
@@ -0,0 +1,181 @@
+<?php
+namespace Zotlabs\Module; /** @file */
+
+require_once('include/acl_selectors.php');
+require_once('include/crypto.php');
+require_once('include/items.php');
+require_once('include/taxonomy.php');
+
+
+class Editpost extends \Zotlabs\Web\Controller {
+
+ function get() {
+
+ $o = '';
+
+ if(! local_channel()) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ $post_id = ((argc() > 1) ? intval(argv(1)) : 0);
+
+ if(! $post_id) {
+ notice( t('Item not found') . EOL);
+ return;
+ }
+
+ $itm = q("SELECT * FROM `item` WHERE `id` = %d AND ( owner_xchan = '%s' OR author_xchan = '%s' ) LIMIT 1",
+ intval($post_id),
+ dbesc(get_observer_hash()),
+ dbesc(get_observer_hash())
+ );
+
+ if(! count($itm)) {
+ notice( t('Item is not editable') . EOL);
+ return;
+ }
+
+ if($itm[0]['resource_type'] === 'event' && $itm[0]['resource_id']) {
+ goaway(z_root() . '/events/' . $itm[0]['resource_id'] . '?expandform=1');
+ }
+
+
+ $owner_uid = $itm[0]['uid'];
+
+
+ $plaintext = true;
+ // if(feature_enabled(local_channel(),'richtext'))
+ // $plaintext = false;
+
+ $channel = \App::get_channel();
+
+ \App::$page['htmlhead'] .= replace_macros(get_markup_template('jot-header.tpl'), array(
+ '$baseurl' => z_root(),
+ '$editselect' => (($plaintext) ? 'none' : '/(profile-jot-text|prvmail-text)/'),
+ '$pretext' => '',
+ '$ispublic' => '&nbsp;', // t('Visible to <strong>everybody</strong>'),
+ '$geotag' => $geotag,
+ '$nickname' => $channel['channel_address'],
+ '$expireswhen' => t('Expires YYYY-MM-DD HH:MM'),
+ '$confirmdelete' => t('Delete item?'),
+ '$editor_autocomplete'=> true,
+ '$bbco_autocomplete'=> 'bbcode'
+ ));
+
+ if(intval($itm[0]['item_obscured'])) {
+ $key = get_config('system','prvkey');
+ if($itm[0]['title'])
+ $itm[0]['title'] = crypto_unencapsulate(json_decode_plus($itm[0]['title']),$key);
+ if($itm[0]['body'])
+ $itm[0]['body'] = crypto_unencapsulate(json_decode_plus($itm[0]['body']),$key);
+ }
+
+ $tpl = get_markup_template("jot.tpl");
+
+ $jotplugins = '';
+ $jotnets = '';
+
+ call_hooks('jot_tool', $jotplugins);
+ call_hooks('jot_networks', $jotnets);
+
+ //$tpl = replace_macros($tpl,array('$jotplugins' => $jotplugins));
+
+ $voting = feature_enabled($owner_uid,'consensus_tools');
+
+ $category = '';
+ $catsenabled = ((feature_enabled($owner_uid,'categories')) ? 'categories' : '');
+
+ if ($catsenabled){
+ $itm = fetch_post_tags($itm);
+
+ $cats = get_terms_oftype($itm[0]['term'], TERM_CATEGORY);
+
+ foreach ($cats as $cat) {
+ if (strlen($category))
+ $category .= ', ';
+ $category .= $cat['term'];
+ }
+ }
+
+ if($itm[0]['attach']) {
+ $j = json_decode($itm[0]['attach'],true);
+ if($j) {
+ foreach($j as $jj) {
+ $itm[0]['body'] .= "\n" . '[attachment]' . basename($jj['href']) . ',' . $jj['revision'] . '[/attachment]' . "\n";
+ }
+ }
+ }
+
+ $cipher = get_pconfig(\App::$profile['profile_uid'],'system','default_cipher');
+ if(! $cipher)
+ $cipher = 'aes256';
+
+
+ $editor = replace_macros($tpl,array(
+ '$return_path' => $_SESSION['return_url'],
+ '$action' => 'item',
+ '$share' => t('Edit'),
+ '$bold' => t('Bold'),
+ '$italic' => t('Italic'),
+ '$underline' => t('Underline'),
+ '$quote' => t('Quote'),
+ '$code' => t('Code'),
+ '$upload' => t('Upload photo'),
+ '$attach' => t('Attach file'),
+ '$weblink' => t('Insert web link'),
+ '$youtube' => t('Insert YouTube video'),
+ '$video' => t('Insert Vorbis [.ogg] video'),
+ '$audio' => t('Insert Vorbis [.ogg] audio'),
+ '$setloc' => t('Set your location'),
+ '$noloc' => t('Clear browser location'),
+ '$voting' => t('Toggle voting'),
+ '$feature_voting' => $voting,
+ '$consensus' => intval($itm[0]['item_consensus']),
+ '$wait' => t('Please wait'),
+ '$permset' => t('Permission settings'),
+ '$ptyp' => $itm[0]['obj_type'],
+ '$content' => undo_post_tagging($itm[0]['body']),
+ '$post_id' => $post_id,
+ '$parent' => (($itm[0]['parent'] != $itm[0]['id']) ? $itm[0]['parent'] : ''),
+ '$baseurl' => z_root(),
+ '$defloc' => $channel['channel_location'],
+ '$visitor' => false,
+ '$public' => t('Public post'),
+ '$jotnets' => $jotnets,
+ '$title' => htmlspecialchars($itm[0]['title'],ENT_COMPAT,'UTF-8'),
+ '$placeholdertitle' => t('Title (optional)'),
+ '$category' => $category,
+ '$placeholdercategory' => t('Categories (optional, comma-separated list)'),
+ '$emtitle' => t('Example: bob@example.com, mary@example.com'),
+ '$lockstate' => $lockstate,
+ '$acl' => '',
+ '$bang' => '',
+ '$profile_uid' => $owner_uid,
+ '$preview' => t('Preview'),
+ '$jotplugins' => $jotplugins,
+ '$sourceapp' => t(\App::$sourcename),
+ '$catsenabled' => $catsenabled,
+ '$defexpire' => datetime_convert('UTC', date_default_timezone_get(),$itm[0]['expires']),
+ '$feature_expire' => ((feature_enabled(\App::$profile['profile_uid'],'content_expire') && (! $webpage)) ? true : false),
+ '$expires' => t('Set expiration date'),
+ '$feature_encrypt' => ((feature_enabled(\App::$profile['profile_uid'],'content_encrypt') && (! $webpage)) ? true : false),
+ '$encrypt' => t('Encrypt text'),
+ '$cipher' => $cipher,
+ '$expiryModalOK' => t('OK'),
+ '$expiryModalCANCEL' => t('Cancel'),
+ '$bbcode' => true
+ ));
+
+ $o .= replace_macros(get_markup_template('edpost_head.tpl'), array(
+ '$title' => t('Edit post'),
+ '$editor' => $editor
+ ));
+
+ return $o;
+
+ }
+
+
+
+}
diff --git a/Zotlabs/Module/Editwebpage.php b/Zotlabs/Module/Editwebpage.php
new file mode 100644
index 000000000..01d9e8aad
--- /dev/null
+++ b/Zotlabs/Module/Editwebpage.php
@@ -0,0 +1,239 @@
+<?php
+namespace Zotlabs\Module;
+
+require_once('include/identity.php');
+require_once('include/acl_selectors.php');
+
+
+class Editwebpage extends \Zotlabs\Web\Controller {
+
+ function init() {
+
+ if(argc() > 1 && argv(1) === 'sys' && is_site_admin()) {
+ $sys = get_sys_channel();
+ if($sys && intval($sys['channel_id'])) {
+ \App::$is_sys = true;
+ }
+ }
+
+ if(argc() > 1)
+ $which = argv(1);
+ else
+ return;
+
+ profile_load($a,$which);
+
+ }
+
+
+ function get() {
+
+ if(! \App::$profile) {
+ notice( t('Requested profile is not available.') . EOL );
+ \App::$error = 404;
+ return;
+ }
+
+ $which = argv(1);
+
+ $uid = local_channel();
+ $owner = 0;
+ $channel = null;
+ $observer = \App::get_observer();
+
+ $channel = \App::get_channel();
+
+ if(\App::$is_sys && is_site_admin()) {
+ $sys = get_sys_channel();
+ if($sys && intval($sys['channel_id'])) {
+ $uid = $owner = intval($sys['channel_id']);
+ $channel = $sys;
+ $observer = $sys;
+ }
+ }
+
+ if(! $owner) {
+ // Figure out who the page owner is.
+ $r = q("select channel_id from channel where channel_address = '%s'",
+ dbesc($which)
+ );
+ if($r) {
+ $owner = intval($r[0]['channel_id']);
+ }
+ }
+
+ $ob_hash = (($observer) ? $observer['xchan_hash'] : '');
+
+ if(! perm_is_allowed($owner,$ob_hash,'write_pages')) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ $is_owner = (($uid && $uid == $owner) ? true : false);
+
+ $o = '';
+
+ // Figure out which post we're editing
+ $post_id = ((argc() > 2) ? intval(argv(2)) : 0);
+
+
+ if(! $post_id) {
+ notice( t('Item not found') . EOL);
+ return;
+ }
+
+ $ob_hash = (($observer) ? $observer['xchan_hash'] : '');
+
+ $perms = get_all_perms($owner,$ob_hash);
+
+ if(! $perms['write_pages']) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ // We've already figured out which item we want and whose copy we need,
+ // so we don't need anything fancy here
+
+ $sql_extra = item_permissions_sql($owner);
+
+ $itm = q("SELECT * FROM `item` WHERE `id` = %d and uid = %s $sql_extra LIMIT 1",
+ intval($post_id),
+ intval($owner)
+ );
+
+ if(! $itm) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ if(intval($itm[0]['item_obscured'])) {
+ $key = get_config('system','prvkey');
+ if($itm[0]['title'])
+ $itm[0]['title'] = crypto_unencapsulate(json_decode_plus($itm[0]['title']),$key);
+ if($itm[0]['body'])
+ $itm[0]['body'] = crypto_unencapsulate(json_decode_plus($itm[0]['body']),$key);
+ }
+
+ $item_id = q("select * from item_id where service = 'WEBPAGE' and iid = %d limit 1",
+ intval($itm[0]['id'])
+ );
+ if($item_id)
+ $page_title = $item_id[0]['sid'];
+
+ $plaintext = true;
+
+ $mimetype = $itm[0]['mimetype'];
+
+ if($mimetype === 'application/x-php') {
+ if((! $uid) || ($uid != $itm[0]['uid'])) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+ }
+
+ $mimeselect = '';
+
+ if($mimetype != 'text/bbcode')
+ $plaintext = true;
+
+ if(get_config('system','page_mimetype'))
+ $mimeselect = '<input type="hidden" name="mimetype" value="' . $mimetype . '" />';
+ else
+ $mimeselect = mimetype_select($itm[0]['uid'],$mimetype);
+
+ $layout = get_config('system','page_layout');
+ if($layout)
+ $layoutselect = '<input type="hidden" name="layout_mid" value="' . $layout . '" />';
+ else
+ $layoutselect = layout_select($itm[0]['uid'],$itm[0]['layout_mid']);
+
+ \App::$page['htmlhead'] .= replace_macros(get_markup_template('jot-header.tpl'), array(
+ '$baseurl' => z_root(),
+ '$editselect' => (($plaintext) ? 'none' : '/(profile-jot-text|prvmail-text)/'),
+ '$pretext' => '',
+ '$ispublic' => '&nbsp;', // t('Visible to <strong>everybody</strong>'),
+ '$geotag' => $geotag,
+ '$nickname' => $channel['channel_address'],
+ '$confirmdelete' => t('Delete webpage?'),
+ '$bbco_autocomplete'=> (($mimetype == 'text/bbcode') ? 'bbcode' : '')
+ ));
+
+ $tpl = get_markup_template("jot.tpl");
+
+ $jotplugins = '';
+ $jotnets = '';
+
+ call_hooks('jot_tool', $jotplugins);
+ call_hooks('jot_networks', $jotnets);
+
+ // FIXME A return path with $_SESSION doesn't always work for observer - it may WSoD
+ // instead of loading a sensible page. So, send folk to the webpage list.
+
+ $rp = 'webpages/' . $which;
+
+ $editor = replace_macros($tpl,array(
+ '$return_path' => $rp,
+ '$webpage' => ITEM_TYPE_WEBPAGE,
+ '$placeholdpagetitle' => t('Page link title'),
+ '$pagetitle' => $page_title,
+ '$writefiles' => perm_is_allowed($owner, get_observer_hash(), 'write_storage'),
+ '$action' => 'item',
+ '$share' => t('Edit'),
+ '$bold' => t('Bold'),
+ '$italic' => t('Italic'),
+ '$underline' => t('Underline'),
+ '$quote' => t('Quote'),
+ '$code' => t('Code'),
+ '$upload' => t('Upload photo'),
+ '$attach' => t('Attach file'),
+ '$weblink' => t('Insert web link'),
+ '$youtube' => t('Insert YouTube video'),
+ '$video' => t('Insert Vorbis [.ogg] video'),
+ '$audio' => t('Insert Vorbis [.ogg] audio'),
+ '$setloc' => t('Set your location'),
+ '$noloc' => ((get_pconfig($uid, 'system', 'use_browser_location')) ? t('Clear browser location') : ''),
+ '$wait' => t('Please wait'),
+ '$permset' => t('Permission settings'),
+ '$ptyp' => $itm[0]['type'],
+ '$content' => undo_post_tagging($itm[0]['body']),
+ '$post_id' => $post_id,
+ '$baseurl' => z_root(),
+ '$defloc' => $itm[0]['location'],
+ '$visitor' => ($is_owner) ? true : false,
+ '$acl' => populate_acl($itm[0],false),
+ '$showacl' => ($is_owner) ? true : false,
+ '$public' => t('Public post'),
+ '$jotnets' => $jotnets,
+ '$mimeselect' => $mimeselect,
+ '$layoutselect' => $layoutselect,
+ '$title' => htmlspecialchars($itm[0]['title'],ENT_COMPAT,'UTF-8'),
+ '$placeholdertitle' => t('Title (optional)'),
+ '$category' => '',
+ '$placeholdercategory' => t('Categories (optional, comma-separated list)'),
+ '$emtitle' => t('Example: bob@example.com, mary@example.com'),
+ 'lockstate' => (((strlen($itm[0]['allow_cid'])) || (strlen($itm[0]['allow_gid'])) || (strlen($itm[0]['deny_cid'])) || (strlen($itm[0]['deny_gid']))) ? 'lock' : 'unlock'),
+ '$bang' => '',
+ '$profile_uid' => (intval($owner)),
+ '$preview' => t('Preview'),
+ '$jotplugins' => $jotplugins,
+ '$sourceapp' => \App::$sourcename,
+ '$defexpire' => '',
+ '$feature_expire' => false,
+ '$expires' => t('Set expiration date'),
+ '$bbcode' => (($mimetype == 'text/bbcode') ? true : false)
+ ));
+
+ $o .= replace_macros(get_markup_template('edpost_head.tpl'), array(
+ '$title' => t('Edit Webpage'),
+ '$delete' => ((($itm[0]['author_xchan'] === $ob_hash) || ($itm[0]['owner_xchan'] === $ob_hash)) ? t('Delete') : false),
+ '$editor' => $editor,
+ '$id' => $itm[0]['id']
+ ));
+
+ return $o;
+
+ }
+
+
+
+}
diff --git a/Zotlabs/Module/Events.php b/Zotlabs/Module/Events.php
new file mode 100644
index 000000000..a14e320b2
--- /dev/null
+++ b/Zotlabs/Module/Events.php
@@ -0,0 +1,714 @@
+<?php
+namespace Zotlabs\Module;
+
+require_once('include/conversation.php');
+require_once('include/bbcode.php');
+require_once('include/datetime.php');
+require_once('include/event.php');
+require_once('include/items.php');
+
+
+class Events extends \Zotlabs\Web\Controller {
+
+ function post() {
+
+ logger('post: ' . print_r($_REQUEST,true), LOGGER_DATA);
+
+ if(! local_channel())
+ return;
+
+ if(($_FILES) && array_key_exists('userfile',$_FILES) && intval($_FILES['userfile']['size'])) {
+ $src = $_FILES['userfile']['tmp_name'];
+ if($src) {
+ $result = parse_ical_file($src,local_channel());
+ if($result)
+ info( t('Calendar entries imported.') . EOL);
+ else
+ notice( t('No calendar entries found.') . EOL);
+ @unlink($src);
+ }
+ goaway(z_root() . '/events');
+ }
+
+
+ $event_id = ((x($_POST,'event_id')) ? intval($_POST['event_id']) : 0);
+ $event_hash = ((x($_POST,'event_hash')) ? $_POST['event_hash'] : '');
+
+ $xchan = ((x($_POST,'xchan')) ? dbesc($_POST['xchan']) : '');
+ $uid = local_channel();
+
+ $start_text = escape_tags($_REQUEST['start_text']);
+ $finish_text = escape_tags($_REQUEST['finish_text']);
+
+ $adjust = intval($_POST['adjust']);
+ $nofinish = intval($_POST['nofinish']);
+
+ $categories = escape_tags(trim($_POST['category']));
+
+ // only allow editing your own events.
+
+ if(($xchan) && ($xchan !== get_observer_hash()))
+ return;
+
+ if($start_text) {
+ $start = $start_text;
+ }
+ else {
+ $start = sprintf('%d-%d-%d %d:%d:0',$startyear,$startmonth,$startday,$starthour,$startminute);
+ }
+
+ if($nofinish) {
+ $finish = NULL_DATE;
+ }
+
+ if($finish_text) {
+ $finish = $finish_text;
+ }
+ else {
+ $finish = sprintf('%d-%d-%d %d:%d:0',$finishyear,$finishmonth,$finishday,$finishhour,$finishminute);
+ }
+
+ if($adjust) {
+ $start = datetime_convert(date_default_timezone_get(),'UTC',$start);
+ if(! $nofinish)
+ $finish = datetime_convert(date_default_timezone_get(),'UTC',$finish);
+ }
+ else {
+ $start = datetime_convert('UTC','UTC',$start);
+ if(! $nofinish)
+ $finish = datetime_convert('UTC','UTC',$finish);
+ }
+
+ // Don't allow the event to finish before it begins.
+ // It won't hurt anything, but somebody will file a bug report
+ // and we'll waste a bunch of time responding to it. Time that
+ // could've been spent doing something else.
+
+
+ $summary = escape_tags(trim($_POST['summary']));
+ $desc = escape_tags(trim($_POST['desc']));
+ $location = escape_tags(trim($_POST['location']));
+ $type = escape_tags(trim($_POST['type']));
+
+ require_once('include/text.php');
+ linkify_tags($a, $desc, local_channel());
+ linkify_tags($a, $location, local_channel());
+
+ //$action = ($event_hash == '') ? 'new' : "event/" . $event_hash;
+
+ //fixme: this url gives a wsod if there is a linebreak detected in one of the variables ($desc or $location)
+ //$onerror_url = z_root() . "/events/" . $action . "?summary=$summary&description=$desc&location=$location&start=$start_text&finish=$finish_text&adjust=$adjust&nofinish=$nofinish&type=$type";
+ $onerror_url = z_root() . "/events";
+
+ if(strcmp($finish,$start) < 0 && !$nofinish) {
+ notice( t('Event can not end before it has started.') . EOL);
+ if(intval($_REQUEST['preview'])) {
+ echo( t('Unable to generate preview.'));
+ killme();
+ }
+ goaway($onerror_url);
+ }
+
+ if((! $summary) || (! $start)) {
+ notice( t('Event title and start time are required.') . EOL);
+ if(intval($_REQUEST['preview'])) {
+ echo( t('Unable to generate preview.'));
+ killme();
+ }
+ goaway($onerror_url);
+ }
+
+ $share = ((intval($_POST['share'])) ? intval($_POST['share']) : 0);
+
+ $channel = \App::get_channel();
+
+ $acl = new \Zotlabs\Access\AccessList(false);
+
+ if($event_id) {
+ $x = q("select * from event where id = %d and uid = %d limit 1",
+ intval($event_id),
+ intval(local_channel())
+ );
+ if(! $x) {
+ notice( t('Event not found.') . EOL);
+ if(intval($_REQUEST['preview'])) {
+ echo( t('Unable to generate preview.'));
+ killme();
+ }
+ return;
+ }
+
+ $acl->set($x[0]);
+
+ $created = $x[0]['created'];
+ $edited = datetime_convert();
+
+ if($x[0]['allow_cid'] === '<' . $channel['channel_hash'] . '>'
+ && $x[0]['allow_gid'] === '' && $x[0]['deny_cid'] === '' && $x[0]['deny_gid'] === '') {
+ $share = false;
+ }
+ else {
+ $share = true;
+ }
+ }
+ else {
+ $created = $edited = datetime_convert();
+ if($share) {
+ $acl->set_from_array($_POST);
+ }
+ else {
+ $acl->set(array('allow_cid' => '<' . $channel['channel_hash'] . '>', 'allow_gid' => '', 'deny_cid' => '', 'deny_gid' => ''));
+ }
+ }
+
+ $post_tags = array();
+ $channel = \App::get_channel();
+ $ac = $acl->get();
+
+ if(strlen($categories)) {
+ $cats = explode(',',$categories);
+ foreach($cats as $cat) {
+ $post_tags[] = array(
+ 'uid' => $profile_uid,
+ 'type' => TERM_CATEGORY,
+ 'otype' => TERM_OBJ_POST,
+ 'term' => trim($cat),
+ 'url' => $channel['xchan_url'] . '?f=&cat=' . urlencode(trim($cat))
+ );
+ }
+ }
+
+ $datarray = array();
+ $datarray['start'] = $start;
+ $datarray['finish'] = $finish;
+ $datarray['summary'] = $summary;
+ $datarray['description'] = $desc;
+ $datarray['location'] = $location;
+ $datarray['type'] = $type;
+ $datarray['adjust'] = $adjust;
+ $datarray['nofinish'] = $nofinish;
+ $datarray['uid'] = local_channel();
+ $datarray['account'] = get_account_id();
+ $datarray['event_xchan'] = $channel['channel_hash'];
+ $datarray['allow_cid'] = $ac['allow_cid'];
+ $datarray['allow_gid'] = $ac['allow_gid'];
+ $datarray['deny_cid'] = $ac['deny_cid'];
+ $datarray['deny_gid'] = $ac['deny_gid'];
+ $datarray['private'] = (($acl->is_private()) ? 1 : 0);
+ $datarray['id'] = $event_id;
+ $datarray['created'] = $created;
+ $datarray['edited'] = $edited;
+
+ if(intval($_REQUEST['preview'])) {
+ $html = format_event_html($datarray);
+ echo $html;
+ killme();
+ }
+
+ $event = event_store_event($datarray);
+
+
+ if($post_tags)
+ $datarray['term'] = $post_tags;
+
+ $item_id = event_store_item($datarray,$event);
+
+ if($item_id) {
+ $r = q("select * from item where id = %d",
+ intval($item_id)
+ );
+ if($r) {
+ xchan_query($r);
+ $sync_item = fetch_post_tags($r);
+ $z = q("select * from event where event_hash = '%s' and uid = %d limit 1",
+ dbesc($r[0]['resource_id']),
+ intval($channel['channel_id'])
+ );
+ if($z) {
+ build_sync_packet($channel['channel_id'],array('event_item' => array(encode_item($sync_item[0],true)),'event' => $z));
+ }
+ }
+ }
+
+ if($share)
+ proc_run('php',"include/notifier.php","event","$item_id");
+
+ }
+
+
+
+ function get() {
+
+ if(argc() > 2 && argv(1) == 'ical') {
+ $event_id = argv(2);
+
+ require_once('include/security.php');
+ $sql_extra = permissions_sql(local_channel());
+
+ $r = q("select * from event where event_hash = '%s' $sql_extra limit 1",
+ dbesc($event_id)
+ );
+ if($r) {
+ header('Content-type: text/calendar');
+ header('content-disposition: attachment; filename="' . t('event') . '-' . $event_id . '.ics"' );
+ echo ical_wrapper($r);
+ killme();
+ }
+ else {
+ notice( t('Event not found.') . EOL );
+ return;
+ }
+ }
+
+ if(! local_channel()) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ nav_set_selected('all_events');
+
+ if((argc() > 2) && (argv(1) === 'ignore') && intval(argv(2))) {
+ $r = q("update event set ignore = 1 where id = %d and uid = %d",
+ intval(argv(2)),
+ intval(local_channel())
+ );
+ }
+
+ if((argc() > 2) && (argv(1) === 'unignore') && intval(argv(2))) {
+ $r = q("update event set ignore = 0 where id = %d and uid = %d",
+ intval(argv(2)),
+ intval(local_channel())
+ );
+ }
+
+ $first_day = get_pconfig(local_channel(),'system','cal_first_day');
+ $first_day = (($first_day) ? $first_day : 0);
+
+ $htpl = get_markup_template('event_head.tpl');
+ \App::$page['htmlhead'] .= replace_macros($htpl,array(
+ '$baseurl' => z_root(),
+ '$module_url' => '/events',
+ '$modparams' => 1,
+ '$lang' => \App::$language,
+ '$first_day' => $first_day
+ ));
+
+ $o = '';
+
+ $channel = \App::get_channel();
+
+ $mode = 'view';
+ $y = 0;
+ $m = 0;
+ $ignored = ((x($_REQUEST,'ignored')) ? " and ignored = " . intval($_REQUEST['ignored']) . " " : '');
+
+
+ // logger('args: ' . print_r(\App::$argv,true));
+
+
+
+ if(argc() > 1) {
+ if(argc() > 2 && argv(1) === 'add') {
+ $mode = 'add';
+ $item_id = intval(argv(2));
+ }
+ if(argc() > 2 && argv(1) === 'drop') {
+ $mode = 'drop';
+ $event_id = argv(2);
+ }
+ if(argc() > 2 && intval(argv(1)) && intval(argv(2))) {
+ $mode = 'view';
+ $y = intval(argv(1));
+ $m = intval(argv(2));
+ }
+ if(argc() <= 2) {
+ $mode = 'view';
+ $event_id = argv(1);
+ }
+ }
+
+ if($mode === 'add') {
+ event_addtocal($item_id,local_channel());
+ killme();
+ }
+
+ if($mode == 'view') {
+
+ /* edit/create form */
+ if($event_id) {
+ $r = q("SELECT * FROM `event` WHERE event_hash = '%s' AND `uid` = %d LIMIT 1",
+ dbesc($event_id),
+ intval(local_channel())
+ );
+ if(count($r))
+ $orig_event = $r[0];
+ }
+
+ $channel = \App::get_channel();
+
+ // Passed parameters overrides anything found in the DB
+ if(!x($orig_event))
+ $orig_event = array();
+
+ // In case of an error the browser is redirected back here, with these parameters filled in with the previous values
+ /*
+ if(x($_REQUEST,'nofinish')) $orig_event['nofinish'] = $_REQUEST['nofinish'];
+ if(x($_REQUEST,'adjust')) $orig_event['adjust'] = $_REQUEST['adjust'];
+ if(x($_REQUEST,'summary')) $orig_event['summary'] = $_REQUEST['summary'];
+ if(x($_REQUEST,'description')) $orig_event['description'] = $_REQUEST['description'];
+ if(x($_REQUEST,'location')) $orig_event['location'] = $_REQUEST['location'];
+ if(x($_REQUEST,'start')) $orig_event['start'] = $_REQUEST['start'];
+ if(x($_REQUEST,'finish')) $orig_event['finish'] = $_REQUEST['finish'];
+ if(x($_REQUEST,'type')) $orig_event['type'] = $_REQUEST['type'];
+ */
+
+ $n_checked = ((x($orig_event) && $orig_event['nofinish']) ? ' checked="checked" ' : '');
+ $a_checked = ((x($orig_event) && $orig_event['adjust']) ? ' checked="checked" ' : '');
+ $t_orig = ((x($orig_event)) ? $orig_event['summary'] : '');
+ $d_orig = ((x($orig_event)) ? $orig_event['description'] : '');
+ $l_orig = ((x($orig_event)) ? $orig_event['location'] : '');
+ $eid = ((x($orig_event)) ? $orig_event['id'] : 0);
+ $event_xchan = ((x($orig_event)) ? $orig_event['event_xchan'] : $channel['channel_hash']);
+ $mid = ((x($orig_event)) ? $orig_event['mid'] : '');
+
+ if(! x($orig_event))
+ $sh_checked = '';
+ else
+ $sh_checked = ((($orig_event['allow_cid'] === '<' . $channel['channel_hash'] . '>' || (! $orig_event['allow_cid'])) && (! $orig_event['allow_gid']) && (! $orig_event['deny_cid']) && (! $orig_event['deny_gid'])) ? '' : ' checked="checked" ' );
+
+ if($orig_event['event_xchan'])
+ $sh_checked .= ' disabled="disabled" ';
+
+ $sdt = ((x($orig_event)) ? $orig_event['start'] : 'now');
+
+ $fdt = ((x($orig_event)) ? $orig_event['finish'] : '+1 hour');
+
+ $tz = date_default_timezone_get();
+ if(x($orig_event))
+ $tz = (($orig_event['adjust']) ? date_default_timezone_get() : 'UTC');
+
+ $syear = datetime_convert('UTC', $tz, $sdt, 'Y');
+ $smonth = datetime_convert('UTC', $tz, $sdt, 'm');
+ $sday = datetime_convert('UTC', $tz, $sdt, 'd');
+ $shour = datetime_convert('UTC', $tz, $sdt, 'H');
+ $sminute = datetime_convert('UTC', $tz, $sdt, 'i');
+
+ $stext = datetime_convert('UTC',$tz,$sdt);
+ $stext = substr($stext,0,14) . "00:00";
+
+ $fyear = datetime_convert('UTC', $tz, $fdt, 'Y');
+ $fmonth = datetime_convert('UTC', $tz, $fdt, 'm');
+ $fday = datetime_convert('UTC', $tz, $fdt, 'd');
+ $fhour = datetime_convert('UTC', $tz, $fdt, 'H');
+ $fminute = datetime_convert('UTC', $tz, $fdt, 'i');
+
+ $ftext = datetime_convert('UTC',$tz,$fdt);
+ $ftext = substr($ftext,0,14) . "00:00";
+
+ $type = ((x($orig_event)) ? $orig_event['type'] : 'event');
+
+ $f = get_config('system','event_input_format');
+ if(! $f)
+ $f = 'ymd';
+
+ $catsenabled = feature_enabled(local_channel(),'categories');
+
+ $category = '';
+
+ if($catsenabled && x($orig_event)){
+ $itm = q("select * from item where resource_type = 'event' and resource_id = '%s' and uid = %d limit 1",
+ dbesc($orig_event['event_hash']),
+ intval(local_channel())
+ );
+ $itm = fetch_post_tags($itm);
+ if($itm) {
+ $cats = get_terms_oftype($itm[0]['term'], TERM_CATEGORY);
+ foreach ($cats as $cat) {
+ if(strlen($category))
+ $category .= ', ';
+ $category .= $cat['term'];
+ }
+ }
+ }
+
+ require_once('include/acl_selectors.php');
+
+ $acl = new \Zotlabs\Access\AccessList($channel);
+ $perm_defaults = $acl->get();
+
+ $tpl = get_markup_template('event_form.tpl');
+
+ $form = replace_macros($tpl,array(
+ '$post' => z_root() . '/events',
+ '$eid' => $eid,
+ '$type' => $type,
+ '$xchan' => $event_xchan,
+ '$mid' => $mid,
+ '$event_hash' => $event_id,
+ '$summary' => array('summary', (($event_id) ? t('Edit event title') : t('Event title')), $t_orig, t('Required'), '*'),
+ '$catsenabled' => $catsenabled,
+ '$placeholdercategory' => t('Categories (comma-separated list)'),
+ '$c_text' => (($event_id) ? t('Edit Category') : t('Category')),
+ '$category' => $category,
+ '$required' => '<span class="required" title="' . t('Required') . '">*</span>',
+ '$s_dsel' => datetimesel($f,new \DateTime(),\DateTime::createFromFormat('Y',$syear+5),\DateTime::createFromFormat('Y-m-d H:i',"$syear-$smonth-$sday $shour:$sminute"), (($event_id) ? t('Edit start date and time') : t('Start date and time')), 'start_text',true,true,'','',true,$first_day),
+ '$n_text' => t('Finish date and time are not known or not relevant'),
+ '$n_checked' => $n_checked,
+ '$f_dsel' => datetimesel($f,new \DateTime(),\DateTime::createFromFormat('Y',$fyear+5),\DateTime::createFromFormat('Y-m-d H:i',"$fyear-$fmonth-$fday $fhour:$fminute"), (($event_id) ? t('Edit finish date and time') : t('Finish date and time')),'finish_text',true,true,'start_text','',false,$first_day),
+ '$nofinish' => array('nofinish', t('Finish date and time are not known or not relevant'), $n_checked, '', array(t('No'),t('Yes')), 'onclick="enableDisableFinishDate();"'),
+ '$adjust' => array('adjust', t('Adjust for viewer timezone'), $a_checked, t('Important for events that happen in a particular place. Not practical for global holidays.'), array(t('No'),t('Yes'))),
+ '$a_text' => t('Adjust for viewer timezone'),
+ '$d_text' => (($event_id) ? t('Edit Description') : t('Description')),
+ '$d_orig' => $d_orig,
+ '$l_text' => (($event_id) ? t('Edit Location') : t('Location')),
+ '$l_orig' => $l_orig,
+ '$t_orig' => $t_orig,
+ '$sh_text' => t('Share this event'),
+ '$sh_checked' => $sh_checked,
+ '$share' => array('share', t('Share this event'), $sh_checked, '', array(t('No'),t('Yes'))),
+ '$preview' => t('Preview'),
+ '$permissions' => t('Permission settings'),
+ '$acl' => (($orig_event['event_xchan']) ? '' : populate_acl(((x($orig_event)) ? $orig_event : $perm_defaults),false)),
+ '$submit' => t('Submit'),
+ '$advanced' => t('Advanced Options')
+
+ ));
+ /* end edit/create form */
+
+ $thisyear = datetime_convert('UTC',date_default_timezone_get(),'now','Y');
+ $thismonth = datetime_convert('UTC',date_default_timezone_get(),'now','m');
+ if(! $y)
+ $y = intval($thisyear);
+ if(! $m)
+ $m = intval($thismonth);
+
+ $export = false;
+ if(argc() === 4 && argv(3) === 'export')
+ $export = true;
+
+ // Put some limits on dates. The PHP date functions don't seem to do so well before 1900.
+ // An upper limit was chosen to keep search engines from exploring links millions of years in the future.
+
+ if($y < 1901)
+ $y = 1900;
+ if($y > 2099)
+ $y = 2100;
+
+ $nextyear = $y;
+ $nextmonth = $m + 1;
+ if($nextmonth > 12) {
+ $nextmonth = 1;
+ $nextyear ++;
+ }
+
+ $prevyear = $y;
+ if($m > 1)
+ $prevmonth = $m - 1;
+ else {
+ $prevmonth = 12;
+ $prevyear --;
+ }
+
+ $dim = get_dim($y,$m);
+ $start = sprintf('%d-%d-%d %d:%d:%d',$y,$m,1,0,0,0);
+ $finish = sprintf('%d-%d-%d %d:%d:%d',$y,$m,$dim,23,59,59);
+
+
+ if (argv(1) === 'json'){
+ if (x($_GET,'start')) $start = $_GET['start'];
+ if (x($_GET,'end')) $finish = $_GET['end'];
+ }
+
+ $start = datetime_convert('UTC','UTC',$start);
+ $finish = datetime_convert('UTC','UTC',$finish);
+
+ $adjust_start = datetime_convert('UTC', date_default_timezone_get(), $start);
+ $adjust_finish = datetime_convert('UTC', date_default_timezone_get(), $finish);
+
+ if (x($_GET,'id')){
+ $r = q("SELECT event.*, item.plink, item.item_flags, item.author_xchan, item.owner_xchan
+ from event left join item on resource_id = event_hash where resource_type = 'event' and event.uid = %d and event.id = %d limit 1",
+ intval(local_channel()),
+ intval($_GET['id'])
+ );
+ } elseif($export) {
+ $r = q("SELECT * from event where uid = %d
+ AND (( `adjust` = 0 AND ( `finish` >= '%s' or nofinish = 1 ) AND `start` <= '%s' )
+ OR ( `adjust` = 1 AND ( `finish` >= '%s' or nofinish = 1 ) AND `start` <= '%s' )) ",
+ intval(local_channel()),
+ dbesc($start),
+ dbesc($finish),
+ dbesc($adjust_start),
+ dbesc($adjust_finish)
+ );
+ }
+ else {
+ // fixed an issue with "nofinish" events not showing up in the calendar.
+ // There's still an issue if the finish date crosses the end of month.
+ // Noting this for now - it will need to be fixed here and in Friendica.
+ // Ultimately the finish date shouldn't be involved in the query.
+
+ $r = q("SELECT event.*, item.plink, item.item_flags, item.author_xchan, item.owner_xchan
+ from event left join item on event_hash = resource_id
+ where resource_type = 'event' and event.uid = %d $ignored
+ AND (( adjust = 0 AND ( finish >= '%s' or nofinish = 1 ) AND start <= '%s' )
+ OR ( adjust = 1 AND ( finish >= '%s' or nofinish = 1 ) AND start <= '%s' )) ",
+ intval(local_channel()),
+ dbesc($start),
+ dbesc($finish),
+ dbesc($adjust_start),
+ dbesc($adjust_finish)
+ );
+
+ }
+
+ $links = array();
+
+ if($r && ! $export) {
+ xchan_query($r);
+ $r = fetch_post_tags($r,true);
+
+ $r = sort_by_date($r);
+ }
+
+ if($r) {
+ foreach($r as $rr) {
+ $j = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['start'], 'j') : datetime_convert('UTC','UTC',$rr['start'],'j'));
+ if(! x($links,$j))
+ $links[$j] = z_root() . '/' . \App::$cmd . '#link-' . $j;
+ }
+ }
+
+ $events=array();
+
+ $last_date = '';
+ $fmt = t('l, F j');
+
+ if($r) {
+
+ foreach($r as $rr) {
+
+ $j = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['start'], 'j') : datetime_convert('UTC','UTC',$rr['start'],'j'));
+ $d = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['start'], $fmt) : datetime_convert('UTC','UTC',$rr['start'],$fmt));
+ $d = day_translate($d);
+
+ $start = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['start'], 'c') : datetime_convert('UTC','UTC',$rr['start'],'c'));
+ if ($rr['nofinish']){
+ $end = null;
+ } else {
+ $end = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['finish'], 'c') : datetime_convert('UTC','UTC',$rr['finish'],'c'));
+ }
+
+
+ $is_first = ($d !== $last_date);
+
+ $last_date = $d;
+
+ $edit = ((local_channel() && $rr['author_xchan'] == get_observer_hash()) ? array(z_root().'/events/'.$rr['event_hash'].'?expandform=1',t('Edit event'),'','') : false);
+
+ $drop = array(z_root().'/events/drop/'.$rr['event_hash'],t('Delete event'),'','');
+
+ $title = strip_tags(html_entity_decode(bbcode($rr['summary']),ENT_QUOTES,'UTF-8'));
+ if(! $title) {
+ list($title, $_trash) = explode("<br",bbcode($rr['desc']),2);
+ $title = strip_tags(html_entity_decode($title,ENT_QUOTES,'UTF-8'));
+ }
+ $html = format_event_html($rr);
+ $rr['desc'] = bbcode($rr['desc']);
+ $rr['location'] = bbcode($rr['location']);
+ $events[] = array(
+ 'id'=>$rr['id'],
+ 'hash' => $rr['event_hash'],
+ 'start'=> $start,
+ 'end' => $end,
+ 'drop' => $drop,
+ 'allDay' => false,
+ 'title' => $title,
+
+ 'j' => $j,
+ 'd' => $d,
+ 'edit' => $edit,
+ 'is_first'=>$is_first,
+ 'item'=>$rr,
+ 'html'=>$html,
+ 'plink' => array($rr['plink'],t('Link to Source'),'',''),
+ );
+
+
+ }
+ }
+
+ if($export) {
+ header('Content-type: text/calendar');
+ header('content-disposition: attachment; filename="' . t('calendar') . '-' . $channel['channel_address'] . '.ics"' );
+ echo ical_wrapper($r);
+ killme();
+ }
+
+ if (\App::$argv[1] === 'json'){
+ echo json_encode($events); killme();
+ }
+
+ // links: array('href', 'text', 'extra css classes', 'title')
+ if (x($_GET,'id')){
+ $tpl = get_markup_template("event.tpl");
+ }
+ else {
+ $tpl = get_markup_template("events-js.tpl");
+ }
+
+ $o = replace_macros($tpl, array(
+ '$baseurl' => z_root(),
+ '$new_event' => array(z_root().'/events',(($event_id) ? t('Edit Event') : t('Create Event')),'',''),
+ '$previus' => array(z_root()."/events/$prevyear/$prevmonth",t('Previous'),'',''),
+ '$next' => array(z_root()."/events/$nextyear/$nextmonth",t('Next'),'',''),
+ '$export' => array(z_root()."/events/$y/$m/export",t('Export'),'',''),
+ '$calendar' => cal($y,$m,$links, ' eventcal'),
+ '$events' => $events,
+ '$upload' => t('Import'),
+ '$submit' => t('Submit'),
+ '$prev' => t('Previous'),
+ '$next' => t('Next'),
+ '$today' => t('Today'),
+ '$form' => $form,
+ '$expandform' => ((x($_GET,'expandform')) ? true : false),
+ ));
+
+ if (x($_GET,'id')){ echo $o; killme(); }
+
+ return $o;
+ }
+
+ if($mode === 'drop' && $event_id) {
+ $r = q("SELECT * FROM `event` WHERE event_hash = '%s' AND `uid` = %d LIMIT 1",
+ dbesc($event_id),
+ intval(local_channel())
+ );
+
+ $sync_event = $r[0];
+
+ if($r) {
+ $r = q("delete from event where event_hash = '%s' and uid = %d limit 1",
+ dbesc($event_id),
+ intval(local_channel())
+ );
+ if($r) {
+ $r = q("update item set resource_type = '', resource_id = '' where resource_type = 'event' and resource_id = '%s' and uid = %d",
+ dbesc($event_id),
+ intval(local_channel())
+ );
+ $sync_event['event_deleted'] = 1;
+ build_sync_packet(0,array('event' => array($sync_event)));
+
+ info( t('Event removed') . EOL);
+ }
+ else {
+ notice( t('Failed to remove event' ) . EOL);
+ }
+ goaway(z_root() . '/events');
+ }
+ }
+
+ }
+
+}
diff --git a/Zotlabs/Module/Fbrowser.php b/Zotlabs/Module/Fbrowser.php
new file mode 100644
index 000000000..eef3cb67d
--- /dev/null
+++ b/Zotlabs/Module/Fbrowser.php
@@ -0,0 +1,136 @@
+<?php
+namespace Zotlabs\Module;
+/**
+ * @package Friendica\modules
+ * @subpackage FileBrowser
+ * @author Fabio Comuni <fabrixxm@kirgroup.com>
+ */
+
+require_once('include/photo/photo_driver.php');
+
+/**
+ * @param App $a
+ */
+
+class Fbrowser extends \Zotlabs\Web\Controller {
+
+ function get(){
+
+ if (!local_channel())
+ killme();
+
+ if (\App::$argc==1)
+ killme();
+
+ //echo "<pre>"; var_dump(\App::$argv); killme();
+
+ switch(\App::$argv[1]){
+ case "image":
+ $path = array( array(z_root()."/fbrowser/image/", t("Photos")));
+ $albums = false;
+ $sql_extra = "";
+ $sql_extra2 = " ORDER BY created DESC LIMIT 0, 10";
+
+ if (\App::$argc==2){
+ $albums = q("SELECT distinct(`album`) AS `album` FROM `photo` WHERE `uid` = %d ",
+ intval(local_channel())
+ );
+ // anon functions only from 5.3.0... meglio tardi che mai..
+ $albums = array_map( "self::folder1" , $albums);
+
+ }
+
+ $album = "";
+ if (\App::$argc==3){
+ $album = hex2bin(\App::$argv[2]);
+ $sql_extra = sprintf("AND `album` = '%s' ",dbesc($album));
+ $sql_extra2 = "";
+ $path[]=array(z_root()."/fbrowser/image/".\App::$argv[2]."/", $album);
+ }
+
+ $r = q("SELECT `resource_id`, `id`, `filename`, type, min(`scale`) AS `hiq`,max(`scale`) AS `loq`, `description`
+ FROM `photo` WHERE `uid` = %d $sql_extra
+ GROUP BY `resource_id` $sql_extra2",
+ intval(local_channel())
+ );
+
+ $files = array_map("self::files1", $r);
+
+ $tpl = get_markup_template("filebrowser.tpl");
+ echo replace_macros($tpl, array(
+ '$type' => 'image',
+ '$baseurl' => z_root(),
+ '$path' => $path,
+ '$folders' => $albums,
+ '$files' =>$files,
+ '$cancel' => t('Cancel'),
+ ));
+
+
+ break;
+ case "file":
+ if (\App::$argc==2){
+ $files = q("SELECT id, filename, filetype FROM `attach` WHERE `uid` = %d ",
+ intval(local_channel())
+ );
+
+ $files = array_map("self::files2", $files);
+ //echo "<pre>"; var_dump($files); killme();
+
+
+ $tpl = get_markup_template("filebrowser.tpl");
+ echo replace_macros($tpl, array(
+ '$type' => 'file',
+ '$baseurl' => z_root(),
+ '$path' => array( array(z_root()."/fbrowser/image/", t("Files")) ),
+ '$folders' => false,
+ '$files' =>$files,
+ '$cancel' => t('Cancel'),
+ ));
+
+ }
+
+ break;
+ }
+
+
+ killme();
+
+ }
+
+ private static function folder1($el){
+ return array(bin2hex($el['album']),$el['album']);
+ }
+
+
+ private static function files1($rr){
+
+ $ph = photo_factory('');
+ $types = $ph->supportedTypes();
+ $ext = $types[$rr['type']];
+
+ $filename_e = $rr['filename'];
+
+ return array(
+ z_root() . '/photo/' . $rr['resource_id'] . '-' . $rr['hiq'] . '.' .$ext,
+ $filename_e,
+ z_root() . '/photo/' . $rr['resource_id'] . '-' . $rr['loq'] . '.'. $ext
+ );
+ }
+
+ private static function files2($rr){
+ list($m1,$m2) = explode("/",$rr['filetype']);
+ $filetype = ( (file_exists("images/icons/$m1.png"))?$m1:"zip");
+
+ if(\App::get_template_engine() === 'internal') {
+ $filename_e = template_escape($rr['filename']);
+ }
+ else {
+ $filename_e = $rr['filename'];
+ }
+
+ return array( z_root() . '/attach/' . $rr['id'], $filename_e, z_root() . '/images/icons/16/' . $filetype . '.png');
+ }
+
+
+}
diff --git a/Zotlabs/Module/Feed.php b/Zotlabs/Module/Feed.php
new file mode 100644
index 000000000..9d33ba2c3
--- /dev/null
+++ b/Zotlabs/Module/Feed.php
@@ -0,0 +1,48 @@
+<?php
+namespace Zotlabs\Module;
+
+
+require_once('include/items.php');
+
+
+class Feed extends \Zotlabs\Web\Controller {
+
+ function init() {
+
+ $params = array();
+
+ $params['begin'] = ((x($_REQUEST,'date_begin')) ? $_REQUEST['date_begin'] : NULL_DATE);
+ $params['end'] = ((x($_REQUEST,'date_end')) ? $_REQUEST['date_end'] : '');
+ $params['type'] = ((stristr(argv(0),'json')) ? 'json' : 'xml');
+ $params['pages'] = ((x($_REQUEST,'pages')) ? intval($_REQUEST['pages']) : 0);
+ $params['top'] = ((x($_REQUEST,'top')) ? intval($_REQUEST['top']) : 0);
+ $params['start'] = ((x($params,'start')) ? intval($params['start']) : 0);
+ $params['records'] = ((x($params,'records')) ? intval($params['records']) : 40);
+ $params['direction'] = ((x($params,'direction')) ? dbesc($params['direction']) : 'desc');
+ $params['cat'] = ((x($_REQUEST,'cat')) ? escape_tags($_REQUEST['cat']) : '');
+
+ $channel = '';
+ if(argc() > 1) {
+ $r = q("select * from channel left join xchan on channel_hash = xchan_hash where channel_address = '%s' limit 1",
+ dbesc(argv(1))
+ );
+ if(!($r && count($r)))
+ killme();
+
+ $channel = $r[0];
+
+ if((intval(get_config('system','block_public'))) && (! get_account_id()))
+ killme();
+
+ logger('mod_feed: public feed request from ' . $_SERVER['REMOTE_ADDR'] . ' for ' . $channel['channel_address']);
+
+ echo get_public_feed($channel,$params);
+
+ killme();
+ }
+
+ }
+
+
+
+}
diff --git a/Zotlabs/Module/Ffsapi.php b/Zotlabs/Module/Ffsapi.php
new file mode 100644
index 000000000..f3ade73c2
--- /dev/null
+++ b/Zotlabs/Module/Ffsapi.php
@@ -0,0 +1,71 @@
+<?php
+namespace Zotlabs\Module;
+
+
+
+class Ffsapi extends \Zotlabs\Web\Controller {
+
+ function get() {
+
+ $baseurl = z_root();
+ $name = get_config('system','sitename');
+ $description = t('Share content from Firefox to $Projectname');
+ $author = 'Mike Macgirvin';
+ $homepage = 'http://hubzilla.org';
+ $activate = t('Activate the Firefox $Projectname provider');
+
+ $s = <<< EOT
+
+ <script>
+
+ var baseurl = '$baseurl';
+
+ var data = {
+ "origin": baseurl,
+ // currently required
+ "name": '$name',
+ "iconURL": baseurl+"/images/hz-16.png",
+ "icon32URL": baseurl+"/images/hz-32.png",
+ "icon64URL": baseurl+"/images/hz-64.png",
+
+ // at least one of these must be defined
+ // "workerURL": baseurl+"/worker.js",
+ // "sidebarURL": baseurl+"/sidebar.htm",
+ "shareURL": baseurl+"/rpost?f=&url=%{url}",
+
+ // status buttons are scheduled for Firefox 26 or 27
+ //"statusURL": baseurl+"/statusPanel.html",
+
+ // social bookmarks are available in Firefox 26
+ "markURL": baseurl+"/rbmark?f=&url=%{url}&title=%{title}",
+ // icons should be 32x32 pixels
+ // "markedIcon": baseurl+"/images/checkbox-checked-32.png",
+ // "unmarkedIcon": baseurl+"/images/checkbox-unchecked-32.png",
+ "unmarkedIcon": baseurl+"/images/hz-bookmark-32.png",
+
+ // should be available for display purposes
+ "description": "$description",
+ "author": "$author",
+ "homepageURL": "$homepage",
+
+ // optional
+ "version": "1.0"
+ }
+
+ function activate(node) {
+ var event = new CustomEvent("ActivateSocialFeature");
+ var jdata = JSON.stringify(data);
+ node.setAttribute("data-service", JSON.stringify(data));
+ node.dispatchEvent(event);
+ }
+ </script>
+
+ <button onclick="activate(this)" title="$activate" class="btn btn-primary">$activate</button>
+
+EOT;
+
+ return $s;
+
+ }
+
+}
diff --git a/Zotlabs/Module/Fhublocs.php b/Zotlabs/Module/Fhublocs.php
new file mode 100644
index 000000000..f5b439421
--- /dev/null
+++ b/Zotlabs/Module/Fhublocs.php
@@ -0,0 +1,85 @@
+<?php
+namespace Zotlabs\Module;
+
+require_once('include/zot.php');
+require_once('include/crypto.php');
+
+/* fix missing or damaged hublocs */
+
+
+class Fhublocs extends \Zotlabs\Web\Controller {
+
+ function get() {
+
+ if(! is_site_admin())
+ return;
+
+ $o = '';
+
+ $r = q("select * from channel where channel_removed = 0");
+ $sitekey = get_config('system','pubkey');
+
+ if($r) {
+ foreach($r as $rr) {
+ $found = false;
+ $primary_address = '';
+ $x = zot_get_hublocs($rr['channel_hash']);
+ if($x) {
+ foreach($x as $xx) {
+ if($xx['hubloc_url'] === z_root() && $xx['hubloc_sitekey'] === $sitekey) {
+ $found = true;
+ break;
+ }
+ }
+ if($found) {
+ $o .= 'Hubloc exists for ' . $rr['channel_name'] . EOL;
+ continue;
+ }
+ }
+ $y = q("select xchan_addr from xchan where xchan_hash = '%s' limit 1",
+ dbesc($rr['channel_hash'])
+ );
+ if($y)
+ $primary_address = $y[0]['xchan_addr'];
+
+ $hub_address = $rr['channel']['channel_address'] . '@' . \App::get_hostname();
+
+
+ $primary = (($hub_address === $primary_address) ? 1 : 0);
+ if(! $y)
+ $primary = 1;
+
+ $m = q("delete from hubloc where hubloc_hash = '%s' and hubloc_url = '%s' ",
+ dbesc($rr['channel_hash']),
+ dbesc(z_root())
+ );
+
+ // Create a verified hub location pointing to this site.
+
+ $h = q("insert into hubloc ( hubloc_guid, hubloc_guid_sig, hubloc_hash, hubloc_addr, hubloc_primary, hubloc_url, hubloc_url_sig, hubloc_host, hubloc_callback, hubloc_sitekey, hubloc_network )
+ values ( '%s', '%s', '%s', '%s', %d, '%s', '%s', '%s', '%s', '%s', '%s' )",
+ dbesc($rr['channel_guid']),
+ dbesc($rr['channel_guid_sig']),
+ dbesc($rr['channel_hash']),
+ dbesc($rr['channel_address'] . '@' . \App::get_hostname()),
+ intval($primary),
+ dbesc(z_root()),
+ dbesc(base64url_encode(rsa_sign(z_root(),$rr['channel_prvkey']))),
+ dbesc(\App::get_hostname()),
+ dbesc(z_root() . '/post'),
+ dbesc($sitekey),
+ dbesc('zot')
+ );
+
+ if($h)
+ $o . 'local hubloc created for ' . $rr['channel_name'] . EOL;
+ else
+ $o .= 'DB update failed for ' . $rr['channel_name'] . EOL;
+
+ }
+
+ return $o;
+
+ }
+ }
+}
diff --git a/Zotlabs/Module/Filer.php b/Zotlabs/Module/Filer.php
new file mode 100644
index 000000000..607d088db
--- /dev/null
+++ b/Zotlabs/Module/Filer.php
@@ -0,0 +1,61 @@
+<?php
+namespace Zotlabs\Module;
+
+require_once('include/security.php');
+require_once('include/bbcode.php');
+require_once('include/items.php');
+
+
+
+class Filer extends \Zotlabs\Web\Controller {
+
+ function get() {
+
+ if(! local_channel()) {
+ killme();
+ }
+
+ $term = unxmlify(trim($_GET['term']));
+ $item_id = ((\App::$argc > 1) ? intval(\App::$argv[1]) : 0);
+
+ logger('filer: tag ' . $term . ' item ' . $item_id);
+
+ if($item_id && strlen($term)){
+ // file item
+ store_item_tag(local_channel(),$item_id,TERM_OBJ_POST,TERM_FILE,$term,'');
+
+ // protect the entire conversation from periodic expiration
+
+ $r = q("select parent from item where id = %d and uid = %d limit 1",
+ intval($item_id),
+ intval(local_channel())
+ );
+ if($r) {
+ $x = q("update item set item_retained = 1 where id = %d and uid = %d",
+ intval($r[0]['parent']),
+ intval(local_channel())
+ );
+ }
+ }
+ else {
+ $filetags = array();
+ $r = q("select distinct(term) from term where uid = %d and type = %d order by term asc",
+ intval(local_channel()),
+ intval(TERM_FILE)
+ );
+ if(count($r)) {
+ foreach($r as $rr)
+ $filetags[] = $rr['term'];
+ }
+ $tpl = get_markup_template("filer_dialog.tpl");
+ $o = replace_macros($tpl, array(
+ '$field' => array('term', t("Save to Folder:"), '', '', $filetags, t('- select -')),
+ '$submit' => t('Save'),
+ ));
+
+ echo $o;
+ }
+ killme();
+ }
+
+}
diff --git a/Zotlabs/Module/Filerm.php b/Zotlabs/Module/Filerm.php
new file mode 100644
index 000000000..eb9a42c1e
--- /dev/null
+++ b/Zotlabs/Module/Filerm.php
@@ -0,0 +1,39 @@
+<?php
+namespace Zotlabs\Module;
+
+
+class Filerm extends \Zotlabs\Web\Controller {
+
+ function get() {
+
+ if(! local_channel()) {
+ killme();
+ }
+
+ $term = trim($_GET['term']);
+ $cat = trim($_GET['cat']);
+
+ $category = (($cat) ? true : false);
+ if($category)
+ $term = $cat;
+
+ $item_id = ((\App::$argc > 1) ? intval(\App::$argv[1]) : 0);
+
+ logger('filerm: tag ' . $term . ' item ' . $item_id);
+
+ if($item_id && strlen($term)) {
+ $r = q("delete from term where uid = %d and type = %d and oid = %d and term = '%s'",
+ intval(local_channel()),
+ intval(($category) ? TERM_CATEGORY : TERM_FILE),
+ intval($item_id),
+ dbesc($term)
+ );
+ }
+
+ if(x($_SESSION,'return_url'))
+ goaway(z_root() . '/' . $_SESSION['return_url']);
+
+ killme();
+ }
+
+}
diff --git a/Zotlabs/Module/Filestorage.php b/Zotlabs/Module/Filestorage.php
new file mode 100644
index 000000000..934a1e6a4
--- /dev/null
+++ b/Zotlabs/Module/Filestorage.php
@@ -0,0 +1,173 @@
+<?php
+namespace Zotlabs\Module;
+/**
+ * @file mod/filestorage.php
+ *
+ */
+
+require_once('include/attach.php');
+
+/**
+ *
+ * @param object &$a
+ */
+
+class Filestorage extends \Zotlabs\Web\Controller {
+
+ function post() {
+
+ $channel_id = ((x($_POST, 'uid')) ? intval($_POST['uid']) : 0);
+
+ if((! $channel_id) || (! local_channel()) || ($channel_id != local_channel())) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ $recurse = ((x($_POST, 'recurse')) ? intval($_POST['recurse']) : 0);
+ $resource = ((x($_POST, 'filehash')) ? notags($_POST['filehash']) : '');
+ $notify = ((x($_POST, 'notify')) ? intval($_POST['notify']) : 0);
+
+ if(! $resource) {
+ notice(t('Item not found.') . EOL);
+ return;
+ }
+
+ $channel = \App::get_channel();
+
+ $acl = new \Zotlabs\Access\AccessList($channel);
+ $acl->set_from_array($_REQUEST);
+ $x = $acl->get();
+
+ $cloudPath = get_parent_cloudpath($channel_id, $channel['channel_address'], $resource);
+
+ //get the object before permissions change so we can catch eventual former allowed members
+ $object = get_file_activity_object($channel_id, $resource, $cloudPath);
+
+ attach_change_permissions($channel_id, $resource, $x['allow_cid'], $x['allow_gid'], $x['deny_cid'], $x['deny_gid'], $recurse);
+
+ file_activity($channel_id, $object, $x['allow_cid'], $x['allow_gid'], $x['deny_cid'], $x['deny_gid'], 'post', $notify);
+
+ goaway($cloudPath);
+ }
+
+ function get() {
+
+ if(argc() > 1)
+ $which = argv(1);
+ else {
+ notice( t('Requested profile is not available.') . EOL );
+ \App::$error = 404;
+ return;
+ }
+
+ $r = q("select * from channel where channel_address = '%s'",
+ dbesc($which)
+ );
+ if($r) {
+ $channel = $r[0];
+ $owner = intval($r[0]['channel_id']);
+ }
+
+ $observer = \App::get_observer();
+ $ob_hash = (($observer) ? $observer['xchan_hash'] : '');
+
+ $perms = get_all_perms($owner, $ob_hash);
+
+ if(! $perms['view_storage']) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ // Since we have ACL'd files in the wild, but don't have ACL here yet, we
+ // need to return for anyone other than the owner, despite the perms check for now.
+
+ $is_owner = (((local_channel()) && ($owner == local_channel())) ? true : false);
+ if(! $is_owner) {
+ info( t('Permission Denied.') . EOL );
+ return;
+ }
+
+ if(argc() > 3 && argv(3) === 'delete') {
+ if(! $perms['write_storage']) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ $file = intval(argv(2));
+ $r = q("SELECT hash FROM attach WHERE id = %d AND uid = %d LIMIT 1",
+ dbesc($file),
+ intval($owner)
+ );
+ if(! $r) {
+ notice( t('File not found.') . EOL);
+ goaway(z_root() . '/cloud/' . $which);
+ }
+
+ $f = $r[0];
+ $channel = \App::get_channel();
+
+ $parentpath = get_parent_cloudpath($channel['channel_id'], $channel['channel_address'], $f['hash']);
+
+ attach_delete($owner, $f['hash']);
+
+ goaway($parentpath);
+ }
+
+ if(argc() > 3 && argv(3) === 'edit') {
+ require_once('include/acl_selectors.php');
+ if(! $perms['write_storage']) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+ $file = intval(argv(2));
+
+ $r = q("select id, uid, folder, filename, revision, flags, is_dir, os_storage, hash, allow_cid, allow_gid, deny_cid, deny_gid from attach where id = %d and uid = %d limit 1",
+ intval($file),
+ intval($owner)
+ );
+
+ $f = $r[0];
+ $channel = \App::get_channel();
+
+ $cloudpath = get_cloudpath($f) . (intval($f['is_dir']) ? '?f=&davguest=1' : '');
+ $parentpath = get_parent_cloudpath($channel['channel_id'], $channel['channel_address'], $f['hash']);
+
+ $aclselect_e = populate_acl($f, false);
+ $is_a_dir = (intval($f['is_dir']) ? true : false);
+
+ $lockstate = (($f['allow_cid'] || $f['allow_gid'] || $f['deny_cid'] || $f['deny_gid']) ? 'lock' : 'unlock');
+
+ // Encode path that is used for link so it's a valid URL
+ // Keep slashes as slashes, otherwise mod_rewrite doesn't work correctly
+ $encoded_path = str_replace('%2F', '/', rawurlencode($cloudpath));
+
+ $o = replace_macros(get_markup_template('attach_edit.tpl'), array(
+ '$header' => t('Edit file permissions'),
+ '$file' => $f,
+ '$cloudpath' => z_root() . '/' . $encoded_path,
+ '$parentpath' => $parentpath,
+ '$uid' => $channel['channel_id'],
+ '$channelnick' => $channel['channel_address'],
+ '$permissions' => t('Permissions'),
+ '$aclselect' => $aclselect_e,
+ '$lockstate' => $lockstate,
+ '$permset' => t('Set/edit permissions'),
+ '$recurse' => array('recurse', t('Include all files and sub folders'), 0, '', array(t('No'), t('Yes'))),
+ '$backlink' => t('Return to file list'),
+ '$isadir' => $is_a_dir,
+ '$cpdesc' => t('Copy/paste this code to attach file to a post'),
+ '$cpldesc' => t('Copy/paste this URL to link file from a web page'),
+ '$submit' => t('Submit'),
+ '$attach_btn_title' => t('Share this file'),
+ '$link_btn_title' => t('Show URL to this file'),
+ '$notify' => array('notify', t('Notify your contacts about this file'), 0, '', array(t('No'), t('Yes')))
+ ));
+
+ echo $o;
+ killme();
+ }
+
+ goaway(z_root() . '/cloud/' . $which);
+ }
+
+}
diff --git a/Zotlabs/Module/Follow.php b/Zotlabs/Module/Follow.php
new file mode 100644
index 000000000..d3114557b
--- /dev/null
+++ b/Zotlabs/Module/Follow.php
@@ -0,0 +1,65 @@
+<?php
+namespace Zotlabs\Module;
+
+
+require_once('include/follow.php');
+
+
+class Follow extends \Zotlabs\Web\Controller {
+
+ function init() {
+
+ if(! local_channel()) {
+ return;
+ }
+
+ $uid = local_channel();
+ $url = notags(trim($_REQUEST['url']));
+ $return_url = $_SESSION['return_url'];
+ $confirm = intval($_REQUEST['confirm']);
+
+ $channel = \App::get_channel();
+
+ $result = new_contact($uid,$url,$channel,true,$confirm);
+
+ if($result['success'] == false) {
+ if($result['message'])
+ notice($result['message']);
+ goaway($return_url);
+ }
+
+ info( t('Channel added.') . EOL);
+
+ $clone = array();
+ foreach($result['abook'] as $k => $v) {
+ if(strpos($k,'abook_') === 0) {
+ $clone[$k] = $v;
+ }
+ }
+ unset($clone['abook_id']);
+ unset($clone['abook_account']);
+ unset($clone['abook_channel']);
+
+ $abconfig = load_abconfig($channel['channel_hash'],$clone['abook_xchan']);
+ if($abconfig)
+ $clone['abconfig'] = $abconfig;
+
+ build_sync_packet(0 /* use the current local_channel */, array('abook' => array($clone)));
+
+
+ // If we can view their stream, pull in some posts
+
+ if(($result['abook']['abook_their_perms'] & PERMS_R_STREAM) || ($result['abook']['xchan_network'] === 'rss'))
+ proc_run('php','include/onepoll.php',$result['abook']['abook_id']);
+
+ goaway(z_root() . '/connedit/' . $result['abook']['abook_id'] . '?f=&follow=1');
+
+ }
+
+ function get() {
+
+ if(! local_channel()) {
+ return login();
+ }
+ }
+}
diff --git a/Zotlabs/Module/Fsuggest.php b/Zotlabs/Module/Fsuggest.php
new file mode 100644
index 000000000..143fd34e1
--- /dev/null
+++ b/Zotlabs/Module/Fsuggest.php
@@ -0,0 +1,117 @@
+<?php
+namespace Zotlabs\Module;
+
+
+
+class Fsuggest extends \Zotlabs\Web\Controller {
+
+ function post() {
+
+ if(! local_channel()) {
+ return;
+ }
+
+ if(\App::$argc != 2)
+ return;
+
+ $contact_id = intval(\App::$argv[1]);
+
+ $r = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
+ intval($contact_id),
+ intval(local_channel())
+ );
+ if(! count($r)) {
+ notice( t('Contact not found.') . EOL);
+ return;
+ }
+ $contact = $r[0];
+
+ $new_contact = intval($_POST['suggest']);
+
+ $hash = random_string();
+
+ $note = escape_tags(trim($_POST['note']));
+
+ if($new_contact) {
+ $r = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
+ intval($new_contact),
+ intval(local_channel())
+ );
+ if(count($r)) {
+
+ $x = q("INSERT INTO `fsuggest` ( `uid`,`cid`,`name`,`url`,`request`,`photo`,`note`,`created`)
+ VALUES ( %d, %d, '%s','%s','%s','%s','%s','%s')",
+ intval(local_channel()),
+ intval($contact_id),
+ dbesc($r[0]['name']),
+ dbesc($r[0]['url']),
+ dbesc($r[0]['request']),
+ dbesc($r[0]['photo']),
+ dbesc($hash),
+ dbesc(datetime_convert())
+ );
+ $r = q("SELECT `id` FROM `fsuggest` WHERE `note` = '%s' AND `uid` = %d LIMIT 1",
+ dbesc($hash),
+ intval(local_channel())
+ );
+ if(count($r)) {
+ $fsuggest_id = $r[0]['id'];
+ q("UPDATE `fsuggest` SET `note` = '%s' WHERE `id` = %d AND `uid` = %d",
+ dbesc($note),
+ intval($fsuggest_id),
+ intval(local_channel())
+ );
+ proc_run('php', 'include/notifier.php', 'suggest' , $fsuggest_id);
+ }
+
+ info( t('Friend suggestion sent.') . EOL);
+ }
+
+ }
+
+
+ }
+
+
+
+ function get() {
+
+ require_once('include/acl_selectors.php');
+
+ if(! local_channel()) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ if(\App::$argc != 2)
+ return;
+
+ $contact_id = intval(\App::$argv[1]);
+
+ $r = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
+ intval($contact_id),
+ intval(local_channel())
+ );
+ if(! count($r)) {
+ notice( t('Contact not found.') . EOL);
+ return;
+ }
+ $contact = $r[0];
+
+ $o = '<h3>' . t('Suggest Friends') . '</h3>';
+
+ $o .= '<div id="fsuggest-desc" >' . sprintf( t('Suggest a friend for %s'), $contact['name']) . '</div>';
+
+ $o .= '<form id="fsuggest-form" action="fsuggest/' . $contact_id . '" method="post" >';
+
+ // FIXME contact_selector deprecated, removed
+ // $o .= contact_selector('suggest','suggest-select', false,
+ // array('size' => 4, 'exclude' => $contact_id, 'networks' => 'DFRN_ONLY', 'single' => true));
+
+
+ $o .= '<div id="fsuggest-submit-wrapper"><input id="fsuggest-submit" type="submit" name="submit" value="' . t('Submit') . '" /></div>';
+ $o .= '</form>';
+
+ return $o;
+ }
+}
diff --git a/Zotlabs/Module/Getfile.php b/Zotlabs/Module/Getfile.php
new file mode 100644
index 000000000..6999e77e8
--- /dev/null
+++ b/Zotlabs/Module/Getfile.php
@@ -0,0 +1,102 @@
+<?php
+namespace Zotlabs\Module;
+
+/**
+ * module: getfile
+ *
+ * used for synchronising files and photos across clones
+ *
+ * The site initiating the file operation will send a sync packet to known clones.
+ * They will respond by building the DB structures they require, then will provide a
+ * post request to this site to grab the file data. This is sent as a stream direct to
+ * disk at the other end, avoiding memory issues.
+ *
+ * Since magic-auth cannot easily be used by the CURL process at the other end,
+ * we will require a signed request which includes a timestamp. This should not be
+ * used without SSL and is potentially vulnerable to replay if an attacker decrypts
+ * the SSL traffic fast enough. The amount of time slop is configurable but defaults
+ * to 3 minutes.
+ *
+ */
+
+
+
+require_once('include/Contact.php');
+require_once('include/attach.php');
+
+
+class Getfile extends \Zotlabs\Web\Controller {
+
+ function post() {
+
+ $hash = $_POST['hash'];
+ $time = $_POST['time'];
+ $sig = $_POST['signature'];
+ $resource = $_POST['resource'];
+ $revision = intval($_POST['revision']);
+
+ if(! $hash)
+ killme();
+
+ $channel = channelx_by_hash($hash);
+
+ if((! $channel) || (! $time) || (! $sig))
+ killme();
+
+ $slop = intval(get_pconfig($channel['channel_id'],'system','getfile_time_slop'));
+ if($slop < 1)
+ $slop = 3;
+
+ $d1 = datetime_convert('UTC','UTC',"now + $slop minutes");
+ $d2 = datetime_convert('UTC','UTC',"now - $slop minutes");
+
+ if(($time > $d1) || ($time < $d2)) {
+ logger('time outside allowable range');
+ killme();
+ }
+
+ if(! rsa_verify($hash . '.' . $time,base64url_decode($sig),$channel['channel_pubkey'])) {
+ logger('verify failed.');
+ killme();
+ }
+
+
+ $r = attach_by_hash($resource,$revision);
+
+ if(! $r['success']) {
+ notice( $r['message'] . EOL);
+ return;
+ }
+
+
+ $unsafe_types = array('text/html','text/css','application/javascript');
+
+ if(in_array($r['data']['filetype'],$unsafe_types)) {
+ header('Content-type: text/plain');
+ }
+ else {
+ header('Content-type: ' . $r['data']['filetype']);
+ }
+
+ header('Content-disposition: attachment; filename="' . $r['data']['filename'] . '"');
+ if(intval($r['data']['os_storage'])) {
+ $fname = dbunescbin($r['data']['data']);
+ if(strpos($fname,'store') !== false)
+ $istream = fopen($fname,'rb');
+ else
+ $istream = fopen('store/' . $channel['channel_address'] . '/' . $fname,'rb');
+ $ostream = fopen('php://output','wb');
+ if($istream && $ostream) {
+ pipe_streams($istream,$ostream);
+ fclose($istream);
+ fclose($ostream);
+ }
+ }
+ else
+ echo dbunescbin($r['data']['data']);
+ killme();
+
+
+
+ }
+}
diff --git a/Zotlabs/Module/Group.php b/Zotlabs/Module/Group.php
new file mode 100644
index 000000000..144797baf
--- /dev/null
+++ b/Zotlabs/Module/Group.php
@@ -0,0 +1,244 @@
+<?php
+namespace Zotlabs\Module;
+
+require_once('include/group.php');
+
+
+
+class Group extends \Zotlabs\Web\Controller {
+
+ function post() {
+
+ if(! local_channel()) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ if((argc() == 2) && (argv(1) === 'new')) {
+ check_form_security_token_redirectOnErr('/group/new', 'group_edit');
+
+ $name = notags(trim($_POST['groupname']));
+ $public = intval($_POST['public']);
+ $r = group_add(local_channel(),$name,$public);
+ if($r) {
+ info( t('Privacy group created.') . EOL );
+ $r = group_byname(local_channel(),$name);
+ if($r)
+ goaway(z_root() . '/group/' . $r);
+ }
+ else
+ notice( t('Could not create privacy group.') . EOL );
+ goaway(z_root() . '/group');
+
+ }
+ if((argc() == 2) && (intval(argv(1)))) {
+ check_form_security_token_redirectOnErr('/group', 'group_edit');
+
+ $r = q("SELECT * FROM `groups` WHERE `id` = %d AND `uid` = %d LIMIT 1",
+ intval(argv(1)),
+ intval(local_channel())
+ );
+ if(! $r) {
+ notice( t('Privacy group not found.') . EOL );
+ goaway(z_root() . '/connections');
+
+ }
+ $group = $r[0];
+ $groupname = notags(trim($_POST['groupname']));
+ $public = intval($_POST['public']);
+
+ if((strlen($groupname)) && (($groupname != $group['name']) || ($public != $group['visible']))) {
+ $r = q("UPDATE `groups` SET `name` = '%s', visible = %d WHERE `uid` = %d AND `id` = %d",
+ dbesc($groupname),
+ intval($public),
+ intval(local_channel()),
+ intval($group['id'])
+ );
+ if($r)
+ info( t('Privacy group updated.') . EOL );
+ }
+
+ goaway(z_root() . '/group/' . argv(1) . '/' . argv(2));
+ }
+ return;
+ }
+
+ function get() {
+ $change = false;
+
+ logger('mod_group: ' . \App::$cmd,LOGGER_DEBUG);
+
+ if(! local_channel()) {
+ notice( t('Permission denied') . EOL);
+ return;
+ }
+
+ // Switch to text mode interface if we have more than 'n' contacts or group members
+
+ $switchtotext = get_pconfig(local_channel(),'system','groupedit_image_limit');
+ if($switchtotext === false)
+ $switchtotext = get_config('system','groupedit_image_limit');
+ if($switchtotext === false)
+ $switchtotext = 400;
+
+ $tpl = get_markup_template('group_edit.tpl');
+ $context = array('$submit' => t('Submit'));
+
+ if((argc() == 2) && (argv(1) === 'new')) {
+
+ return replace_macros($tpl, $context + array(
+ '$title' => t('Create a group of channels.'),
+ '$gname' => array('groupname',t('Privacy group name: '), '', ''),
+ '$gid' => 'new',
+ '$public' => array('public',t('Members are visible to other channels'), false, ''),
+ '$form_security_token' => get_form_security_token("group_edit"),
+ ));
+
+
+ }
+
+ if((argc() == 3) && (argv(1) === 'drop')) {
+ check_form_security_token_redirectOnErr('/group', 'group_drop', 't');
+
+ if(intval(argv(2))) {
+ $r = q("SELECT `name` FROM `groups` WHERE `id` = %d AND `uid` = %d LIMIT 1",
+ intval(argv(2)),
+ intval(local_channel())
+ );
+ if($r)
+ $result = group_rmv(local_channel(),$r[0]['name']);
+ if($result)
+ info( t('Privacy group removed.') . EOL);
+ else
+ notice( t('Unable to remove privacy group.') . EOL);
+ }
+ goaway(z_root() . '/group');
+ // NOTREACHED
+ }
+
+
+ if((argc() > 2) && intval(argv(1)) && argv(2)) {
+
+ check_form_security_token_ForbiddenOnErr('group_member_change', 't');
+
+ $r = q("SELECT abook_xchan from abook left join xchan on abook_xchan = xchan_hash where abook_xchan = '%s' and abook_channel = %d and xchan_deleted = 0 and abook_self = 0 and abook_blocked = 0 and abook_pending = 0 limit 1",
+ dbesc(base64url_decode(argv(2))),
+ intval(local_channel())
+ );
+ if(count($r))
+ $change = base64url_decode(argv(2));
+
+ }
+
+ if((argc() > 1) && (intval(argv(1)))) {
+
+ require_once('include/acl_selectors.php');
+ $r = q("SELECT * FROM `groups` WHERE `id` = %d AND `uid` = %d AND `deleted` = 0 LIMIT 1",
+ intval(argv(1)),
+ intval(local_channel())
+ );
+ if(! $r) {
+ notice( t('Privacy group not found.') . EOL );
+ goaway(z_root() . '/connections');
+ }
+ $group = $r[0];
+
+
+ $members = group_get_members($group['id']);
+
+ $preselected = array();
+ if(count($members)) {
+ foreach($members as $member)
+ if(! in_array($member['xchan_hash'],$preselected))
+ $preselected[] = $member['xchan_hash'];
+ }
+
+ if($change) {
+
+ if(in_array($change,$preselected)) {
+ group_rmv_member(local_channel(),$group['name'],$change);
+ }
+ else {
+ group_add_member(local_channel(),$group['name'],$change);
+ }
+
+ $members = group_get_members($group['id']);
+
+ $preselected = array();
+ if(count($members)) {
+ foreach($members as $member)
+ $preselected[] = $member['xchan_hash'];
+ }
+ }
+
+ $drop_tpl = get_markup_template('group_drop.tpl');
+ $drop_txt = replace_macros($drop_tpl, array(
+ '$id' => $group['id'],
+ '$delete' => t('Delete'),
+ '$form_security_token' => get_form_security_token("group_drop"),
+ ));
+
+
+ $context = $context + array(
+ '$title' => t('Privacy group editor'),
+ '$gname' => array('groupname',t('Privacy group name: '),$group['name'], ''),
+ '$gid' => $group['id'],
+ '$drop' => $drop_txt,
+ '$public' => array('public',t('Members are visible to other channels'), $group['visible'], ''),
+ '$form_security_token' => get_form_security_token('group_edit'),
+ );
+
+ }
+
+ if(! isset($group))
+ return;
+
+ $groupeditor = array(
+ 'label_members' => t('Members'),
+ 'members' => array(),
+ 'label_contacts' => t('All Connected Channels'),
+ 'contacts' => array(),
+ );
+
+ $sec_token = addslashes(get_form_security_token('group_member_change'));
+ $textmode = (($switchtotext && (count($members) > $switchtotext)) ? true : false);
+ foreach($members as $member) {
+ if($member['xchan_url']) {
+ $member['archived'] = (intval($member['abook_archived']) ? true : false);
+ $member['click'] = 'groupChangeMember(' . $group['id'] . ',\'' . base64url_encode($member['xchan_hash']) . '\',\'' . $sec_token . '\'); return false;';
+ $groupeditor['members'][] = micropro($member,true,'mpgroup', $textmode);
+ }
+ else
+ group_rmv_member(local_channel(),$group['name'],$member['xchan_hash']);
+ }
+
+ $r = q("SELECT abook.*, xchan.* FROM `abook` left join xchan on abook_xchan = xchan_hash WHERE `abook_channel` = %d AND abook_self = 0 and abook_blocked = 0 and abook_pending = 0 and xchan_deleted = 0 order by xchan_name asc",
+ intval(local_channel())
+ );
+
+ if(count($r)) {
+ $textmode = (($switchtotext && (count($r) > $switchtotext)) ? true : false);
+ foreach($r as $member) {
+ if(! in_array($member['xchan_hash'],$preselected)) {
+ $member['archived'] = (intval($member['abook_archived']) ? true : false);
+ $member['click'] = 'groupChangeMember(' . $group['id'] . ',\'' . base64url_encode($member['xchan_hash']) . '\',\'' . $sec_token . '\'); return false;';
+ $groupeditor['contacts'][] = micropro($member,true,'mpall', $textmode);
+ }
+ }
+ }
+
+ $context['$groupeditor'] = $groupeditor;
+ $context['$desc'] = t('Click on a channel to add or remove.');
+
+ if($change) {
+ $tpl = get_markup_template('groupeditor.tpl');
+ echo replace_macros($tpl, $context);
+ killme();
+ }
+
+ return replace_macros($tpl, $context);
+
+ }
+
+
+}
diff --git a/Zotlabs/Module/Hcard.php b/Zotlabs/Module/Hcard.php
new file mode 100644
index 000000000..2636e676b
--- /dev/null
+++ b/Zotlabs/Module/Hcard.php
@@ -0,0 +1,60 @@
+<?php
+namespace Zotlabs\Module;
+
+
+class Hcard extends \Zotlabs\Web\Controller {
+
+ function init() {
+
+ if(argc() > 1)
+ $which = argv(1);
+ else {
+ notice( t('Requested profile is not available.') . EOL );
+ \App::$error = 404;
+ return;
+ }
+
+ $profile = '';
+ $channel = \App::get_channel();
+
+ if((local_channel()) && (argc() > 2) && (argv(2) === 'view')) {
+ $which = $channel['channel_address'];
+ $profile = argv(1);
+ $r = q("select profile_guid from profile where id = %d and uid = %d limit 1",
+ intval($profile),
+ intval(local_channel())
+ );
+ if(! $r)
+ $profile = '';
+ $profile = $r[0]['profile_guid'];
+ }
+
+ \App::$page['htmlhead'] .= '<link rel="alternate" type="application/atom+xml" href="' . z_root() . '/feed/' . $which .'" />' . "\r\n" ;
+
+ if(! $profile) {
+ $x = q("select channel_id as profile_uid from channel where channel_address = '%s' limit 1",
+ dbesc(argv(1))
+ );
+ if($x) {
+ \App::$profile = $x[0];
+ }
+ }
+
+ profile_load($a,$which,$profile);
+
+
+ }
+
+
+ function get() {
+
+ require_once('include/widgets.php');
+ return widget_profile(array());
+
+
+
+ }
+
+
+
+}
diff --git a/Zotlabs/Module/Help.php b/Zotlabs/Module/Help.php
new file mode 100644
index 000000000..4842c56c6
--- /dev/null
+++ b/Zotlabs/Module/Help.php
@@ -0,0 +1,146 @@
+<?php
+namespace Zotlabs\Module;
+
+
+require_once('include/help.php');
+
+/**
+ * You can create local site resources in doc/Site.md and either link to doc/Home.md for the standard resources
+ * or use our include mechanism to include it on your local page.
+ *
+ * #include doc/Home.md;
+ *
+ * The syntax is somewhat strict.
+ *
+ */
+
+class Help extends \Zotlabs\Web\Controller {
+
+ function get() {
+ nav_set_selected('help');
+
+ if($_REQUEST['search']) {
+
+ $o .= '<div id="help-content" class="generic-content-wrapper">';
+ $o .= '<div class="section-title-wrapper">';
+ $o .= '<h2>' . t('Documentation Search') . ' - ' . htmlspecialchars($_REQUEST['search']) . '</h2>';
+ $o .= '</div>';
+ $o .= '<div class="section-content-wrapper">';
+
+ $r = search_doc_files($_REQUEST['search']);
+ if($r) {
+ $o .= '<ul class="help-searchlist">';
+ foreach($r as $rr) {
+ $dirname = dirname($rr['sid']);
+ $fname = basename($rr['sid']);
+ $fname = substr($fname,0,strrpos($fname,'.'));
+ $path = trim(substr($dirname,4),'/');
+
+ $o .= '<li><a href="help/' . (($path) ? $path . '/' : '') . $fname . '" >' . ucwords(str_replace('_',' ',notags($fname))) . '</a><br />' .
+ str_replace('$Projectname',\Zotlabs\Project\System::get_platform_name(),substr($rr['text'],0,200)) . '...<br /><br /></li>';
+
+ }
+ $o .= '</ul>';
+ $o .= '</div>';
+ $o .= '</div>';
+ }
+ return $o;
+ }
+
+
+ global $lang;
+
+ $doctype = 'markdown';
+
+ $text = '';
+
+ if(argc() > 1) {
+ $path = '';
+ for($x = 1; $x < argc(); $x ++) {
+ if(strlen($path))
+ $path .= '/';
+ $path .= argv($x);
+ }
+ $title = basename($path);
+
+ $text = load_doc_file('doc/' . $path . '.md');
+ \App::$page['title'] = t('Help:') . ' ' . ucwords(str_replace('-',' ',notags($title)));
+
+ if(! $text) {
+ $text = load_doc_file('doc/' . $path . '.bb');
+ if($text)
+ $doctype = 'bbcode';
+ \App::$page['title'] = t('Help:') . ' ' . ucwords(str_replace('_',' ',notags($title)));
+ }
+ if(! $text) {
+ $text = load_doc_file('doc/' . $path . '.html');
+ if($text)
+ $doctype = 'html';
+ \App::$page['title'] = t('Help:') . ' ' . ucwords(str_replace('-',' ',notags($title)));
+ }
+ }
+
+ if(! $text) {
+ $text = load_doc_file('doc/Site.md');
+ \App::$page['title'] = t('Help');
+ }
+ if(! $text) {
+ $doctype = 'bbcode';
+ $text = load_doc_file('doc/main.bb');
+ \App::$page['title'] = t('Help');
+ }
+
+ if(! strlen($text)) {
+ header($_SERVER["SERVER_PROTOCOL"] . ' 404 ' . t('Not Found'));
+ $tpl = get_markup_template("404.tpl");
+ return replace_macros($tpl, array(
+ '$message' => t('Page not found.' )
+ ));
+ }
+
+ if($doctype === 'html')
+ $content = $text;
+ if($doctype === 'markdown') {
+ require_once('library/markdown.php');
+ # escape #include tags
+ $text = preg_replace('/#include/ism', '%%include', $text);
+ $content = Markdown($text);
+ $content = preg_replace('/%%include/ism', '#include', $content);
+ }
+ if($doctype === 'bbcode') {
+ require_once('include/bbcode.php');
+ $content = bbcode($text);
+ // bbcode retargets external content to new windows. This content is internal.
+ $content = str_replace(' target="_blank"','',$content);
+ }
+
+ $content = preg_replace_callback("/#include (.*?)\;/ism", 'self::preg_callback_help_include', $content);
+
+ return replace_macros(get_markup_template("help.tpl"), array(
+ '$title' => t('$Projectname Documentation'),
+ '$content' => translate_projectname($content)
+ ));
+
+ }
+
+
+ private static function preg_callback_help_include($matches) {
+
+ if($matches[1]) {
+ $include = str_replace($matches[0],load_doc_file($matches[1]),$matches[0]);
+ if(preg_match('/\.bb$/', $matches[1]) || preg_match('/\.txt$/', $matches[1])) {
+ require_once('include/bbcode.php');
+ $include = bbcode($include);
+ $include = str_replace(' target="_blank"','',$include);
+ }
+ elseif(preg_match('/\.md$/', $matches[1])) {
+ require_once('library/markdown.php');
+ $include = Markdown($include);
+ }
+ return $include;
+ }
+
+ }
+
+
+}
diff --git a/Zotlabs/Module/Home.php b/Zotlabs/Module/Home.php
new file mode 100644
index 000000000..f3ba96fdd
--- /dev/null
+++ b/Zotlabs/Module/Home.php
@@ -0,0 +1,89 @@
+<?php
+namespace Zotlabs\Module;
+
+require_once('include/items.php');
+require_once('include/conversation.php');
+
+
+
+class Home extends \Zotlabs\Web\Controller {
+
+ function init() {
+
+ $ret = array();
+
+ call_hooks('home_init',$ret);
+
+ $splash = ((argc() > 1 && argv(1) === 'splash') ? true : false);
+
+ $channel = \App::get_channel();
+ if(local_channel() && $channel && $channel['xchan_url'] && ! $splash) {
+ $dest = $channel['channel_startpage'];
+ if(! $dest)
+ $dest = get_pconfig(local_channel(),'system','startpage');
+ if(! $dest)
+ $dest = get_config('system','startpage');
+ if(! $dest)
+ $dest = z_root() . '/network';
+
+ goaway($dest);
+ }
+
+ if(get_account_id() && ! $splash) {
+ goaway(z_root() . '/new_channel');
+ }
+
+ }
+
+
+ function get($update = 0, $load = false) {
+
+ $o = '';
+
+
+ if(x($_SESSION,'theme'))
+ unset($_SESSION['theme']);
+ if(x($_SESSION,'mobile_theme'))
+ unset($_SESSION['mobile_theme']);
+
+ $splash = ((argc() > 1 && argv(1) === 'splash') ? true : false);
+
+ call_hooks('home_content',$o);
+ if($o)
+ return $o;
+
+ $frontpage = get_config('system','frontpage');
+ if($frontpage) {
+ if(strpos($frontpage,'include:') !== false) {
+ $file = trim(str_replace('include:' , '', $frontpage));
+ if(file_exists($file)) {
+ \App::$page['template'] = 'full';
+ \App::$page['title'] = t('$Projectname');
+ $o .= file_get_contents($file);
+ return $o;
+ }
+ }
+ if(strpos($frontpage,'http') !== 0)
+ $frontpage = z_root() . '/' . $frontpage;
+ if(intval(get_config('system','mirror_frontpage'))) {
+ $o = '<html><head><title>' . t('$Projectname') . '</title></head><body style="margin: 0; padding: 0; border: none;" ><iframe src="' . $frontpage . '" width="100%" height="100%" style="margin: 0; padding: 0; border: none;" ></iframe></body></html>';
+ echo $o;
+ killme();
+ }
+ goaway($frontpage);
+ }
+
+
+ $sitename = get_config('system','sitename');
+ if($sitename)
+ $o .= '<h1 class="home-welcome">' . sprintf( t("Welcome to %s") ,$sitename) . '</h1>';
+
+ $loginbox = get_config('system','login_on_homepage');
+ if(intval($loginbox) || $loginbox === false)
+ $o .= login((\App::$config['system']['register_policy'] == REGISTER_CLOSED) ? 0 : 1);
+
+ return $o;
+
+ }
+
+}
diff --git a/Zotlabs/Module/Hostxrd.php b/Zotlabs/Module/Hostxrd.php
new file mode 100644
index 000000000..1aae8da9e
--- /dev/null
+++ b/Zotlabs/Module/Hostxrd.php
@@ -0,0 +1,24 @@
+<?php
+namespace Zotlabs\Module;
+
+
+class Hostxrd extends \Zotlabs\Web\Controller {
+
+ function init() {
+ header('Access-Control-Allow-Origin: *');
+ header("Content-type: application/xrd+xml");
+ logger('hostxrd',LOGGER_DEBUG);
+
+ $tpl = get_markup_template('xrd_host.tpl');
+ $x = replace_macros(get_markup_template('xrd_host.tpl'), array(
+ '$zhost' => \App::get_hostname(),
+ '$zroot' => z_root()
+ ));
+ $arr = array('xrd' => $x);
+ call_hooks('hostxrd',$arr);
+
+ echo $arr['xrd'];
+ killme();
+ }
+
+}
diff --git a/Zotlabs/Module/Id.php b/Zotlabs/Module/Id.php
new file mode 100644
index 000000000..6a94b57f5
--- /dev/null
+++ b/Zotlabs/Module/Id.php
@@ -0,0 +1,319 @@
+<?php
+namespace Zotlabs\Module;
+
+/**
+ * @file mod/id.php
+ * @brief OpenID implementation
+ */
+
+require 'library/openid/provider/provider.php';
+
+
+$attrMap = array(
+ 'namePerson/first' => t('First Name'),
+ 'namePerson/last' => t('Last Name'),
+ 'namePerson/friendly' => t('Nickname'),
+ 'namePerson' => t('Full Name'),
+ 'contact/internet/email' => t('Email'),
+ 'contact/email' => t('Email'),
+ 'media/image/aspect11' => t('Profile Photo'),
+ 'media/image' => t('Profile Photo'),
+ 'media/image/default' => t('Profile Photo'),
+ 'media/image/16x16' => t('Profile Photo 16px'),
+ 'media/image/32x32' => t('Profile Photo 32px'),
+ 'media/image/48x48' => t('Profile Photo 48px'),
+ 'media/image/64x64' => t('Profile Photo 64px'),
+ 'media/image/80x80' => t('Profile Photo 80px'),
+ 'media/image/128x128' => t('Profile Photo 128px'),
+ 'timezone' => t('Timezone'),
+ 'contact/web/default' => t('Homepage URL'),
+ 'language/pref' => t('Language'),
+ 'birthDate/birthYear' => t('Birth Year'),
+ 'birthDate/birthMonth' => t('Birth Month'),
+ 'birthDate/birthday' => t('Birth Day'),
+ 'birthDate' => t('Birthdate'),
+ 'gender' => t('Gender'),
+);
+
+
+/**
+ * @brief Entrypoint for the OpenID implementation.
+ *
+ * @param App &$a
+ */
+
+class Id extends \Zotlabs\Web\Controller {
+
+ function init() {
+
+ logger('id: ' . print_r($_REQUEST, true));
+
+ if(argc() > 1) {
+ $which = argv(1);
+ } else {
+ \App::$error = 404;
+ return;
+ }
+
+ $profile = '';
+ $channel = \App::get_channel();
+ profile_load($a,$which,$profile);
+
+ $op = new MysqlProvider;
+ $op->server();
+ }
+
+ /**
+ * @brief Returns user data needed for OpenID.
+ *
+ * If no $handle is provided we will use local_channel() by default.
+ *
+ * @param string $handle (default null)
+ * @return boolean|array
+ */
+ static public function getUserData($handle = null) {
+ if (! local_channel()) {
+ notice( t('Permission denied.') . EOL);
+ \App::$page['content'] = login();
+
+ return false;
+ }
+
+ // logger('handle: ' . $handle);
+
+ if ($handle) {
+ $r = q("select * from channel left join xchan on channel_hash = xchan_hash where channel_address = '%s' limit 1",
+ dbesc($handle)
+ );
+ } else {
+ $r = q("select * from channel left join xchan on channel_hash = xchan_hash where channel_id = %d",
+ intval(local_channel())
+ );
+ }
+
+ if (! r)
+ return false;
+
+ $x = q("select * from account where account_id = %d limit 1",
+ intval($r[0]['channel_account_id'])
+ );
+ if ($x)
+ $r[0]['email'] = $x[0]['account_email'];
+
+ $p = q("select * from profile where is_default = 1 and uid = %d limit 1",
+ intval($r[0]['channel_account_id'])
+ );
+
+ $gender = '';
+ if ($p[0]['gender'] == t('Male'))
+ $gender = 'M';
+ if ($p[0]['gender'] == t('Female'))
+ $gender = 'F';
+
+ $r[0]['firstName'] = ((strpos($r[0]['channel_name'],' ')) ? substr($r[0]['channel_name'],0,strpos($r[0]['channel_name'],' ')) : $r[0]['channel_name']);
+ $r[0]['lastName'] = ((strpos($r[0]['channel_name'],' ')) ? substr($r[0]['channel_name'],strpos($r[0]['channel_name'],' ')+1) : '');
+ $r[0]['namePerson'] = $r[0]['channel_name'];
+ $r[0]['pphoto'] = $r[0]['xchan_photo_l'];
+ $r[0]['pphoto16'] = z_root() . '/photo/profile/16/' . $r[0]['channel_id'] . '.jpg';
+ $r[0]['pphoto32'] = z_root() . '/photo/profile/32/' . $r[0]['channel_id'] . '.jpg';
+ $r[0]['pphoto48'] = z_root() . '/photo/profile/48/' . $r[0]['channel_id'] . '.jpg';
+ $r[0]['pphoto64'] = z_root() . '/photo/profile/64/' . $r[0]['channel_id'] . '.jpg';
+ $r[0]['pphoto80'] = z_root() . '/photo/profile/80/' . $r[0]['channel_id'] . '.jpg';
+ $r[0]['pphoto128'] = z_root() . '/photo/profile/128/' . $r[0]['channel_id'] . '.jpg';
+ $r[0]['timezone'] = $r[0]['channel_timezone'];
+ $r[0]['url'] = $r[0]['xchan_url'];
+ $r[0]['language'] = (($x[0]['account_language']) ? $x[0]['account_language'] : 'en');
+ $r[0]['birthyear'] = ((intval(substr($p[0]['dob'],0,4))) ? intval(substr($p[0]['dob'],0,4)) : '');
+ $r[0]['birthmonth'] = ((intval(substr($p[0]['dob'],5,2))) ? intval(substr($p[0]['dob'],5,2)) : '');
+ $r[0]['birthday'] = ((intval(substr($p[0]['dob'],8,2))) ? intval(substr($p[0]['dob'],8,2)) : '');
+ $r[0]['birthdate'] = (($r[0]['birthyear'] && $r[0]['birthmonth'] && $r[0]['birthday']) ? $p[0]['dob'] : '');
+ $r[0]['gender'] = $gender;
+
+ return $r[0];
+
+ /*
+ * if(isset($_POST['login'],$_POST['password'])) {
+ * $login = mysql_real_escape_string($_POST['login']);
+ * $password = sha1($_POST['password']);
+ * $q = mysql_query("SELECT * FROM Users WHERE login = '$login' AND password = '$password'");
+ * if($data = mysql_fetch_assoc($q)) {
+ * return $data;
+ * }
+ * if($handle) {
+ * echo 'Wrong login/password.';
+ * }
+ * }
+ * if($handle) {
+ * ?>
+ * <form action="" method="post">
+ * <input type="hidden" name="openid.assoc_handle" value="<?php
+namespace Zotlabs\Module; echo $handle?>">
+ * Login: <input type="text" name="login"><br>
+ * Password: <input type="password" name="password"><br>
+ * <button>Submit</button>
+ * </form>
+ * <?php
+namespace Zotlabs\Module;
+ * die();
+ * }
+ */
+
+ }
+}
+
+
+ /**
+ * @brief MySQL provider for OpenID implementation.
+ *
+ */
+ class MysqlProvider extends \LightOpenIDProvider {
+
+ // See http://openid.net/specs/openid-attribute-properties-list-1_0-01.html
+ // This list contains a few variations of these attributes to maintain
+ // compatibility with legacy clients
+
+ private $attrFieldMap = array(
+ 'namePerson/first' => 'firstName',
+ 'namePerson/last' => 'lastName',
+ 'namePerson/friendly' => 'channel_address',
+ 'namePerson' => 'namePerson',
+ 'contact/internet/email' => 'email',
+ 'contact/email' => 'email',
+ 'media/image/aspect11' => 'pphoto',
+ 'media/image' => 'pphoto',
+ 'media/image/default' => 'pphoto',
+ 'media/image/16x16' => 'pphoto16',
+ 'media/image/32x32' => 'pphoto32',
+ 'media/image/48x48' => 'pphoto48',
+ 'media/image/64x64' => 'pphoto64',
+ 'media/image/80x80' => 'pphoto80',
+ 'media/image/128x128' => 'pphoto128',
+ 'timezone' => 'timezone',
+ 'contact/web/default' => 'url',
+ 'language/pref' => 'language',
+ 'birthDate/birthYear' => 'birthyear',
+ 'birthDate/birthMonth' => 'birthmonth',
+ 'birthDate/birthday' => 'birthday',
+ 'birthDate' => 'birthdate',
+ 'gender' => 'gender',
+ );
+
+ function setup($identity, $realm, $assoc_handle, $attributes) {
+ global $attrMap;
+
+ // logger('identity: ' . $identity);
+ // logger('realm: ' . $realm);
+ // logger('assoc_handle: ' . $assoc_handle);
+ // logger('attributes: ' . print_r($attributes,true));
+
+ $data = \Zotlabs\Module\Id::getUserData($assoc_handle);
+
+
+ /** @FIXME this needs to be a template with localised strings */
+
+ $o .= '<form action="" method="post">'
+ . '<input type="hidden" name="openid.assoc_handle" value="' . $assoc_handle . '">'
+ . '<input type="hidden" name="login" value="' . $_POST['login'] .'">'
+ . '<input type="hidden" name="password" value="' . $_POST['password'] .'">'
+ . "<b>$realm</b> wishes to authenticate you.";
+ if($attributes['required'] || $attributes['optional']) {
+ $o .= " It also requests following information (required fields marked with *):"
+ . '<ul>';
+
+ foreach($attributes['required'] as $attr) {
+ if(isset($this->attrMap[$attr])) {
+ $o .= '<li>'
+ . '<input type="checkbox" name="attributes[' . $attr . ']"> '
+ . $this->attrMap[$attr] . ' <span class="required">*</span></li>';
+ }
+ }
+
+ foreach($attributes['optional'] as $attr) {
+ if(isset($this->attrMap[$attr])) {
+ $o .= '<li>'
+ . '<input type="checkbox" name="attributes[' . $attr . ']"> '
+ . $this->attrMap[$attr] . '</li>';
+ }
+ }
+ $o .= '</ul>';
+ }
+ $o .= '<br>'
+ . '<button name="once">Allow once</button> '
+ . '<button name="always">Always allow</button> '
+ . '<button name="cancel">cancel</button> '
+ . '</form>';
+
+ \App::$page['content'] .= $o;
+ }
+
+ function checkid($realm, &$attributes) {
+
+ logger('checkid: ' . $realm);
+ logger('checkid attrs: ' . print_r($attributes,true));
+
+ if(isset($_POST['cancel'])) {
+ $this->cancel();
+ }
+
+ $data = \Zotlabs\Module\Id::getUserData();
+ if(! $data) {
+ return false;
+ }
+
+ $q = get_pconfig(local_channel(), 'openid', $realm);
+
+ $attrs = array();
+ if($q) {
+ $attrs = $q;
+ } elseif(isset($_POST['attributes'])) {
+ $attrs = array_keys($_POST['attributes']);
+ } elseif(!isset($_POST['once']) && !isset($_POST['always'])) {
+ return false;
+ }
+
+ $attributes = array();
+ foreach($attrs as $attr) {
+ if(isset($this->attrFieldMap[$attr])) {
+ $attributes[$attr] = $data[$this->attrFieldMap[$attr]];
+ }
+ }
+
+ if(isset($_POST['always'])) {
+ set_pconfig(local_channel(),'openid',$realm,array_keys($attributes));
+ }
+
+ return z_root() . '/id/' . $data['channel_address'];
+ }
+
+ function assoc_handle() {
+ logger('assoc_handle');
+ $channel = \App::get_channel();
+
+ return z_root() . '/channel/' . $channel['channel_address'];
+ }
+
+ function setAssoc($handle, $data) {
+ logger('setAssoc');
+ $channel = channelx_by_nick(basename($handle));
+ if($channel)
+ set_pconfig($channel['channel_id'],'openid','associate',$data);
+ }
+
+ function getAssoc($handle) {
+ logger('getAssoc: ' . $handle);
+
+ $channel = channelx_by_nick(basename($handle));
+ if($channel)
+ return get_pconfig($channel['channel_id'], 'openid', 'associate');
+
+ return false;
+ }
+
+ function delAssoc($handle) {
+ logger('delAssoc');
+ $channel = channelx_by_nick(basename($handle));
+ if($channel)
+ return del_pconfig($channel['channel_id'], 'openid', 'associate');
+ }
+ }
+
diff --git a/Zotlabs/Module/Impel.php b/Zotlabs/Module/Impel.php
new file mode 100644
index 000000000..e326f7818
--- /dev/null
+++ b/Zotlabs/Module/Impel.php
@@ -0,0 +1,207 @@
+<?php
+namespace Zotlabs\Module; /** @file */
+
+// import page design element
+
+require_once('include/menu.php');
+
+
+class Impel extends \Zotlabs\Web\Controller {
+
+ function init() {
+
+ $ret = array('success' => false);
+
+ if(! local_channel())
+ json_return_and_die($ret);
+
+ logger('impel: ' . print_r($_REQUEST,true), LOGGER_DATA);
+
+ $elm = $_REQUEST['element'];
+ $x = base64url_decode($elm);
+ if(! $x)
+ json_return_and_die($ret);
+
+ $j = json_decode($x,true);
+ if(! $j)
+ json_return_and_die($ret);
+
+ $channel = \App::get_channel();
+
+ $arr = array();
+ $is_menu = false;
+
+ // a portable menu has its links rewritten with the local baseurl
+ $portable_menu = false;
+
+ switch($j['type']) {
+ case 'webpage':
+ $arr['item_type'] = ITEM_TYPE_WEBPAGE;
+ $namespace = 'WEBPAGE';
+ $installed_type = t('webpage');
+ break;
+ case 'block':
+ $arr['item_type'] = ITEM_TYPE_BLOCK;
+ $namespace = 'BUILDBLOCK';
+ $installed_type = t('block');
+ break;
+ case 'layout':
+ $arr['item_type'] = ITEM_TYPE_PDL;
+ $namespace = 'PDL';
+ $installed_type = t('layout');
+ break;
+ case 'portable-menu':
+ $portable_menu = true;
+ // fall through
+ case 'menu':
+ $is_menu = true;
+ $installed_type = t('menu');
+ break;
+ default:
+ logger('mod_impel: unrecognised element type' . print_r($j,true));
+ break;
+ }
+
+ if($is_menu) {
+ $m = array();
+ $m['menu_channel_id'] = local_channel();
+ $m['menu_name'] = $j['pagetitle'];
+ $m['menu_desc'] = $j['desc'];
+ if($j['created'])
+ $m['menu_created'] = datetime_convert($j['created']);
+ if($j['edited'])
+ $m['menu_edited'] = datetime_convert($j['edited']);
+
+ $m['menu_flags'] = 0;
+ if($j['flags']) {
+ if(in_array('bookmark',$j['flags']))
+ $m['menu_flags'] |= MENU_BOOKMARK;
+ if(in_array('system',$j['flags']))
+ $m['menu_flags'] |= MENU_SYSTEM;
+
+ }
+
+ $menu_id = menu_create($m);
+
+ if($menu_id) {
+ if(is_array($j['items'])) {
+ foreach($j['items'] as $it) {
+ $mitem = array();
+
+ $mitem['mitem_link'] = str_replace('[baseurl]',z_root(),$it['link']);
+ $mitem['mitem_desc'] = escape_tags($it['desc']);
+ $mitem['mitem_order'] = intval($it['order']);
+ if(is_array($it['flags'])) {
+ $mitem['mitem_flags'] = 0;
+ if(in_array('zid',$it['flags']))
+ $mitem['mitem_flags'] |= MENU_ITEM_ZID;
+ if(in_array('new-window',$it['flags']))
+ $mitem['mitem_flags'] |= MENU_ITEM_NEWWIN;
+ if(in_array('chatroom',$it['flags']))
+ $mitem['mitem_flags'] |= MENU_ITEM_CHATROOM;
+ }
+ menu_add_item($menu_id,local_channel(),$mitem);
+ }
+ if($j['edited']) {
+ $x = q("update menu set menu_edited = '%s' where menu_id = %d and menu_channel_id = %d",
+ dbesc(datetime_convert('UTC','UTC',$j['edited'])),
+ intval($menu_id),
+ intval(local_channel())
+ );
+ }
+ }
+ $ret['success'] = true;
+ }
+ $x = $ret;
+ }
+ else {
+ $arr['uid'] = local_channel();
+ $arr['aid'] = $channel['channel_account_id'];
+ $arr['title'] = $j['title'];
+ $arr['body'] = $j['body'];
+ $arr['term'] = $j['term'];
+ $arr['layout_mid'] = $j['layout_mid'];
+ $arr['created'] = datetime_convert('UTC','UTC', $j['created']);
+ $arr['edited'] = datetime_convert('UTC','UTC',$j['edited']);
+ $arr['owner_xchan'] = get_observer_hash();
+ $arr['author_xchan'] = (($j['author_xchan']) ? $j['author_xchan'] : get_observer_hash());
+ $arr['mimetype'] = (($j['mimetype']) ? $j['mimetype'] : 'text/bbcode');
+
+ if(! $j['mid'])
+ $j['mid'] = item_message_id();
+
+ $arr['mid'] = $arr['parent_mid'] = $j['mid'];
+
+
+ if($j['pagetitle']) {
+ require_once('library/urlify/URLify.php');
+ $pagetitle = strtolower(\URLify::transliterate($j['pagetitle']));
+ }
+
+
+
+ // Verify ability to use html or php!!!
+
+ $execflag = false;
+
+ if($arr['mimetype'] === 'application/x-php') {
+ $z = q("select account_id, account_roles, channel_pageflags from account left join channel on channel_account_id = account_id where channel_id = %d limit 1",
+ intval(local_channel())
+ );
+
+ if($z && (($z[0]['account_roles'] & ACCOUNT_ROLE_ALLOWCODE) || ($z[0]['channel_pageflags'] & PAGE_ALLOWCODE))) {
+ $execflag = true;
+ }
+ }
+
+ $remote_id = 0;
+
+ $z = q("select * from item_id where sid = '%s' and service = '%s' and uid = %d limit 1",
+ dbesc($pagetitle),
+ dbesc($namespace),
+ intval(local_channel())
+ );
+
+ $i = q("select id, edited, item_deleted from item where mid = '%s' and uid = %d limit 1",
+ dbesc($arr['mid']),
+ intval(local_channel())
+ );
+
+ if($z && $i) {
+ $remote_id = $z[0]['id'];
+ $arr['id'] = $i[0]['id'];
+ // don't update if it has the same timestamp as the original
+ if($arr['edited'] > $i[0]['edited'])
+ $x = item_store_update($arr,$execflag);
+ }
+ else {
+ if(($i) && (intval($i[0]['item_deleted']))) {
+ // was partially deleted already, finish it off
+ q("delete from item where mid = '%s' and uid = %d",
+ dbesc($arr['mid']),
+ intval(local_channel())
+ );
+ }
+ $x = item_store($arr,$execflag);
+ }
+
+ if($x['success']) {
+ $item_id = $x['item_id'];
+ update_remote_id($channel,$item_id,$arr['item_type'],$pagetitle,$namespace,$remote_id,$arr['mid']);
+ }
+ }
+
+ if($x['success']) {
+ $ret['success'] = true;
+ info( sprintf( t('%s element installed'), $installed_type));
+ }
+ else {
+ notice( sprintf( t('%s element installation failed'), $installed_type));
+ }
+
+ //??? should perhaps return ret?
+ json_return_and_die(true);
+
+ }
+
+}
diff --git a/Zotlabs/Module/Import.php b/Zotlabs/Module/Import.php
new file mode 100644
index 000000000..dadbf8ff1
--- /dev/null
+++ b/Zotlabs/Module/Import.php
@@ -0,0 +1,553 @@
+<?php
+namespace Zotlabs\Module;
+
+// Import a channel, either by direct file upload or via
+// connection to original server.
+
+require_once('include/Contact.php');
+require_once('include/zot.php');
+require_once('include/identity.php');
+require_once('include/import.php');
+
+
+
+class Import extends \Zotlabs\Web\Controller {
+
+ function import_account($account_id) {
+
+ if(! $account_id){
+ logger("import_account: No account ID supplied");
+ return;
+ }
+
+ $max_identities = account_service_class_fetch($account_id,'total_identities');
+ $max_friends = account_service_class_fetch($account_id,'total_channels');
+ $max_feeds = account_service_class_fetch($account_id,'total_feeds');
+
+ if($max_identities !== false) {
+ $r = q("select channel_id from channel where channel_account_id = %d",
+ intval($account_id)
+ );
+ if($r && count($r) > $max_identities) {
+ notice( sprintf( t('Your service plan only allows %d channels.'), $max_identities) . EOL);
+ return;
+ }
+ }
+
+
+ $data = null;
+ $seize = ((x($_REQUEST,'make_primary')) ? intval($_REQUEST['make_primary']) : 0);
+ $import_posts = ((x($_REQUEST,'import_posts')) ? intval($_REQUEST['import_posts']) : 0);
+ $src = $_FILES['filename']['tmp_name'];
+ $filename = basename($_FILES['filename']['name']);
+ $filesize = intval($_FILES['filename']['size']);
+ $filetype = $_FILES['filename']['type'];
+
+ $completed = ((array_key_exists('import_step',$_SESSION)) ? intval($_SESSION['import_step']) : 0);
+ if($completed)
+ logger('saved import step: ' . $_SESSION['import_step']);
+
+ if($src) {
+
+ // This is OS specific and could also fail if your tmpdir isn't very large
+ // mostly used for Diaspora which exports gzipped files.
+
+ if(strpos($filename,'.gz')){
+ @rename($src,$src . '.gz');
+ @system('gunzip ' . escapeshellarg($src . '.gz'));
+ }
+
+ if($filesize) {
+ $data = @file_get_contents($src);
+ }
+ unlink($src);
+ }
+
+ if(! $src) {
+ $old_address = ((x($_REQUEST,'old_address')) ? $_REQUEST['old_address'] : '');
+ if(! $old_address) {
+ logger('mod_import: nothing to import.');
+ notice( t('Nothing to import.') . EOL);
+ return;
+ }
+
+ $email = ((x($_REQUEST,'email')) ? $_REQUEST['email'] : '');
+ $password = ((x($_REQUEST,'password')) ? $_REQUEST['password'] : '');
+
+ $channelname = substr($old_address,0,strpos($old_address,'@'));
+ $servername = substr($old_address,strpos($old_address,'@')+1);
+
+ $scheme = 'https://';
+ $api_path = '/api/red/channel/export/basic?f=&channel=' . $channelname;
+ if($import_posts)
+ $api_path .= '&posts=1';
+ $binary = false;
+ $redirects = 0;
+ $opts = array('http_auth' => $email . ':' . $password);
+ $url = $scheme . $servername . $api_path;
+ $ret = z_fetch_url($url, $binary, $redirects, $opts);
+ if(! $ret['success'])
+ $ret = z_fetch_url('http://' . $servername . $api_path, $binary, $redirects, $opts);
+ if($ret['success'])
+ $data = $ret['body'];
+ else
+ notice( t('Unable to download data from old server') . EOL);
+
+ }
+
+ if(! $data) {
+ logger('mod_import: empty file.');
+ notice( t('Imported file is empty.') . EOL);
+ return;
+ }
+
+ $data = json_decode($data,true);
+
+ // logger('import: data: ' . print_r($data,true));
+ // print_r($data);
+
+
+ if(array_key_exists('user',$data) && array_key_exists('version',$data)) {
+ require_once('include/Import/import_diaspora.php');
+ import_diaspora($data);
+ return;
+ }
+
+ $moving = false;
+
+ if(array_key_exists('compatibility',$data) && array_key_exists('database',$data['compatibility'])) {
+ $v1 = substr($data['compatibility']['database'],-4);
+ $v2 = substr(DB_UPDATE_VERSION,-4);
+ if($v2 > $v1) {
+ $t = sprintf( t('Warning: Database versions differ by %1$d updates.'), $v2 - $v1 );
+ notice($t);
+ }
+ if(array_key_exists('server_role',$data['compatibility']) && $data['compatibility']['server_role'] == 'basic')
+ $moving = true;
+ }
+
+ if($moving)
+ $seize = 1;
+
+ // import channel
+
+ if(array_key_exists('channel',$data)) {
+
+ if($completed < 1) {
+ $channel = import_channel($data['channel'], $account_id, $seize);
+
+ }
+ else {
+ $r = q("select * from channel where channel_account_id = %d and channel_guid = '%s' limit 1",
+ intval($account_id),
+ dbesc($channel['channel_guid'])
+ );
+ if($r)
+ $channel = $r[0];
+ }
+ if(! $channel) {
+ logger('mod_import: channel not found. ', print_r($channel,true));
+ notice( t('Cloned channel not found. Import failed.') . EOL);
+ return;
+ }
+ }
+
+ if(! $channel)
+ $channel = \App::get_channel();
+
+ if(! $channel) {
+ logger('mod_import: channel not found. ', print_r($channel,true));
+ notice( t('No channel. Import failed.') . EOL);
+ return;
+ }
+
+
+ if($completed < 2) {
+ if(is_array($data['config'])) {
+ import_config($channel,$data['config']);
+ }
+
+ logger('import step 2');
+ $_SESSION['import_step'] = 2;
+ }
+
+
+ if($completed < 3) {
+
+ if($data['photo']) {
+ require_once('include/photo/photo_driver.php');
+ import_channel_photo(base64url_decode($data['photo']['data']),$data['photo']['type'],$account_id,$channel['channel_id']);
+ }
+
+ if(is_array($data['profile']))
+ import_profiles($channel,$data['profile']);
+
+ logger('import step 3');
+ $_SESSION['import_step'] = 3;
+ }
+
+
+ if($completed < 4) {
+
+ if(is_array($data['hubloc']) && (! $moving)) {
+ import_hublocs($channel,$data['hubloc'],$seize);
+
+ }
+ logger('import step 4');
+ $_SESSION['import_step'] = 4;
+ }
+
+ if($completed < 5) {
+ // create new hubloc for the new channel at this site
+
+ $r = q("insert into hubloc ( hubloc_guid, hubloc_guid_sig, hubloc_hash, hubloc_addr, hubloc_network, hubloc_primary,
+ hubloc_url, hubloc_url_sig, hubloc_host, hubloc_callback, hubloc_sitekey )
+ values ( '%s', '%s', '%s', '%s', '%s', %d, '%s', '%s', '%s', '%s', '%s' )",
+ dbesc($channel['channel_guid']),
+ dbesc($channel['channel_guid_sig']),
+ dbesc($channel['channel_hash']),
+ dbesc($channel['channel_address'] . '@' . \App::get_hostname()),
+ dbesc('zot'),
+ intval(($seize) ? 1 : 0),
+ dbesc(z_root()),
+ dbesc(base64url_encode(rsa_sign(z_root(),$channel['channel_prvkey']))),
+ dbesc(\App::get_hostname()),
+ dbesc(z_root() . '/post'),
+ dbesc(get_config('system','pubkey'))
+ );
+
+ // reset the original primary hubloc if it is being seized
+
+ if($seize) {
+ $r = q("update hubloc set hubloc_primary = 0 where hubloc_primary = 1 and hubloc_hash = '%s' and hubloc_url != '%s' ",
+ dbesc($channel['channel_hash']),
+ dbesc(z_root())
+ );
+ }
+ logger('import step 5');
+ $_SESSION['import_step'] = 5;
+ }
+
+
+ if($completed < 6) {
+
+ // import xchans and contact photos
+
+ if($seize) {
+
+ // replace any existing xchan we may have on this site if we're seizing control
+
+ $r = q("delete from xchan where xchan_hash = '%s'",
+ dbesc($channel['channel_hash'])
+ );
+
+ $r = q("insert into xchan ( xchan_hash, xchan_guid, xchan_guid_sig, xchan_pubkey, xchan_photo_l, xchan_photo_m, xchan_photo_s, xchan_addr, xchan_url, xchan_follow, xchan_connurl, xchan_name, xchan_network, xchan_photo_date, xchan_name_date, xchan_hidden, xchan_orphan, xchan_censored, xchan_selfcensored, xchan_system, xchan_pubforum, xchan_deleted ) values ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, %d, %d, %d, %d, %d )",
+ dbesc($channel['channel_hash']),
+ dbesc($channel['channel_guid']),
+ dbesc($channel['channel_guid_sig']),
+ dbesc($channel['channel_pubkey']),
+ dbesc(z_root() . "/photo/profile/l/" . $channel['channel_id']),
+ dbesc(z_root() . "/photo/profile/m/" . $channel['channel_id']),
+ dbesc(z_root() . "/photo/profile/s/" . $channel['channel_id']),
+ dbesc($channel['channel_address'] . '@' . \App::get_hostname()),
+ dbesc(z_root() . '/channel/' . $channel['channel_address']),
+ dbesc(z_root() . '/follow?f=&url=%s'),
+ dbesc(z_root() . '/poco/' . $channel['channel_address']),
+ dbesc($channel['channel_name']),
+ dbesc('zot'),
+ dbesc(datetime_convert()),
+ dbesc(datetime_convert()),
+ 0,0,0,0,0,0,0
+ );
+ }
+ logger('import step 6');
+ $_SESSION['import_step'] = 6;
+ }
+
+ if($completed < 7) {
+
+ $xchans = $data['xchan'];
+ if($xchans) {
+ foreach($xchans as $xchan) {
+
+ $hash = make_xchan_hash($xchan['xchan_guid'],$xchan['xchan_guid_sig']);
+ if($xchan['xchan_network'] === 'zot' && $hash !== $xchan['xchan_hash']) {
+ logger('forged xchan: ' . print_r($xchan,true));
+ continue;
+ }
+
+ if(! array_key_exists('xchan_hidden',$xchan)) {
+ $xchan['xchan_hidden'] = (($xchan['xchan_flags'] & 0x0001) ? 1 : 0);
+ $xchan['xchan_orphan'] = (($xchan['xchan_flags'] & 0x0002) ? 1 : 0);
+ $xchan['xchan_censored'] = (($xchan['xchan_flags'] & 0x0004) ? 1 : 0);
+ $xchan['xchan_selfcensored'] = (($xchan['xchan_flags'] & 0x0008) ? 1 : 0);
+ $xchan['xchan_system'] = (($xchan['xchan_flags'] & 0x0010) ? 1 : 0);
+ $xchan['xchan_pubforum'] = (($xchan['xchan_flags'] & 0x0020) ? 1 : 0);
+ $xchan['xchan_deleted'] = (($xchan['xchan_flags'] & 0x1000) ? 1 : 0);
+ }
+
+ $r = q("select xchan_hash from xchan where xchan_hash = '%s' limit 1",
+ dbesc($xchan['xchan_hash'])
+ );
+ if($r)
+ continue;
+
+ dbesc_array($xchan);
+
+ $r = dbq("INSERT INTO xchan (`"
+ . implode("`, `", array_keys($xchan))
+ . "`) VALUES ('"
+ . implode("', '", array_values($xchan))
+ . "')" );
+
+
+ require_once('include/photo/photo_driver.php');
+ $photos = import_xchan_photo($xchan['xchan_photo_l'],$xchan['xchan_hash']);
+ if($photos[4])
+ $photodate = NULL_DATE;
+ else
+ $photodate = $xchan['xchan_photo_date'];
+
+ $r = q("update xchan set xchan_photo_l = '%s', xchan_photo_m = '%s', xchan_photo_s = '%s', xchan_photo_mimetype = '%s', xchan_photo_date = '%s'
+ where xchan_hash = '%s'",
+ dbesc($photos[0]),
+ dbesc($photos[1]),
+ dbesc($photos[2]),
+ dbesc($photos[3]),
+ dbesc($photodate),
+ dbesc($xchan['xchan_hash'])
+ );
+
+ }
+ }
+ logger('import step 7');
+ $_SESSION['import_step'] = 7;
+
+ }
+
+
+
+ // FIXME - ensure we have an xchan if somebody is trying to pull a fast one
+
+ if($completed < 8) {
+ $friends = 0;
+ $feeds = 0;
+
+ // import contacts
+ $abooks = $data['abook'];
+ if($abooks) {
+ foreach($abooks as $abook) {
+
+ $abconfig = null;
+ if(array_key_exists('abconfig',$abook) && is_array($abook['abconfig']) && count($abook['abconfig']))
+ $abconfig = $abook['abconfig'];
+
+ unset($abook['abook_id']);
+ unset($abook['abook_rating']);
+ unset($abook['abook_rating_text']);
+ $abook['abook_account'] = $account_id;
+ $abook['abook_channel'] = $channel['channel_id'];
+ if(! array_key_exists('abook_blocked',$abook)) {
+ $abook['abook_blocked'] = (($abook['abook_flags'] & 0x0001 ) ? 1 : 0);
+ $abook['abook_ignored'] = (($abook['abook_flags'] & 0x0002 ) ? 1 : 0);
+ $abook['abook_hidden'] = (($abook['abook_flags'] & 0x0004 ) ? 1 : 0);
+ $abook['abook_archived'] = (($abook['abook_flags'] & 0x0008 ) ? 1 : 0);
+ $abook['abook_pending'] = (($abook['abook_flags'] & 0x0010 ) ? 1 : 0);
+ $abook['abook_unconnected'] = (($abook['abook_flags'] & 0x0020 ) ? 1 : 0);
+ $abook['abook_self'] = (($abook['abook_flags'] & 0x0080 ) ? 1 : 0);
+ $abook['abook_feed'] = (($abook['abook_flags'] & 0x0100 ) ? 1 : 0);
+ }
+
+ if($abook['abook_self']) {
+ $role = get_pconfig($channel['channel_id'],'system','permissions_role');
+ if(($role === 'forum') || ($abook['abook_my_perms'] & PERMS_W_TAGWALL)) {
+ q("update xchan set xchan_pubforum = 1 where xchan_hash = '%s' ",
+ dbesc($abook['abook_xchan'])
+ );
+ }
+ }
+ else {
+ if($max_friends !== false && $friends > $max_friends)
+ continue;
+ if($max_feeds !== false && intval($abook['abook_feed']) && ($feeds > $max_feeds))
+ continue;
+ }
+
+ dbesc_array($abook);
+ $r = dbq("INSERT INTO abook (`"
+ . implode("`, `", array_keys($abook))
+ . "`) VALUES ('"
+ . implode("', '", array_values($abook))
+ . "')" );
+
+ $friends ++;
+ if(intval($abook['abook_feed']))
+ $feeds ++;
+
+ if($abconfig) {
+ // @fixme does not handle sync of del_abconfig
+ foreach($abconfig as $abc) {
+ if($abc['chan'] === $channel['channel_hash'])
+ set_abconfig($abc['chan'],$abc['xchan'],$abc['cat'],$abc['k'],$abc['v']);
+ }
+ }
+
+
+
+ }
+ }
+ logger('import step 8');
+ $_SESSION['import_step'] = 8;
+ }
+
+
+
+ if($completed < 9) {
+ $groups = $data['group'];
+ if($groups) {
+ $saved = array();
+ foreach($groups as $group) {
+ $saved[$group['hash']] = array('old' => $group['id']);
+ unset($group['id']);
+ $group['uid'] = $channel['channel_id'];
+ dbesc_array($group);
+ $r = dbq("INSERT INTO groups (`"
+ . implode("`, `", array_keys($group))
+ . "`) VALUES ('"
+ . implode("', '", array_values($group))
+ . "')" );
+ }
+ $r = q("select * from `groups` where uid = %d",
+ intval($channel['channel_id'])
+ );
+ if($r) {
+ foreach($r as $rr) {
+ $saved[$rr['hash']]['new'] = $rr['id'];
+ }
+ }
+ }
+
+
+ $group_members = $data['group_member'];
+ if($group_members) {
+ foreach($group_members as $group_member) {
+ unset($group_member['id']);
+ $group_member['uid'] = $channel['channel_id'];
+ foreach($saved as $x) {
+ if($x['old'] == $group_member['gid'])
+ $group_member['gid'] = $x['new'];
+ }
+ dbesc_array($group_member);
+ $r = dbq("INSERT INTO group_member (`"
+ . implode("`, `", array_keys($group_member))
+ . "`) VALUES ('"
+ . implode("', '", array_values($group_member))
+ . "')" );
+ }
+ }
+ logger('import step 9');
+ $_SESSION['import_step'] = 9;
+ }
+
+ if(is_array($data['obj']))
+ import_objs($channel,$data['obj']);
+
+ if(is_array($data['likes']))
+ import_likes($channel,$data['likes']);
+
+ if(is_array($data['app']))
+ import_apps($channel,$data['app']);
+
+ if(is_array($data['chatroom']))
+ import_chatrooms($channel,$data['chatroom']);
+
+ if(is_array($data['conv']))
+ import_conv($channel,$data['conv']);
+
+ if(is_array($data['mail']))
+ import_mail($channel,$data['mail']);
+
+ if(is_array($data['event']))
+ import_events($channel,$data['event']);
+
+ if(is_array($data['event_item']))
+ import_items($channel,$data['event_item']);
+
+ if(is_array($data['menu']))
+ import_menus($channel,$data['menu']);
+
+ $addon = array('channel' => $channel,'data' => $data);
+ call_hooks('import_channel',$addon);
+
+ $saved_notification_flags = notifications_off($channel['channel_id']);
+
+ if($import_posts && array_key_exists('item',$data) && $data['item'])
+ import_items($channel,$data['item']);
+
+ notifications_on($channel['channel_id'],$saved_notification_flags);
+
+
+ if(array_key_exists('item_id',$data) && $data['item_id'])
+ import_item_ids($channel,$data['item_id']);
+
+
+ // FIXME - ensure we have a self entry if somebody is trying to pull a fast one
+
+ // send out refresh requests
+ // notify old server that it may no longer be primary.
+
+ proc_run('php','include/notifier.php','location',$channel['channel_id']);
+
+ // This will indirectly perform a refresh_all *and* update the directory
+
+ proc_run('php', 'include/directory.php', $channel['channel_id']);
+
+
+ notice( t('Import completed.') . EOL);
+
+ change_channel($channel['channel_id']);
+
+ unset($_SESSION['import_step']);
+ goaway(z_root() . '/network' );
+
+ }
+
+
+ function post() {
+
+ $account_id = get_account_id();
+ if(! $account_id)
+ return;
+
+ $this->import_account($account_id);
+ }
+
+ function get() {
+
+ if(! get_account_id()) {
+ notice( t('You must be logged in to use this feature.'));
+ return '';
+ }
+
+ $o = replace_macros(get_markup_template('channel_import.tpl'),array(
+ '$title' => t('Import Channel'),
+ '$desc' => t('Use this form to import an existing channel from a different server/hub. You may retrieve the channel identity from the old server/hub via the network or provide an export file.'),
+ '$label_filename' => t('File to Upload'),
+ '$choice' => t('Or provide the old server/hub details'),
+ '$label_old_address' => t('Your old identity address (xyz@example.com)'),
+ '$label_old_email' => t('Your old login email address'),
+ '$label_old_pass' => t('Your old login password'),
+ '$common' => t('For either option, please choose whether to make this hub your new primary address, or whether your old location should continue this role. You will be able to post from either location, but only one can be marked as the primary location for files, photos, and media.'),
+ '$label_import_primary' => t('Make this hub my primary location'),
+ '$label_import_posts' => t('Import existing posts if possible (experimental - limited by available memory'),
+ '$pleasewait' => t('This process may take several minutes to complete. Please submit the form only once and leave this page open until finished.'),
+ '$email' => '',
+ '$pass' => '',
+ '$submit' => t('Submit')
+ ));
+
+ return $o;
+
+ }
+
+}
diff --git a/Zotlabs/Module/Import_items.php b/Zotlabs/Module/Import_items.php
new file mode 100644
index 000000000..a862836c5
--- /dev/null
+++ b/Zotlabs/Module/Import_items.php
@@ -0,0 +1,129 @@
+<?php
+namespace Zotlabs\Module;
+
+require_once('include/import.php');
+
+
+class Import_items extends \Zotlabs\Web\Controller {
+
+ function post() {
+
+ if(! local_channel())
+ return;
+
+ $data = null;
+
+ $src = $_FILES['filename']['tmp_name'];
+ $filename = basename($_FILES['filename']['name']);
+ $filesize = intval($_FILES['filename']['size']);
+ $filetype = $_FILES['filename']['type'];
+
+ if($src) {
+ // This is OS specific and could also fail if your tmpdir isn't very large
+ // mostly used for Diaspora which exports gzipped files.
+
+ if(strpos($filename,'.gz')){
+ @rename($src,$src . '.gz');
+ @system('gunzip ' . escapeshellarg($src . '.gz'));
+ }
+
+ if($filesize) {
+ $data = @file_get_contents($src);
+ }
+ unlink($src);
+ }
+
+ if(! $src) {
+
+ $old_address = ((x($_REQUEST,'old_address')) ? $_REQUEST['old_address'] : '');
+
+ if(! $old_address) {
+ logger('mod_import: nothing to import.');
+ notice( t('Nothing to import.') . EOL);
+ return;
+ }
+
+ $email = ((x($_REQUEST,'email')) ? $_REQUEST['email'] : '');
+ $password = ((x($_REQUEST,'password')) ? $_REQUEST['password'] : '');
+
+ $year = ((x($_REQUEST,'year')) ? $_REQUEST['year'] : '');
+
+ $channelname = substr($old_address,0,strpos($old_address,'@'));
+ $servername = substr($old_address,strpos($old_address,'@')+1);
+
+ $scheme = 'https://';
+ $api_path = '/api/red/channel/export/items?f=&channel=' . $channelname . '&year=' . intval($year);
+ $binary = false;
+ $redirects = 0;
+ $opts = array('http_auth' => $email . ':' . $password);
+ $url = $scheme . $servername . $api_path;
+ $ret = z_fetch_url($url, $binary, $redirects, $opts);
+ if(! $ret['success'])
+ $ret = z_fetch_url('http://' . $servername . $api_path, $binary, $redirects, $opts);
+ if($ret['success'])
+ $data = $ret['body'];
+ else
+ notice( t('Unable to download data from old server') . EOL);
+
+ }
+
+ if(! $data) {
+ logger('mod_import: empty file.');
+ notice( t('Imported file is empty.') . EOL);
+ return;
+ }
+
+ $data = json_decode($data,true);
+
+ // logger('import: data: ' . print_r($data,true));
+ // print_r($data);
+
+
+ if(array_key_exists('compatibility',$data) && array_key_exists('database',$data['compatibility'])) {
+ $v1 = substr($data['compatibility']['database'],-4);
+ $v2 = substr(DB_UPDATE_VERSION,-4);
+ if($v2 > $v1) {
+ $t = sprintf( t('Warning: Database versions differ by %1$d updates.'), $v2 - $v1 );
+ notice($t);
+ }
+ }
+
+ $channel = \App::get_channel();
+
+
+ if(array_key_exists('item',$data) && $data['item']) {
+ import_items($channel,$data['item']);
+ }
+
+ if(array_key_exists('item_id',$data) && $data['item_id']) {
+ import_item_ids($channel,$data['item_id']);
+ }
+
+ info( t('Import completed') . EOL);
+ return;
+ }
+
+
+
+
+ function get() {
+
+ if(! local_channel()) {
+ notice( t('Permission denied') . EOL);
+ return login();
+ }
+
+ $o = replace_macros(get_markup_template('item_import.tpl'),array(
+ '$title' => t('Import Items'),
+ '$desc' => t('Use this form to import existing posts and content from an export file.'),
+ '$label_filename' => t('File to Upload'),
+ '$submit' => t('Submit')
+ ));
+
+ return $o;
+
+ }
+
+
+
+}
diff --git a/Zotlabs/Module/Invite.php b/Zotlabs/Module/Invite.php
new file mode 100644
index 000000000..3d7438484
--- /dev/null
+++ b/Zotlabs/Module/Invite.php
@@ -0,0 +1,152 @@
+<?php
+namespace Zotlabs\Module;
+
+/**
+ * module: invite.php
+ *
+ * send email invitations to join social network
+ *
+ */
+
+
+class Invite extends \Zotlabs\Web\Controller {
+
+ function post() {
+
+ if(! local_channel()) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ check_form_security_token_redirectOnErr('/', 'send_invite');
+
+ $max_invites = intval(get_config('system','max_invites'));
+ if(! $max_invites)
+ $max_invites = 50;
+
+ $current_invites = intval(get_pconfig(local_channel(),'system','sent_invites'));
+ if($current_invites > $max_invites) {
+ notice( t('Total invitation limit exceeded.') . EOL);
+ return;
+ };
+
+
+ $recips = ((x($_POST,'recipients')) ? explode("\n",$_POST['recipients']) : array());
+ $message = ((x($_POST,'message')) ? notags(trim($_POST['message'])) : '');
+
+ $total = 0;
+
+ if(get_config('system','invitation_only')) {
+ $invonly = true;
+ $x = get_pconfig(local_channel(),'system','invites_remaining');
+ if((! $x) && (! is_site_admin()))
+ return;
+ }
+
+ foreach($recips as $recip) {
+
+ $recip = trim($recip);
+ if(! $recip)
+ continue;
+
+ if(! valid_email($recip)) {
+ notice( sprintf( t('%s : Not a valid email address.'), $recip) . EOL);
+ continue;
+ }
+
+ else
+ $nmessage = $message;
+
+ $account = \App::get_account();
+
+
+ $res = mail($recip, sprintf( t('Please join us on $Projectname'), \App::$config['sitename']),
+ $nmessage,
+ "From: " . $account['account_email'] . "\n"
+ . 'Content-type: text/plain; charset=UTF-8' . "\n"
+ . 'Content-transfer-encoding: 8bit' );
+
+ if($res) {
+ $total ++;
+ $current_invites ++;
+ set_pconfig(local_channel(),'system','sent_invites',$current_invites);
+ if($current_invites > $max_invites) {
+ notice( t('Invitation limit exceeded. Please contact your site administrator.') . EOL);
+ return;
+ }
+ }
+ else {
+ notice( sprintf( t('%s : Message delivery failed.'), $recip) . EOL);
+ }
+
+ }
+ notice( sprintf( tt("%d message sent.", "%d messages sent.", $total) , $total) . EOL);
+ return;
+ }
+
+
+ function get() {
+
+ if(! local_channel()) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ $tpl = get_markup_template('invite.tpl');
+ $invonly = false;
+
+ if(get_config('system','invitation_only')) {
+ $invonly = true;
+ $x = get_pconfig(local_channel(),'system','invites_remaining');
+ if((! $x) && (! is_site_admin())) {
+ notice( t('You have no more invitations available') . EOL);
+ return '';
+ }
+ }
+
+ if($invonly && ($x || is_site_admin())) {
+ $invite_code = autoname(8) . rand(1000,9999);
+ $nmessage = str_replace('$invite_code',$invite_code,$message);
+
+ $r = q("INSERT INTO `register` (`hash`,`created`) VALUES ('%s', '%s') ",
+ dbesc($invite_code),
+ dbesc(datetime_convert())
+ );
+
+ if(! is_site_admin()) {
+ $x --;
+ if($x >= 0)
+ set_pconfig(local_channel(),'system','invites_remaining',$x);
+ else
+ return;
+ }
+ }
+
+ $ob = \App::get_observer();
+ if(! $ob)
+ return $o;
+
+ $channel = \App::get_channel();
+
+ $o = replace_macros($tpl, array(
+ '$form_security_token' => get_form_security_token("send_invite"),
+ '$invite' => t('Send invitations'),
+ '$addr_text' => t('Enter email addresses, one per line:'),
+ '$msg_text' => t('Your message:'),
+ '$default_message' => t('Please join my community on $Projectname.') . "\r\n" . "\r\n"
+ . $linktxt
+ . (($invonly) ? "\r\n" . "\r\n" . t('You will need to supply this invitation code:') . " " . $invite_code . "\r\n" . "\r\n" : '')
+ . t('1. Register at any $Projectname location (they are all inter-connected)')
+ . "\r\n" . "\r\n" . z_root() . '/register'
+ . "\r\n" . "\r\n" . t('2. Enter my $Projectname network address into the site searchbar.')
+ . "\r\n" . "\r\n" . $ob['xchan_addr'] . ' (' . t('or visit') . " " . z_root() . '/channel/' . $channel['channel_address'] . ')'
+ . "\r\n" . "\r\n"
+ . t('3. Click [Connect]')
+ . "\r\n" . "\r\n" ,
+ '$submit' => t('Submit')
+ ));
+
+ return $o;
+ }
+
+}
diff --git a/Zotlabs/Module/Item.php b/Zotlabs/Module/Item.php
new file mode 100644
index 000000000..74fbeed67
--- /dev/null
+++ b/Zotlabs/Module/Item.php
@@ -0,0 +1,1265 @@
+<?php
+namespace Zotlabs\Module;
+
+/**
+ *
+ * This is the POST destination for most all locally posted
+ * text stuff. This function handles status, wall-to-wall status,
+ * local comments, and remote coments that are posted on this site
+ * (as opposed to being delivered in a feed).
+ * Also processed here are posts and comments coming through the
+ * statusnet/twitter API.
+ * All of these become an "item" which is our basic unit of
+ * information.
+ * Posts that originate externally or do not fall into the above
+ * posting categories go through item_store() instead of this function.
+ *
+ */
+
+require_once('include/crypto.php');
+require_once('include/enotify.php');
+require_once('include/items.php');
+require_once('include/attach.php');
+
+
+class Item extends \Zotlabs\Web\Controller {
+
+ function post() {
+
+ // This will change. Figure out who the observer is and whether or not
+ // they have permission to post here. Else ignore the post.
+
+ if((! local_channel()) && (! remote_channel()) && (! x($_REQUEST,'commenter')))
+ return;
+
+ require_once('include/security.php');
+
+ $uid = local_channel();
+ $channel = null;
+ $observer = null;
+
+
+ /**
+ * Is this a reply to something?
+ */
+
+ $parent = ((x($_REQUEST,'parent')) ? intval($_REQUEST['parent']) : 0);
+ $parent_mid = ((x($_REQUEST,'parent_mid')) ? trim($_REQUEST['parent_mid']) : '');
+
+ $remote_xchan = ((x($_REQUEST,'remote_xchan')) ? trim($_REQUEST['remote_xchan']) : false);
+ $r = q("select * from xchan where xchan_hash = '%s' limit 1",
+ dbesc($remote_xchan)
+ );
+ if($r)
+ $remote_observer = $r[0];
+ else
+ $remote_xchan = $remote_observer = false;
+
+ $profile_uid = ((x($_REQUEST,'profile_uid')) ? intval($_REQUEST['profile_uid']) : 0);
+ require_once('include/identity.php');
+ $sys = get_sys_channel();
+ if($sys && $profile_uid && ($sys['channel_id'] == $profile_uid) && is_site_admin()) {
+ $uid = intval($sys['channel_id']);
+ $channel = $sys;
+ $observer = $sys;
+ }
+
+ if(x($_REQUEST,'dropitems')) {
+ require_once('include/items.php');
+ $arr_drop = explode(',',$_REQUEST['dropitems']);
+ drop_items($arr_drop);
+ $json = array('success' => 1);
+ echo json_encode($json);
+ killme();
+ }
+
+ call_hooks('post_local_start', $_REQUEST);
+
+ // logger('postvars ' . print_r($_REQUEST,true), LOGGER_DATA);
+
+ $api_source = ((x($_REQUEST,'api_source') && $_REQUEST['api_source']) ? true : false);
+
+ $consensus = intval($_REQUEST['consensus']);
+
+ // 'origin' (if non-zero) indicates that this network is where the message originated,
+ // for the purpose of relaying comments to other conversation members.
+ // If using the API from a device (leaf node) you must set origin to 1 (default) or leave unset.
+ // If the API is used from another network with its own distribution
+ // and deliveries, you may wish to set origin to 0 or false and allow the other
+ // network to relay comments.
+
+ // If you are unsure, it is prudent (and important) to leave it unset.
+
+ $origin = (($api_source && array_key_exists('origin',$_REQUEST)) ? intval($_REQUEST['origin']) : 1);
+
+ // To represent message-ids on other networks - this will create an item_id record
+
+ $namespace = (($api_source && array_key_exists('namespace',$_REQUEST)) ? strip_tags($_REQUEST['namespace']) : '');
+ $remote_id = (($api_source && array_key_exists('remote_id',$_REQUEST)) ? strip_tags($_REQUEST['remote_id']) : '');
+
+ $owner_hash = null;
+
+ $message_id = ((x($_REQUEST,'message_id') && $api_source) ? strip_tags($_REQUEST['message_id']) : '');
+ $created = ((x($_REQUEST,'created')) ? datetime_convert(date_default_timezone_get(),'UTC',$_REQUEST['created']) : datetime_convert());
+ $post_id = ((x($_REQUEST,'post_id')) ? intval($_REQUEST['post_id']) : 0);
+ $app = ((x($_REQUEST,'source')) ? strip_tags($_REQUEST['source']) : '');
+ $return_path = ((x($_REQUEST,'return')) ? $_REQUEST['return'] : '');
+ $preview = ((x($_REQUEST,'preview')) ? intval($_REQUEST['preview']) : 0);
+ $categories = ((x($_REQUEST,'category')) ? escape_tags($_REQUEST['category']) : '');
+ $webpage = ((x($_REQUEST,'webpage')) ? intval($_REQUEST['webpage']) : 0);
+ $pagetitle = ((x($_REQUEST,'pagetitle')) ? escape_tags(urlencode($_REQUEST['pagetitle'])) : '');
+ $layout_mid = ((x($_REQUEST,'layout_mid')) ? escape_tags($_REQUEST['layout_mid']): '');
+ $plink = ((x($_REQUEST,'permalink')) ? escape_tags($_REQUEST['permalink']) : '');
+ $obj_type = ((x($_REQUEST,'obj_type')) ? escape_tags($_REQUEST['obj_type']) : ACTIVITY_OBJ_NOTE);
+
+ // allow API to bulk load a bunch of imported items with sending out a bunch of posts.
+ $nopush = ((x($_REQUEST,'nopush')) ? intval($_REQUEST['nopush']) : 0);
+
+ /*
+ * Check service class limits
+ */
+ if ($uid && !(x($_REQUEST,'parent')) && !(x($_REQUEST,'post_id'))) {
+ $ret = $this->item_check_service_class($uid,(($_REQUEST['webpage'] == ITEM_TYPE_WEBPAGE) ? true : false));
+ if (!$ret['success']) {
+ notice( t($ret['message']) . EOL) ;
+ if(x($_REQUEST,'return'))
+ goaway(z_root() . "/" . $return_path );
+ killme();
+ }
+ }
+
+ if($pagetitle) {
+ require_once('library/urlify/URLify.php');
+ $pagetitle = strtolower(\URLify::transliterate($pagetitle));
+ }
+
+
+ $item_flags = $item_restrict = 0;
+
+ $route = '';
+ $parent_item = null;
+ $parent_contact = null;
+ $thr_parent = '';
+ $parid = 0;
+ $r = false;
+
+ if($parent || $parent_mid) {
+
+ if(! x($_REQUEST,'type'))
+ $_REQUEST['type'] = 'net-comment';
+
+ if($obj_type == ACTIVITY_OBJ_POST)
+ $obj_type = ACTIVITY_OBJ_COMMENT;
+
+ if($parent) {
+ $r = q("SELECT * FROM `item` WHERE `id` = %d LIMIT 1",
+ intval($parent)
+ );
+ }
+ elseif($parent_mid && $uid) {
+ // This is coming from an API source, and we are logged in
+ $r = q("SELECT * FROM `item` WHERE `mid` = '%s' AND `uid` = %d LIMIT 1",
+ dbesc($parent_mid),
+ intval($uid)
+ );
+ }
+ // if this isn't the real parent of the conversation, find it
+ if($r !== false && count($r)) {
+ $parid = $r[0]['parent'];
+ $parent_mid = $r[0]['mid'];
+ if($r[0]['id'] != $r[0]['parent']) {
+ $r = q("SELECT * FROM `item` WHERE `id` = `parent` AND `parent` = %d LIMIT 1",
+ intval($parid)
+ );
+ }
+ }
+
+ if(($r === false) || (! count($r))) {
+ notice( t('Unable to locate original post.') . EOL);
+ if(x($_REQUEST,'return'))
+ goaway(z_root() . "/" . $return_path );
+ killme();
+ }
+
+ // can_comment_on_post() needs info from the following xchan_query
+ xchan_query($r);
+
+ $parent_item = $r[0];
+ $parent = $r[0]['id'];
+
+ // multi-level threading - preserve the info but re-parent to our single level threading
+
+ $thr_parent = $parent_mid;
+
+ $route = $parent_item['route'];
+
+ }
+
+ if(! $observer)
+ $observer = \App::get_observer();
+
+ if($parent) {
+ logger('mod_item: item_post parent=' . $parent);
+ $can_comment = false;
+ if((array_key_exists('owner',$parent_item)) && intval($parent_item['owner']['abook_self']))
+ $can_comment = perm_is_allowed($profile_uid,$observer['xchan_hash'],'post_comments');
+ else
+ $can_comment = can_comment_on_post($observer['xchan_hash'],$parent_item);
+
+ if(! $can_comment) {
+ notice( t('Permission denied.') . EOL) ;
+ if(x($_REQUEST,'return'))
+ goaway(z_root() . "/" . $return_path );
+ killme();
+ }
+ }
+ else {
+ if(! perm_is_allowed($profile_uid,$observer['xchan_hash'],($webpage) ? 'write_pages' : 'post_wall')) {
+ notice( t('Permission denied.') . EOL) ;
+ if(x($_REQUEST,'return'))
+ goaway(z_root() . "/" . $return_path );
+ killme();
+ }
+ }
+
+
+ // is this an edited post?
+
+ $orig_post = null;
+
+ if($namespace && $remote_id) {
+ // It wasn't an internally generated post - see if we've got an item matching this remote service id
+ $i = q("select iid from item_id where service = '%s' and sid = '%s' limit 1",
+ dbesc($namespace),
+ dbesc($remote_id)
+ );
+ if($i)
+ $post_id = $i[0]['iid'];
+ }
+
+ $iconfig = null;
+
+ if($post_id) {
+ $i = q("SELECT * FROM `item` WHERE `uid` = %d AND `id` = %d LIMIT 1",
+ intval($profile_uid),
+ intval($post_id)
+ );
+ if(! count($i))
+ killme();
+ $orig_post = $i[0];
+ $iconfig = q("select * from iconfig where iid = %d",
+ intval($post_id)
+ );
+ }
+
+
+ if(! $channel) {
+ if($uid && $uid == $profile_uid) {
+ $channel = \App::get_channel();
+ }
+ else {
+ // posting as yourself but not necessarily to a channel you control
+ $r = q("select * from channel left join account on channel_account_id = account_id where channel_id = %d LIMIT 1",
+ intval($profile_uid)
+ );
+ if($r)
+ $channel = $r[0];
+ }
+ }
+
+
+ if(! $channel) {
+ logger("mod_item: no channel.");
+ if(x($_REQUEST,'return'))
+ goaway(z_root() . "/" . $return_path );
+ killme();
+ }
+
+ $owner_xchan = null;
+
+ $r = q("select * from xchan where xchan_hash = '%s' limit 1",
+ dbesc($channel['channel_hash'])
+ );
+ if($r && count($r)) {
+ $owner_xchan = $r[0];
+ }
+ else {
+ logger("mod_item: no owner.");
+ if(x($_REQUEST,'return'))
+ goaway(z_root() . "/" . $return_path );
+ killme();
+ }
+
+ $walltowall = false;
+ $walltowall_comment = false;
+
+ if($remote_xchan)
+ $observer = $remote_observer;
+
+ if($observer) {
+ logger('mod_item: post accepted from ' . $observer['xchan_name'] . ' for ' . $owner_xchan['xchan_name'], LOGGER_DEBUG);
+
+ // wall-to-wall detection.
+ // For top-level posts, if the author and owner are different it's a wall-to-wall
+ // For comments, We need to additionally look at the parent and see if it's a wall post that originated locally.
+
+ if($observer['xchan_name'] != $owner_xchan['xchan_name']) {
+ if(($parent_item) && ($parent_item['item_wall'] && $parent_item['item_origin'])) {
+ $walltowall_comment = true;
+ $walltowall = true;
+ }
+ if(! $parent) {
+ $walltowall = true;
+ }
+ }
+ }
+
+ $acl = new \Zotlabs\Access\AccessList($channel);
+
+
+ $public_policy = ((x($_REQUEST,'public_policy')) ? escape_tags($_REQUEST['public_policy']) : map_scope($channel['channel_r_stream'],true));
+ if($webpage)
+ $public_policy = '';
+ if($public_policy)
+ $private = 1;
+
+ if($orig_post) {
+ $private = 0;
+ // webpages are allowed to change ACLs after the fact. Normal conversation items aren't.
+ if($webpage) {
+ $acl->set_from_array($_REQUEST);
+ }
+ else {
+ $acl->set($orig_post);
+ $public_policy = $orig_post['public_policy'];
+ $private = $orig_post['item_private'];
+ }
+
+ if($private || $public_policy || $acl->is_private())
+ $private = 1;
+
+
+ $location = $orig_post['location'];
+ $coord = $orig_post['coord'];
+ $verb = $orig_post['verb'];
+ $app = $orig_post['app'];
+ $title = escape_tags(trim($_REQUEST['title']));
+ $body = trim($_REQUEST['body']);
+ $item_flags = $orig_post['item_flags'];
+
+ $item_origin = $orig_post['item_origin'];
+ $item_unseen = $orig_post['item_unseen'];
+ $item_starred = $orig_post['item_starred'];
+ $item_uplink = $orig_post['item_uplink'];
+ $item_consensus = $orig_post['item_consensus'];
+ $item_wall = $orig_post['item_wall'];
+ $item_thread_top = $orig_post['item_thread_top'];
+ $item_notshown = $orig_post['item_notshown'];
+ $item_nsfw = $orig_post['item_nsfw'];
+ $item_relay = $orig_post['item_relay'];
+ $item_mentionsme = $orig_post['item_mentionsme'];
+ $item_nocomment = $orig_post['item_nocomment'];
+ $item_obscured = $orig_post['item_obscured'];
+ $item_verified = $orig_post['item_verified'];
+ $item_retained = $orig_post['item_retained'];
+ $item_rss = $orig_post['item_rss'];
+ $item_deleted = $orig_post['item_deleted'];
+ $item_type = $orig_post['item_type'];
+ $item_hidden = $orig_post['item_hidden'];
+ $item_unpublished = $orig_post['item_unpublished'];
+ $item_delayed = $orig_post['item_delayed'];
+ $item_pending_remove = $orig_post['item_pending_remove'];
+ $item_blocked = $orig_post['item_blocked'];
+
+
+
+ $postopts = $orig_post['postopts'];
+ $created = $orig_post['created'];
+ $mid = $orig_post['mid'];
+ $parent_mid = $orig_post['parent_mid'];
+ $plink = $orig_post['plink'];
+
+ }
+ else {
+ if(! $walltowall) {
+ if((array_key_exists('contact_allow',$_REQUEST))
+ || (array_key_exists('group_allow',$_REQUEST))
+ || (array_key_exists('contact_deny',$_REQUEST))
+ || (array_key_exists('group_deny',$_REQUEST))) {
+ $acl->set_from_array($_REQUEST);
+ }
+ elseif(! $api_source) {
+
+ // if no ACL has been defined and we aren't using the API, the form
+ // didn't send us any parameters. This means there's no ACL or it has
+ // been reset to the default audience.
+ // If $api_source is set and there are no ACL parameters, we default
+ // to the channel permissions which were set in the ACL contructor.
+
+ $acl->set(array('allow_cid' => '', 'allow_gid' => '', 'deny_cid' => '', 'deny_gid' => ''));
+ }
+ }
+
+
+ $location = notags(trim($_REQUEST['location']));
+ $coord = notags(trim($_REQUEST['coord']));
+ $verb = notags(trim($_REQUEST['verb']));
+ $title = escape_tags(trim($_REQUEST['title']));
+ $body = trim($_REQUEST['body']);
+ $body .= trim($_REQUEST['attachment']);
+ $postopts = '';
+
+ $private = intval($acl->is_private() || ($public_policy));
+
+ // If this is a comment, set the permissions from the parent.
+
+ if($parent_item) {
+ $private = 0;
+ $acl->set($parent_item);
+ $private = intval($acl->is_private() || $parent_item['item_private']);
+ $public_policy = $parent_item['public_policy'];
+ $owner_hash = $parent_item['owner_xchan'];
+ }
+
+ if(! strlen($body)) {
+ if($preview)
+ killme();
+ info( t('Empty post discarded.') . EOL );
+ if(x($_REQUEST,'return'))
+ goaway(z_root() . "/" . $return_path );
+ killme();
+ }
+ }
+
+
+ $expires = NULL_DATE;
+
+ if(feature_enabled($profile_uid,'content_expire')) {
+ if(x($_REQUEST,'expire')) {
+ $expires = datetime_convert(date_default_timezone_get(),'UTC', $_REQUEST['expire']);
+ if($expires <= datetime_convert())
+ $expires = NULL_DATE;
+ }
+ }
+
+ $mimetype = notags(trim($_REQUEST['mimetype']));
+ if(! $mimetype)
+ $mimetype = 'text/bbcode';
+
+ if($preview) {
+ $body = z_input_filter($profile_uid,$body,$mimetype);
+ }
+
+
+ // Verify ability to use html or php!!!
+
+ $execflag = false;
+
+ if($mimetype !== 'text/bbcode') {
+ $z = q("select account_id, account_roles, channel_pageflags from account left join channel on channel_account_id = account_id where channel_id = %d limit 1",
+ intval($profile_uid)
+ );
+ if($z && (($z[0]['account_roles'] & ACCOUNT_ROLE_ALLOWCODE) || ($z[0]['channel_pageflags'] & PAGE_ALLOWCODE))) {
+ if($uid && (get_account_id() == $z[0]['account_id'])) {
+ $execflag = true;
+ }
+ else {
+ notice( t('Executable content type not permitted to this channel.') . EOL);
+ if(x($_REQUEST,'return'))
+ goaway(z_root() . "/" . $return_path );
+ killme();
+ }
+ }
+ }
+
+ $gacl = $acl->get();
+ $str_contact_allow = $gacl['allow_cid'];
+ $str_group_allow = $gacl['allow_gid'];
+ $str_contact_deny = $gacl['deny_cid'];
+ $str_group_deny = $gacl['deny_gid'];
+
+ if($mimetype === 'text/bbcode') {
+
+ require_once('include/text.php');
+
+ // Markdown doesn't work correctly. Do not re-enable unless you're willing to fix it and support it.
+
+ // Sample that will probably give you grief - you must preserve the linebreaks
+ // and provide the correct markdown interpretation and you cannot allow unfiltered HTML
+
+ // Markdown
+ // ========
+ //
+ // **bold** abcde
+ // fghijkl
+ // *italic*
+ // <img src="javascript:alert('hacked');" />
+
+ // if($uid && $uid == $profile_uid && feature_enabled($uid,'markdown')) {
+ // require_once('include/bb2diaspora.php');
+ // $body = escape_tags(trim($body));
+ // $body = str_replace("\n",'<br />', $body);
+ // $body = preg_replace_callback('/\[share(.*?)\]/ism','\share_shield',$body);
+ // $body = diaspora2bb($body,true);
+ // $body = preg_replace_callback('/\[share(.*?)\]/ism','\share_unshield',$body);
+ // }
+
+ // BBCODE alert: the following functions assume bbcode input
+ // and will require alternatives for alternative content-types (text/html, text/markdown, text/plain, etc.)
+ // we may need virtual or template classes to implement the possible alternatives
+
+ // Work around doubled linefeeds in Tinymce 3.5b2
+ // First figure out if it's a status post that would've been
+ // created using tinymce. Otherwise leave it alone.
+
+ $plaintext = true;
+
+ // $plaintext = ((feature_enabled($profile_uid,'richtext')) ? false : true);
+ // if((! $parent) && (! $api_source) && (! $plaintext)) {
+ // $body = fix_mce_lf($body);
+ // }
+
+
+
+ // If we're sending a private top-level message with a single @-taggable channel as a recipient, @-tag it, if our pconfig is set.
+
+
+ if((! $parent) && (get_pconfig($profile_uid,'system','tagifonlyrecip')) && (substr_count($str_contact_allow,'<') == 1) && ($str_group_allow == '') && ($str_contact_deny == '') && ($str_group_deny == '')) {
+ $x = q("select abook_id, abook_their_perms from abook where abook_xchan = '%s' and abook_channel = %d limit 1",
+ dbesc(str_replace(array('<','>'),array('',''),$str_contact_allow)),
+ intval($profile_uid)
+ );
+ if($x && ($x[0]['abook_their_perms'] & PERMS_W_TAGWALL))
+ $body .= "\n\n@group+" . $x[0]['abook_id'] . "\n";
+ }
+
+ /**
+ * fix naked links by passing through a callback to see if this is a red site
+ * (already known to us) which will get a zrl, otherwise link with url, add bookmark tag to both.
+ * First protect any url inside certain bbcode tags so we don't double link it.
+ */
+
+
+ $body = preg_replace_callback('/\[code(.*?)\[\/(code)\]/ism','\red_escape_codeblock',$body);
+ $body = preg_replace_callback('/\[url(.*?)\[\/(url)\]/ism','\red_escape_codeblock',$body);
+ $body = preg_replace_callback('/\[zrl(.*?)\[\/(zrl)\]/ism','\red_escape_codeblock',$body);
+
+ $body = preg_replace_callback("/([^\]\='".'"'."\/]|^|\#\^)(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\@\_\~\#\%\$\!\+\,]+)/ism", '\red_zrl_callback', $body);
+
+ $body = preg_replace_callback('/\[\$b64zrl(.*?)\[\/(zrl)\]/ism','\red_unescape_codeblock',$body);
+ $body = preg_replace_callback('/\[\$b64url(.*?)\[\/(url)\]/ism','\red_unescape_codeblock',$body);
+ $body = preg_replace_callback('/\[\$b64code(.*?)\[\/(code)\]/ism','\red_unescape_codeblock',$body);
+
+
+ // fix any img tags that should be zmg
+
+ $body = preg_replace_callback('/\[img(.*?)\](.*?)\[\/img\]/ism','\red_zrlify_img_callback',$body);
+
+
+ $body = bb_translate_video($body);
+
+ /**
+ * Fold multi-line [code] sequences
+ */
+
+ $body = preg_replace('/\[\/code\]\s*\[code\]/ism',"\n",$body);
+
+ $body = scale_external_images($body,false);
+
+
+ // Look for tags and linkify them
+ $results = linkify_tags($a, $body, ($uid) ? $uid : $profile_uid);
+
+ if($results) {
+
+ // Set permissions based on tag replacements
+ set_linkified_perms($results, $str_contact_allow, $str_group_allow, $profile_uid, $parent_item, $private);
+
+ $post_tags = array();
+ foreach($results as $result) {
+ $success = $result['success'];
+ if($success['replaced']) {
+ $post_tags[] = array(
+ 'uid' => $profile_uid,
+ 'type' => $success['termtype'],
+ 'otype' => TERM_OBJ_POST,
+ 'term' => $success['term'],
+ 'url' => $success['url']
+ );
+ }
+ }
+ }
+
+
+ /**
+ *
+ * When a photo was uploaded into the message using the (profile wall) ajax
+ * uploader, The permissions are initially set to disallow anybody but the
+ * owner from seeing it. This is because the permissions may not yet have been
+ * set for the post. If it's private, the photo permissions should be set
+ * appropriately. But we didn't know the final permissions on the post until
+ * now. So now we'll look for links of uploaded photos and attachments that are in the
+ * post and set them to the same permissions as the post itself.
+ *
+ * If the post was end-to-end encrypted we can't find images and attachments in the body,
+ * use our media_str input instead which only contains these elements - but only do this
+ * when encrypted content exists because the photo/attachment may have been removed from
+ * the post and we should keep it private. If it's encrypted we have no way of knowing
+ * so we'll set the permissions regardless and realise that the media may not be
+ * referenced in the post.
+ *
+ * What is preventing us from being able to upload photos into comments is dealing with
+ * the photo and attachment permissions, since we don't always know who was in the
+ * distribution for the top level post.
+ *
+ * We might be able to provide this functionality with a lot of fiddling:
+ * - if the top level post is public (make the photo public)
+ * - if the top level post was written by us or a wall post that belongs to us (match the top level post)
+ * - if the top level post has privacy mentions, add those to the permissions.
+ * - otherwise disallow the photo *or* make the photo public. This is the part that gets messy.
+ */
+
+ if(! $preview) {
+ $this->fix_attached_photo_permissions($profile_uid,$owner_xchan['xchan_hash'],((strpos($body,'[/crypt]')) ? $_POST['media_str'] : $body),$str_contact_allow,$str_group_allow,$str_contact_deny,$str_group_deny);
+
+ $this->fix_attached_file_permissions($channel,$observer['xchan_hash'],((strpos($body,'[/crypt]')) ? $_POST['media_str'] : $body),$str_contact_allow,$str_group_allow,$str_contact_deny,$str_group_deny);
+
+ }
+
+
+ $attachments = '';
+ $match = false;
+
+ if(preg_match_all('/(\[attachment\](.*?)\[\/attachment\])/',$body,$match)) {
+ $attachments = array();
+ $i = 0;
+ foreach($match[2] as $mtch) {
+ $attach_link = '';
+ $hash = substr($mtch,0,strpos($mtch,','));
+ $rev = intval(substr($mtch,strpos($mtch,',')));
+ $r = attach_by_hash_nodata($hash,$rev);
+ if($r['success']) {
+ $attachments[] = array(
+ 'href' => z_root() . '/attach/' . $r['data']['hash'],
+ 'length' => $r['data']['filesize'],
+ 'type' => $r['data']['filetype'],
+ 'title' => urlencode($r['data']['filename']),
+ 'revision' => $r['data']['revision']
+ );
+ }
+ $ext = substr($r['data']['filename'],strrpos($r['data']['filename'],'.'));
+ if(strpos($r['data']['filetype'],'audio/') !== false)
+ $attach_link = '[audio]' . z_root() . '/attach/' . $r['data']['hash'] . '/' . $r['data']['revision'] . (($ext) ? $ext : '') . '[/audio]';
+ elseif(strpos($r['data']['filetype'],'video/') !== false)
+ $attach_link = '[video]' . z_root() . '/attach/' . $r['data']['hash'] . '/' . $r['data']['revision'] . (($ext) ? $ext : '') . '[/video]';
+ $body = str_replace($match[1][$i],$attach_link,$body);
+ $i++;
+ }
+ }
+
+ }
+
+ // BBCODE end alert
+
+ if(strlen($categories)) {
+ $cats = explode(',',$categories);
+ foreach($cats as $cat) {
+ $post_tags[] = array(
+ 'uid' => $profile_uid,
+ 'type' => TERM_CATEGORY,
+ 'otype' => TERM_OBJ_POST,
+ 'term' => trim($cat),
+ 'url' => $owner_xchan['xchan_url'] . '?f=&cat=' . urlencode(trim($cat))
+ );
+ }
+ }
+
+ if($orig_post) {
+ // preserve original tags
+ $t = q("select * from term where oid = %d and otype = %d and uid = %d and type in ( %d, %d, %d )",
+ intval($orig_post['id']),
+ intval(TERM_OBJ_POST),
+ intval($profile_uid),
+ intval(TERM_UNKNOWN),
+ intval(TERM_FILE),
+ intval(TERM_COMMUNITYTAG)
+ );
+ if($t) {
+ foreach($t as $t1) {
+ $post_tags[] = array(
+ 'uid' => $profile_uid,
+ 'type' => $t1['type'],
+ 'otype' => TERM_OBJ_POST,
+ 'term' => $t1['term'],
+ 'url' => $t1['url'],
+ );
+ }
+ }
+ }
+
+
+ $item_unseen = ((local_channel() != $profile_uid) ? 1 : 0);
+ $item_wall = (($post_type === 'wall' || $post_type === 'wall-comment') ? 1 : 0);
+ $item_origin = (($origin) ? 1 : 0);
+ $item_consensus = (($consensus) ? 1 : 0);
+
+
+ // determine if this is a wall post
+
+ if($parent) {
+ $item_wall = $parent_item['item_wall'];
+ }
+ else {
+ if(! $webpage) {
+ $item_wall = 1;
+ }
+ }
+
+
+ if($moderated)
+ $item_blocked = ITEM_MODERATED;
+
+
+ if(! strlen($verb))
+ $verb = ACTIVITY_POST ;
+
+ $notify_type = (($parent) ? 'comment-new' : 'wall-new' );
+
+ if(! $mid) {
+ $mid = (($message_id) ? $message_id : item_message_id());
+ }
+ if(! $parent_mid) {
+ $parent_mid = $mid;
+ }
+
+ if($parent_item)
+ $parent_mid = $parent_item['mid'];
+
+ // Fallback so that we alway have a thr_parent
+
+ if(!$thr_parent)
+ $thr_parent = $mid;
+
+ $datarray = array();
+
+ $item_thread_top = ((! $parent) ? 1 : 0);
+
+ if ((! $plink) && ($item_thread_top)) {
+ $plink = z_root() . '/channel/' . $channel['channel_address'] . '/?f=&mid=' . $mid;
+ }
+
+
+
+
+
+ $datarray['aid'] = $channel['channel_account_id'];
+ $datarray['uid'] = $profile_uid;
+
+ $datarray['owner_xchan'] = (($owner_hash) ? $owner_hash : $owner_xchan['xchan_hash']);
+ $datarray['author_xchan'] = $observer['xchan_hash'];
+ $datarray['created'] = $created;
+ $datarray['edited'] = (($orig_post) ? datetime_convert() : $created);
+ $datarray['expires'] = $expires;
+ $datarray['commented'] = (($orig_post) ? datetime_convert() : $created);
+ $datarray['received'] = (($orig_post) ? datetime_convert() : $created);
+ $datarray['changed'] = (($orig_post) ? datetime_convert() : $created);
+ $datarray['mid'] = $mid;
+ $datarray['parent_mid'] = $parent_mid;
+ $datarray['mimetype'] = $mimetype;
+ $datarray['title'] = $title;
+ $datarray['body'] = $body;
+ $datarray['app'] = $app;
+ $datarray['location'] = $location;
+ $datarray['coord'] = $coord;
+ $datarray['verb'] = $verb;
+ $datarray['obj_type'] = $obj_type;
+ $datarray['allow_cid'] = $str_contact_allow;
+ $datarray['allow_gid'] = $str_group_allow;
+ $datarray['deny_cid'] = $str_contact_deny;
+ $datarray['deny_gid'] = $str_group_deny;
+ $datarray['item_private'] = $private;
+ $datarray['item_wall'] = $item_wall;
+ $datarray['attach'] = $attachments;
+ $datarray['thr_parent'] = $thr_parent;
+ $datarray['postopts'] = $postopts;
+ $datarray['item_unseen'] = $item_unseen;
+ $datarray['item_wall'] = $item_wall;
+ $datarray['item_origin'] = $item_origin;
+ $datarray['item_type'] = $webpage;
+ $datarray['item_thread_top'] = $item_thread_top;
+ $datarray['item_unseen'] = $item_unseen;
+ $datarray['item_starred'] = $item_starred;
+ $datarray['item_uplink'] = $item_uplink;
+ $datarray['item_consensus'] = $item_consensus;
+ $datarray['item_notshown'] = $item_notshown;
+ $datarray['item_nsfw'] = $item_nsfw;
+ $datarray['item_relay'] = $item_relay;
+ $datarray['item_mentionsme'] = $item_mentionsme;
+ $datarray['item_nocomment'] = $item_nocomment;
+ $datarray['item_obscured'] = $item_obscured;
+ $datarray['item_verified'] = $item_verified;
+ $datarray['item_retained'] = $item_retained;
+ $datarray['item_rss'] = $item_rss;
+ $datarray['item_deleted'] = $item_deleted;
+ $datarray['item_hidden'] = $item_hidden;
+ $datarray['item_unpublished'] = $item_unpublished;
+ $datarray['item_delayed'] = $item_delayed;
+ $datarray['item_pending_remove'] = $item_pending_remove;
+ $datarray['item_blocked'] = $item_blocked;
+
+ $datarray['layout_mid'] = $layout_mid;
+ $datarray['public_policy'] = $public_policy;
+ $datarray['comment_policy'] = map_scope($channel['channel_w_comment']);
+ $datarray['term'] = $post_tags;
+ $datarray['plink'] = $plink;
+ $datarray['route'] = $route;
+
+ if($iconfig)
+ $datarray['iconfig'] = $iconfig;
+
+ // preview mode - prepare the body for display and send it via json
+
+ if($preview) {
+ require_once('include/conversation.php');
+
+ $datarray['owner'] = $owner_xchan;
+ $datarray['author'] = $observer;
+ $datarray['attach'] = json_encode($datarray['attach']);
+ $o = conversation($a,array($datarray),'search',false,'preview');
+ // logger('preview: ' . $o, LOGGER_DEBUG);
+ echo json_encode(array('preview' => $o));
+ killme();
+ }
+ if($orig_post)
+ $datarray['edit'] = true;
+
+ if(feature_enabled($profile_uid,'suppress_duplicates') && (! $orig_post)) {
+
+ $z = q("select created from item where uid = %d and body = '%s'",
+ intval($profile_uid),
+ dbesc($body)
+ );
+
+ if($z) {
+ foreach($z as $zz) {
+ if($zz['created'] > datetime_convert('UTC','UTC', 'now - 2 minutes')) {
+ $datarray['cancel'] = 1;
+ notice( t('Duplicate post suppressed.') . EOL);
+ logger('Duplicate post. Faking plugin cancel.');
+ }
+ }
+ }
+ }
+
+ call_hooks('post_local',$datarray);
+
+ if(x($datarray,'cancel')) {
+ logger('mod_item: post cancelled by plugin or duplicate suppressed.');
+ if($return_path)
+ goaway(z_root() . "/" . $return_path);
+
+ $json = array('cancel' => 1);
+ $json['reload'] = z_root() . '/' . $_REQUEST['jsreload'];
+ echo json_encode($json);
+ killme();
+ }
+
+
+ if(mb_strlen($datarray['title']) > 255)
+ $datarray['title'] = mb_substr($datarray['title'],0,255);
+
+ if(array_key_exists('item_private',$datarray) && $datarray['item_private']) {
+
+ $datarray['body'] = trim(z_input_filter($datarray['uid'],$datarray['body'],$datarray['mimetype']));
+
+ if($uid) {
+ if($channel['channel_hash'] === $datarray['author_xchan']) {
+ $datarray['sig'] = base64url_encode(rsa_sign($datarray['body'],$channel['channel_prvkey']));
+ $datarray['item_verified'] = 1;
+ }
+ }
+ }
+
+ if($orig_post) {
+ $datarray['id'] = $post_id;
+
+ item_store_update($datarray,$execflag);
+
+ update_remote_id($channel,$post_id,$webpage,$pagetitle,$namespace,$remote_id,$mid);
+
+ if(! $parent) {
+ $r = q("select * from item where id = %d",
+ intval($post_id)
+ );
+ if($r) {
+ xchan_query($r);
+ $sync_item = fetch_post_tags($r);
+ $rid = q("select * from item_id where iid = %d",
+ intval($post_id)
+ );
+ build_sync_packet($uid,array('item' => array(encode_item($sync_item[0],true)),'item_id' => $rid));
+ }
+ }
+ if(! $nopush)
+ proc_run('php', "include/notifier.php", 'edit_post', $post_id);
+
+ if((x($_REQUEST,'return')) && strlen($return_path)) {
+ logger('return: ' . $return_path);
+ goaway(z_root() . "/" . $return_path );
+ }
+ killme();
+ }
+ else
+ $post_id = 0;
+
+ $post = item_store($datarray,$execflag);
+
+ $post_id = $post['item_id'];
+
+ if($post_id) {
+ logger('mod_item: saved item ' . $post_id);
+
+ if($parent) {
+
+ // only send comment notification if this is a wall-to-wall comment,
+ // otherwise it will happen during delivery
+
+ if(($datarray['owner_xchan'] != $datarray['author_xchan']) && (intval($parent_item['item_wall']))) {
+ notification(array(
+ 'type' => NOTIFY_COMMENT,
+ 'from_xchan' => $datarray['author_xchan'],
+ 'to_xchan' => $datarray['owner_xchan'],
+ 'item' => $datarray,
+ 'link' => z_root() . '/display/' . $datarray['mid'],
+ 'verb' => ACTIVITY_POST,
+ 'otype' => 'item',
+ 'parent' => $parent,
+ 'parent_mid' => $parent_item['mid']
+ ));
+
+ }
+ }
+ else {
+ $parent = $post_id;
+
+ if(($datarray['owner_xchan'] != $datarray['author_xchan']) && ($datarray['item_type'] == ITEM_TYPE_POST)) {
+ notification(array(
+ 'type' => NOTIFY_WALL,
+ 'from_xchan' => $datarray['author_xchan'],
+ 'to_xchan' => $datarray['owner_xchan'],
+ 'item' => $datarray,
+ 'link' => z_root() . '/display/' . $datarray['mid'],
+ 'verb' => ACTIVITY_POST,
+ 'otype' => 'item'
+ ));
+ }
+
+ if($uid && $uid == $profile_uid && (is_item_normal($datarray))) {
+ q("update channel set channel_lastpost = '%s' where channel_id = %d",
+ dbesc(datetime_convert()),
+ intval($uid)
+ );
+ }
+ }
+
+ // photo comments turn the corresponding item visible to the profile wall
+ // This way we don't see every picture in your new photo album posted to your wall at once.
+ // They will show up as people comment on them.
+
+ if(intval($parent_item['item_hidden'])) {
+ $r = q("UPDATE item SET item_hidden = 0 WHERE id = %d",
+ intval($parent_item['id'])
+ );
+ }
+ }
+ else {
+ logger('mod_item: unable to retrieve post that was just stored.');
+ notice( t('System error. Post not saved.') . EOL);
+ goaway(z_root() . "/" . $return_path );
+ // NOTREACHED
+ }
+
+
+ update_remote_id($channel,$post_id,$webpage,$pagetitle,$namespace,$remote_id,$mid);
+
+ if(($parent) && ($parent != $post_id)) {
+ // Store the comment signature information in case we need to relay to Diaspora
+ //$ditem = $datarray;
+ //$ditem['author'] = $observer;
+ //store_diaspora_comment_sig($ditem,$channel,$parent_item, $post_id, (($walltowall_comment) ? 1 : 0));
+ }
+ else {
+ $r = q("select * from item where id = %d",
+ intval($post_id)
+ );
+ if($r) {
+ xchan_query($r);
+ $sync_item = fetch_post_tags($r);
+ $rid = q("select * from item_id where iid = %d",
+ intval($post_id)
+ );
+ build_sync_packet($uid,array('item' => array(encode_item($sync_item[0],true)),'item_id' => $rid));
+ }
+ }
+
+ $datarray['id'] = $post_id;
+ $datarray['llink'] = z_root() . '/display/' . $channel['channel_address'] . '/' . $post_id;
+
+ call_hooks('post_local_end', $datarray);
+
+ if(! $nopush)
+ proc_run('php', 'include/notifier.php', $notify_type, $post_id);
+
+ logger('post_complete');
+
+
+
+
+
+
+ // figure out how to return, depending on from whence we came
+
+ if($api_source)
+ return $post;
+
+ if($return_path) {
+ goaway(z_root() . "/" . $return_path);
+ }
+
+ $json = array('success' => 1);
+ if(x($_REQUEST,'jsreload') && strlen($_REQUEST['jsreload']))
+ $json['reload'] = z_root() . '/' . $_REQUEST['jsreload'];
+
+ logger('post_json: ' . print_r($json,true), LOGGER_DEBUG);
+
+ echo json_encode($json);
+ killme();
+ // NOTREACHED
+ }
+
+
+ function get() {
+
+ if((! local_channel()) && (! remote_channel()))
+ return;
+
+ require_once('include/security.php');
+
+ if((argc() == 3) && (argv(1) === 'drop') && intval(argv(2))) {
+
+ require_once('include/items.php');
+ $i = q("select id, uid, author_xchan, owner_xchan, source_xchan, item_type from item where id = %d limit 1",
+ intval(argv(2))
+ );
+
+ if($i) {
+ $can_delete = false;
+ $local_delete = false;
+ if(local_channel() && local_channel() == $i[0]['uid'])
+ $local_delete = true;
+
+ $sys = get_sys_channel();
+ if(is_site_admin() && $sys['channel_id'] == $i[0]['uid'])
+ $can_delete = true;
+
+ $ob_hash = get_observer_hash();
+ if($ob_hash && ($ob_hash === $i[0]['author_xchan'] || $ob_hash === $i[0]['owner_xchan'] || $ob_hash === $i[0]['source_xchan']))
+ $can_delete = true;
+
+ if(! ($can_delete || $local_delete)) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ // if this is a different page type or it's just a local delete
+ // but not by the item author or owner, do a simple deletion
+
+ if(intval($i[0]['item_type']) || ($local_delete && (! $can_delete))) {
+ drop_item($i[0]['id']);
+ }
+ else {
+ // complex deletion that needs to propagate and be performed in phases
+ drop_item($i[0]['id'],true,DROPITEM_PHASE1);
+ tag_deliver($i[0]['uid'],$i[0]['id']);
+ }
+ }
+ }
+ }
+
+
+ function fix_attached_photo_permissions($uid,$xchan_hash,$body,
+ $str_contact_allow,$str_group_allow,$str_contact_deny,$str_group_deny) {
+
+ if(get_pconfig($uid,'system','force_public_uploads')) {
+ $str_contact_allow = $str_group_allow = $str_contact_deny = $str_group_deny = '';
+ }
+
+ $match = null;
+ // match img and zmg image links
+ if(preg_match_all("/\[[zi]mg(.*?)\](.*?)\[\/[zi]mg\]/",$body,$match)) {
+ $images = $match[2];
+ if($images) {
+ foreach($images as $image) {
+ if(! stristr($image,z_root() . '/photo/'))
+ continue;
+ $image_uri = substr($image,strrpos($image,'/') + 1);
+ if(strpos($image_uri,'-') !== false)
+ $image_uri = substr($image_uri,0, strpos($image_uri,'-'));
+ if(strpos($image_uri,'.') !== false)
+ $image_uri = substr($image_uri,0, strpos($image_uri,'.'));
+ if(! strlen($image_uri))
+ continue;
+ $srch = '<' . $xchan_hash . '>';
+
+ $r = q("select folder from attach where hash = '%s' and uid = %d limit 1",
+ dbesc($image_uri),
+ intval($uid)
+ );
+ if($r && $r[0]['folder']) {
+ $f = q("select * from attach where hash = '%s' and is_dir = 1 and uid = %d limit 1",
+ dbesc($r[0]['folder']),
+ intval($uid)
+ );
+ if(($f) && (($f[0]['allow_cid']) || ($f[0]['allow_gid']) || ($f[0]['deny_cid']) || ($f[0]['deny_gid']))) {
+ $str_contact_allow = $f[0]['allow_cid'];
+ $str_group_allow = $f[0]['allow_gid'];
+ $str_contact_deny = $f[0]['deny_cid'];
+ $str_group_deny = $f[0]['deny_gid'];
+ }
+ }
+
+ $r = q("SELECT id FROM photo
+ WHERE allow_cid = '%s' AND allow_gid = '' AND deny_cid = '' AND deny_gid = ''
+ AND resource_id = '%s' AND uid = %d LIMIT 1",
+ dbesc($srch),
+ dbesc($image_uri),
+ intval($uid)
+ );
+
+ if($r) {
+ $r = q("UPDATE photo SET allow_cid = '%s', allow_gid = '%s', deny_cid = '%s', deny_gid = '%s'
+ WHERE resource_id = '%s' AND uid = %d ",
+ dbesc($str_contact_allow),
+ dbesc($str_group_allow),
+ dbesc($str_contact_deny),
+ dbesc($str_group_deny),
+ dbesc($image_uri),
+ intval($uid)
+ );
+
+ // also update the linked item (which is probably invisible)
+
+ $r = q("select id from item
+ WHERE allow_cid = '%s' AND allow_gid = '' AND deny_cid = '' AND deny_gid = ''
+ AND resource_id = '%s' and resource_type = 'photo' AND uid = %d LIMIT 1",
+ dbesc($srch),
+ dbesc($image_uri),
+ intval($uid)
+ );
+ if($r) {
+ $private = (($str_contact_allow || $str_group_allow || $str_contact_deny || $str_group_deny) ? true : false);
+
+ $r = q("UPDATE item SET allow_cid = '%s', allow_gid = '%s', deny_cid = '%s', deny_gid = '%s', item_private = %d
+ WHERE id = %d AND uid = %d",
+ dbesc($str_contact_allow),
+ dbesc($str_group_allow),
+ dbesc($str_contact_deny),
+ dbesc($str_group_deny),
+ intval($private),
+ intval($r[0]['id']),
+ intval($uid)
+ );
+ }
+ $r = q("select id from attach where hash = '%s' and uid = %d limit 1",
+ dbesc($image_uri),
+ intval($uid)
+ );
+ if($r) {
+ q("update attach SET allow_cid = '%s', allow_gid = '%s', deny_cid = '%s', deny_gid = '%s'
+ WHERE id = %d AND uid = %d",
+ dbesc($str_contact_allow),
+ dbesc($str_group_allow),
+ dbesc($str_contact_deny),
+ dbesc($str_group_deny),
+ intval($r[0]['id']),
+ intval($uid)
+ );
+ }
+ }
+ }
+ }
+ }
+ }
+
+
+ function fix_attached_file_permissions($channel,$observer_hash,$body,
+ $str_contact_allow,$str_group_allow,$str_contact_deny,$str_group_deny) {
+
+ if(get_pconfig($channel['channel_id'],'system','force_public_uploads')) {
+ $str_contact_allow = $str_group_allow = $str_contact_deny = $str_group_deny = '';
+ }
+
+ $match = false;
+
+ if(preg_match_all("/\[attachment\](.*?)\[\/attachment\]/",$body,$match)) {
+ $attaches = $match[1];
+ if($attaches) {
+ foreach($attaches as $attach) {
+ $hash = substr($attach,0,strpos($attach,','));
+ $rev = intval(substr($attach,strpos($attach,',')));
+ attach_store($channel,$observer_hash,$options = 'update', array(
+ 'hash' => $hash,
+ 'revision' => $rev,
+ 'allow_cid' => $str_contact_allow,
+ 'allow_gid' => $str_group_allow,
+ 'deny_cid' => $str_contact_deny,
+ 'deny_gid' => $str_group_deny
+ ));
+ }
+ }
+ }
+ }
+
+ function item_check_service_class($channel_id,$iswebpage) {
+ $ret = array('success' => false, 'message' => '');
+
+ if ($iswebpage) {
+ $r = q("select count(i.id) as total from item i
+ right join channel c on (i.author_xchan=c.channel_hash and i.uid=c.channel_id )
+ and i.parent=i.id and i.item_type = %d and i.item_deleted = 0 and i.uid= %d ",
+ intval(ITEM_TYPE_WEBPAGE),
+ intval($channel_id)
+ );
+ }
+ else {
+ $r = q("select count(id) as total from item where parent = id and item_wall = 1 and uid = %d " . item_normal(),
+ intval($channel_id)
+ );
+ }
+
+ if(! $r) {
+ $ret['message'] = t('Unable to obtain post information from database.');
+ return $ret;
+ }
+
+ if (!$iswebpage) {
+ $max = service_class_fetch($channel_id,'total_items');
+ if(! service_class_allows($channel_id,'total_items',$r[0]['total'])) {
+ $result['message'] .= upgrade_message() . sprintf( t('You have reached your limit of %1$.0f top level posts.'),$max);
+ return $result;
+ }
+ }
+ else {
+ $max = service_class_fetch($channel_id,'total_pages');
+ if(! service_class_allows($channel_id,'total_pages',$r[0]['total'])) {
+ $result['message'] .= upgrade_message() . sprintf( t('You have reached your limit of %1$.0f webpages.'),$max);
+ return $result;
+ }
+ }
+
+ $ret['success'] = true;
+ return $ret;
+ }
+
+
+}
diff --git a/Zotlabs/Module/Lang.php b/Zotlabs/Module/Lang.php
new file mode 100644
index 000000000..69f10fe6d
--- /dev/null
+++ b/Zotlabs/Module/Lang.php
@@ -0,0 +1,12 @@
+<?php
+namespace Zotlabs\Module;
+
+
+class Lang extends \Zotlabs\Web\Controller {
+
+ function get() {
+ return lang_selector();
+ }
+
+
+}
diff --git a/Zotlabs/Module/Layouts.php b/Zotlabs/Module/Layouts.php
new file mode 100644
index 000000000..50cb401bc
--- /dev/null
+++ b/Zotlabs/Module/Layouts.php
@@ -0,0 +1,199 @@
+<?php
+namespace Zotlabs\Module;
+
+require_once('include/identity.php');
+require_once('include/conversation.php');
+require_once('include/acl_selectors.php');
+
+
+class Layouts extends \Zotlabs\Web\Controller {
+
+ function init() {
+
+ if(argc() > 1 && argv(1) === 'sys' && is_site_admin()) {
+ $sys = get_sys_channel();
+ if($sys && intval($sys['channel_id'])) {
+ \App::$is_sys = true;
+ }
+ }
+
+ if(argc() > 1)
+ $which = argv(1);
+ else
+ return;
+
+ profile_load($a,$which);
+
+ }
+
+
+ function get() {
+
+ if(! \App::$profile) {
+ notice( t('Requested profile is not available.') . EOL );
+ \App::$error = 404;
+ return;
+ }
+
+ $which = argv(1);
+
+ $_SESSION['return_url'] = \App::$query_string;
+
+ $uid = local_channel();
+ $owner = 0;
+ $channel = null;
+ $observer = \App::get_observer();
+
+ $channel = \App::get_channel();
+
+ if(\App::$is_sys && is_site_admin()) {
+ $sys = get_sys_channel();
+ if($sys && intval($sys['channel_id'])) {
+ $uid = $owner = intval($sys['channel_id']);
+ $channel = $sys;
+ $observer = $sys;
+ }
+ }
+
+ if(! $owner) {
+ // Figure out who the page owner is.
+ $r = q("select channel_id from channel where channel_address = '%s'",
+ dbesc($which)
+ );
+ if($r) {
+ $owner = intval($r[0]['channel_id']);
+ }
+ }
+
+ $ob_hash = (($observer) ? $observer['xchan_hash'] : '');
+
+ $perms = get_all_perms($owner,$ob_hash);
+
+ if(! $perms['write_pages']) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ // Block design features from visitors
+
+ if((! $uid) || ($uid != $owner)) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ // Get the observer, check their permissions
+
+ $ob_hash = (($observer) ? $observer['xchan_hash'] : '');
+
+ $perms = get_all_perms($owner,$ob_hash);
+
+ if(! $perms['write_pages']) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ //This feature is not exposed in redbasic ui since it is not clear why one would want to
+ //download a json encoded pdl file - we dont have a possibility to import it.
+ //Use the buildin share/install feature instead.
+ if((argc() > 3) && (argv(2) === 'share') && (argv(3))) {
+ $r = q("select sid, service, mimetype, title, body from item_id
+ left join item on item.id = item_id.iid
+ where item_id.uid = %d and item.mid = '%s' and service = 'PDL' order by sid asc",
+ intval($owner),
+ dbesc(argv(3))
+ );
+ if($r) {
+ header('Content-type: application/x-hubzilla-layout');
+ header('Content-disposition: attachment; filename="' . $r[0]['sid'] . '.pdl"');
+ echo json_encode($r);
+ killme();
+ }
+ }
+
+ // Create a status editor (for now - we'll need a WYSIWYG eventually) to create pages
+ // Nickname is set to the observers xchan, and profile_uid to the owners.
+ // This lets you post pages at other people's channels.
+
+ $x = array(
+ 'webpage' => ITEM_TYPE_PDL,
+ 'is_owner' => true,
+ 'nickname' => \App::$profile['channel_address'],
+ 'bang' => '',
+ 'showacl' => false,
+ 'visitor' => false,
+ 'nopreview' => 1,
+ 'ptlabel' => t('Layout Name'),
+ 'profile_uid' => intval($owner),
+ 'expanded' => true,
+ 'placeholdertitle' => t('Layout Description (Optional)'),
+ 'novoting' => true,
+ 'bbco_autocomplete' => 'comanche'
+ );
+
+ if($_REQUEST['title'])
+ $x['title'] = $_REQUEST['title'];
+ if($_REQUEST['body'])
+ $x['body'] = $_REQUEST['body'];
+ if($_REQUEST['pagetitle'])
+ $x['pagetitle'] = $_REQUEST['pagetitle'];
+
+ $editor = status_editor($a,$x);
+
+ $r = q("select iid, sid, mid, title, body, mimetype, created, edited, item_type from item_id left join item on item_id.iid = item.id
+ where item_id.uid = %d and service = 'PDL' and item_type = %d order by item.created desc",
+ intval($owner),
+ intval(ITEM_TYPE_PDL)
+ );
+
+ $pages = null;
+
+ if($r) {
+ $pages = array();
+ foreach($r as $rr) {
+ $element_arr = array(
+ 'type' => 'layout',
+ 'title' => $rr['title'],
+ 'body' => $rr['body'],
+ 'created' => $rr['created'],
+ 'edited' => $rr['edited'],
+ 'mimetype' => $rr['mimetype'],
+ 'pagetitle' => $rr['sid'],
+ 'mid' => $rr['mid']
+ );
+ $pages[$rr['iid']][] = array(
+ 'url' => $rr['iid'],
+ 'title' => $rr['sid'],
+ 'descr' => $rr['title'],
+ 'mid' => $rr['mid'],
+ 'created' => $rr['created'],
+ 'edited' => $rr['edited'],
+ 'bb_element' => '[element]' . base64url_encode(json_encode($element_arr)) . '[/element]'
+ );
+ }
+ }
+
+ //Build the base URL for edit links
+ $url = z_root() . '/editlayout/' . $which;
+
+ $o .= replace_macros(get_markup_template('layoutlist.tpl'), array(
+ '$title' => t('Layouts'),
+ '$create' => t('Create'),
+ '$help' => array('text' => t('Help'), 'url' => 'help/comanche', 'title' => t('Comanche page description language help')),
+ '$editor' => $editor,
+ '$baseurl' => $url,
+ '$name' => t('Layout Name'),
+ '$descr' => t('Layout Description'),
+ '$created' => t('Created'),
+ '$edited' => t('Edited'),
+ '$edit' => t('Edit'),
+ '$share' => t('Share'),
+ '$download' => t('Download PDL file'),
+ '$pages' => $pages,
+ '$channel' => $which,
+ '$view' => t('View'),
+ ));
+
+ return $o;
+ }
+
+}
diff --git a/Zotlabs/Module/Like.php b/Zotlabs/Module/Like.php
new file mode 100644
index 000000000..ac8791950
--- /dev/null
+++ b/Zotlabs/Module/Like.php
@@ -0,0 +1,547 @@
+<?php
+namespace Zotlabs\Module;
+
+require_once('include/security.php');
+require_once('include/bbcode.php');
+require_once('include/items.php');
+
+
+
+class Like extends \Zotlabs\Web\Controller {
+
+ function get() {
+
+ $o = '';
+
+ $observer = \App::get_observer();
+ $interactive = $_REQUEST['interactive'];
+ if($interactive) {
+ $o .= '<h1>' . t('Like/Dislike') . '</h1>';
+ $o .= EOL . EOL;
+
+ if(! $observer) {
+ $_SESSION['return_url'] = \App::$query_string;
+ $o .= t('This action is restricted to members.') . EOL;
+ $o .= t('Please <a href="rmagic">login with your $Projectname ID</a> or <a href="register">register as a new $Projectname member</a> to continue.') . EOL;
+ return $o;
+ }
+ }
+
+ $verb = notags(trim($_GET['verb']));
+
+ if(! $verb)
+ $verb = 'like';
+
+ switch($verb) {
+ case 'like':
+ case 'unlike':
+ $activity = ACTIVITY_LIKE;
+ break;
+ case 'dislike':
+ case 'undislike':
+ $activity = ACTIVITY_DISLIKE;
+ break;
+ case 'agree':
+ case 'unagree':
+ $activity = ACTIVITY_AGREE;
+ break;
+ case 'disagree':
+ case 'undisagree':
+ $activity = ACTIVITY_DISAGREE;
+ break;
+ case 'abstain':
+ case 'unabstain':
+ $activity = ACTIVITY_ABSTAIN;
+ break;
+ case 'attendyes':
+ case 'unattendyes':
+ $activity = ACTIVITY_ATTEND;
+ break;
+ case 'attendno':
+ case 'unattendno':
+ $activity = ACTIVITY_ATTENDNO;
+ break;
+ case 'attendmaybe':
+ case 'unattendmaybe':
+ $activity = ACTIVITY_ATTENDMAYBE;
+ break;
+ default:
+ return;
+ break;
+ }
+
+ $extended_like = false;
+ $object = $target = null;
+ $post_type = '';
+ $objtype = '';
+
+ if(argc() == 3) {
+
+ if(! $observer)
+ killme();
+
+ $extended_like = true;
+ $obj_type = argv(1);
+ $obj_id = argv(2);
+ $public = true;
+
+ if($obj_type == 'profile') {
+ $r = q("select * from profile where profile_guid = '%s' limit 1",
+ dbesc(argv(2))
+ );
+ if(! $r)
+ killme();
+ $owner_uid = $r[0]['uid'];
+ if($r[0]['is_default'])
+ $public = true;
+ if(! $public) {
+ $d = q("select abook_xchan from abook where abook_profile = '%s' and abook_channel = %d",
+ dbesc($r[0]['profile_guid']),
+ intval($owner_uid)
+ );
+ if(! $d) {
+ // forgery - illegal
+ if($interactive) {
+ notice( t('Invalid request.') . EOL);
+ return $o;
+ }
+ killme();
+ }
+ // $d now contains a list of those who can see this profile - only send the status notification
+ // to them.
+ $allow_cid = $allow_gid = $deny_cid = $deny_gid = '';
+ foreach($d as $dd) {
+ $allow_cid .= '<' . $dd['abook_xchan'] . '>';
+ }
+ }
+ $post_type = t('channel');
+ $objtype = ACTIVITY_OBJ_PROFILE;
+
+ $profile = $r[0];
+ }
+ elseif($obj_type == 'thing') {
+
+ $r = q("select * from obj where obj_type = %d and obj_obj = '%s' limit 1",
+ intval(TERM_OBJ_THING),
+ dbesc(argv(2))
+ );
+
+ if(! $r) {
+ if($interactive) {
+ notice( t('Invalid request.') . EOL);
+ return $o;
+ }
+ killme();
+ }
+
+ $owner_uid = $r[0]['obj_channel'];
+
+ $allow_cid = $r[0]['allow_cid'];
+ $allow_gid = $r[0]['allow_gid'];
+ $deny_cid = $r[0]['deny_cid'];
+ $deny_gid = $r[0]['deny_gid'];
+ if($allow_cid || $allow_gid || $deny_cid || $deny_gid)
+ $public = false;
+
+ $post_type = t('thing');
+ $objtype = ACTIVITY_OBJ_PROFILE;
+ $tgttype = ACTIVITY_OBJ_THING;
+
+ $links = array();
+ $links[] = array('rel' => 'alternate', 'type' => 'text/html',
+ 'href' => z_root() . '/thing/' . $r[0]['obj_obj']);
+ if($r[0]['imgurl'])
+ $links[] = array('rel' => 'photo', 'href' => $r[0]['obj_imgurl']);
+
+ $target = json_encode(array(
+ 'type' => $tgttype,
+ 'title' => $r[0]['obj_term'],
+ 'id' => z_root() . '/thing/' . $r[0]['obj_obj'],
+ 'link' => $links
+ ));
+
+ $plink = '[zrl=' . z_root() . '/thing/' . $r[0]['obj_obj'] . ']' . $r[0]['obj_term'] . '[/zrl]';
+
+ }
+
+ if(! ($owner_uid && $r)) {
+ if($interactive) {
+ notice( t('Invalid request.') . EOL);
+ return $o;
+ }
+ killme();
+ }
+
+ // The resultant activity is going to be a wall-to-wall post, so make sure this is allowed
+
+ $perms = get_all_perms($owner_uid,$observer['xchan_hash']);
+
+ if(! ($perms['post_like'] && $perms['view_profile'])) {
+ if($interactive) {
+ notice( t('Permission denied.') . EOL);
+ return $o;
+ }
+ killme();
+ }
+
+ $ch = q("select * from channel left join xchan on channel_hash = xchan_hash where channel_id = %d limit 1",
+ intval($owner_uid)
+ );
+ if(! $ch) {
+ if($interactive) {
+ notice( t('Channel unavailable.') . EOL);
+ return $o;
+ }
+ killme();
+ }
+
+ if(! $plink)
+ $plink = '[zrl=' . z_root() . '/profile/' . $ch[0]['channel_address'] . ']' . $post_type . '[/zrl]';
+
+ $links = array();
+ $links[] = array('rel' => 'alternate', 'type' => 'text/html',
+ 'href' => z_root() . '/profile/' . $ch[0]['channel_address']);
+ $links[] = array('rel' => 'photo', 'type' => $ch[0]['xchan_photo_mimetype'],
+ 'href' => $ch[0]['xchan_photo_l']);
+
+ $object = json_encode(array(
+ 'type' => ACTIVITY_OBJ_PROFILE,
+ 'title' => $ch[0]['channel_name'],
+ 'id' => $ch[0]['xchan_url'] . '/' . $ch[0]['xchan_hash'],
+ 'link' => $links
+ ));
+
+
+ // second like of the same thing is "undo" for the first like
+
+ $z = q("select * from likes where channel_id = %d and liker = '%s' and verb = '%s' and target_type = '%s' and target_id = '%s' limit 1",
+ intval($ch[0]['channel_id']),
+ dbesc($observer['xchan_hash']),
+ dbesc($activity),
+ dbesc(($tgttype)?$tgttype:$objtype),
+ dbesc($obj_id)
+ );
+
+ if($z) {
+ $z[0]['deleted'] = 1;
+ build_sync_packet($ch[0]['channel_id'],array('likes' => $z));
+
+ q("delete from likes where id = %d limit 1",
+ intval($z[0]['id'])
+ );
+ if($z[0]['i_mid']) {
+ $r = q("select id from item where mid = '%s' and uid = %d limit 1",
+ dbesc($z[0]['i_mid']),
+ intval($ch[0]['channel_id'])
+ );
+ if($r)
+ drop_item($r[0]['id'],false);
+ if($interactive) {
+ notice( t('Previous action reversed.') . EOL);
+ return $o;
+ }
+ }
+ killme();
+ }
+ }
+ else {
+
+ // this is used to like an item or comment
+
+ $item_id = ((argc() == 2) ? notags(trim(argv(1))) : 0);
+
+ logger('like: verb ' . $verb . ' item ' . $item_id, LOGGER_DEBUG);
+
+ // get the item. Allow linked photos (which are normally hidden) to be liked
+
+ $r = q("SELECT * FROM item WHERE id = %d
+ and item_type = 0 and item_deleted = 0 and item_unpublished = 0
+ and item_delayed = 0 and item_pending_remove = 0 and item_blocked = 0 LIMIT 1",
+ intval($item_id)
+ );
+
+ if(! $item_id || (! $r)) {
+ logger('like: no item ' . $item_id);
+ killme();
+ }
+
+
+ $item = $r[0];
+ $owner_uid = $item['uid'];
+ $owner_aid = $item['aid'];
+
+
+ $sys = get_sys_channel();
+
+
+ // if this is a "discover" item, (item['uid'] is the sys channel),
+ // fallback to the item comment policy, which should've been
+ // respected when generating the conversation thread.
+ // Even if the activity is rejected by the item owner, it should still get attached
+ // to the local discover conversation on this site.
+
+ if(($owner_uid != $sys['channel_id']) && (! perm_is_allowed($owner_uid,$observer['xchan_hash'],'post_comments'))) {
+ notice( t('Permission denied') . EOL);
+ killme();
+ }
+
+ $r = q("select * from xchan where xchan_hash = '%s' limit 1",
+ dbesc($item['owner_xchan'])
+ );
+ if($r)
+ $thread_owner = $r[0];
+ else
+ killme();
+
+ $r = q("select * from xchan where xchan_hash = '%s' limit 1",
+ dbesc($item['author_xchan'])
+ );
+ if($r)
+ $item_author = $r[0];
+ else
+ killme();
+
+
+ $verbs = " '".dbesc($activity)."' ";
+
+ $multi_undo = false;
+
+ // event participation and consensus items are essentially radio toggles. If you make a subsequent choice,
+ // we need to eradicate your first choice.
+
+ if($activity === ACTIVITY_ATTEND || $activity === ACTIVITY_ATTENDNO || $activity === ACTIVITY_ATTENDMAYBE) {
+ $verbs = " '" . dbesc(ACTIVITY_ATTEND) . "','" . dbesc(ACTIVITY_ATTENDNO) . "','" . dbesc(ACTIVITY_ATTENDMAYBE) . "' ";
+ $multi_undo = 1;
+ }
+ if($activity === ACTIVITY_AGREE || $activity === ACTIVITY_DISAGREE || $activity === ACTIVITY_ABSTAIN) {
+ $verbs = " '" . dbesc(ACTIVITY_AGREE) . "','" . dbesc(ACTIVITY_DISAGREE) . "','" . dbesc(ACTIVITY_ABSTAIN) . "' ";
+ $multi_undo = true;
+ }
+
+ $item_normal = item_normal();
+
+ $r = q("SELECT id, parent, uid, verb FROM item WHERE verb in ( $verbs ) $item_normal
+ AND author_xchan = '%s' AND thr_parent = '%s' and uid = %d ",
+ dbesc($observer['xchan_hash']),
+ dbesc($item['mid']),
+ intval($owner_uid)
+ );
+
+ if($r) {
+ // already liked it. Drop that item.
+ require_once('include/items.php');
+ foreach($r as $rr) {
+ drop_item($rr['id'],false,DROPITEM_PHASE1);
+ // set the changed timestamp on the parent so we'll see the update without a page reload
+ $z = q("update item set changed = '%s' where id = %d and uid = %d",
+ dbesc(datetime_convert()),
+ intval($rr['parent']),
+ intval($rr['uid'])
+ );
+ // Prior activity was a duplicate of the one we're submitting, just undo it;
+ // don't fall through and create another
+ if(activity_match($rr['verb'],$activity))
+ $multi_undo = false;
+
+ // drop_item was not done interactively, so we need to invoke the notifier
+ // in order to push the changes to connections
+
+ proc_run('php','include/notifier.php','drop',$rr['id']);
+
+ }
+
+ if($interactive)
+ return;
+
+ if(! $multi_undo)
+ killme();
+ }
+ }
+
+ $mid = item_message_id();
+
+ $arr = array();
+
+ if($extended_like) {
+ $arr['item_thread_top'] = 1;
+ $arr['item_origin'] = 1;
+ $arr['item_wall'] = 1;
+ }
+ else {
+ $post_type = (($item['resource_type'] === 'photo') ? t('photo') : t('status'));
+ if($item['obj_type'] === ACTIVITY_OBJ_EVENT)
+ $post_type = t('event');
+
+ $links = array(array('rel' => 'alternate','type' => 'text/html', 'href' => $item['plink']));
+ $objtype = (($item['resource_type'] === 'photo') ? ACTIVITY_OBJ_PHOTO : ACTIVITY_OBJ_NOTE );
+
+ $body = $item['body'];
+
+ $object = json_encode(array(
+ 'type' => $objtype,
+ 'id' => $item['mid'],
+ 'parent' => (($item['thr_parent']) ? $item['thr_parent'] : $item['parent_mid']),
+ 'link' => $links,
+ 'title' => $item['title'],
+ 'content' => $item['body'],
+ 'created' => $item['created'],
+ 'edited' => $item['edited'],
+ 'author' => array(
+ 'name' => $item_author['xchan_name'],
+ 'address' => $item_author['xchan_addr'],
+ 'guid' => $item_author['xchan_guid'],
+ 'guid_sig' => $item_author['xchan_guid_sig'],
+ 'link' => array(
+ array('rel' => 'alternate', 'type' => 'text/html', 'href' => $item_author['xchan_url']),
+ array('rel' => 'photo', 'type' => $item_author['xchan_photo_mimetype'], 'href' => $item_author['xchan_photo_m'])),
+ ),
+ ));
+
+ if(! intval($item['item_thread_top']))
+ $post_type = 'comment';
+
+ $arr['item_origin'] = 1;
+ $arr['item_notshown'] = 1;
+
+ if(intval($item['item_wall']))
+ $arr['item_wall'] = 1;
+
+ // if this was a linked photo and was hidden, unhide it.
+
+ if(intval($item['item_hidden'])) {
+ $r = q("update item set item_hidden = 0 where id = %d",
+ intval($item['id'])
+ );
+ }
+
+ }
+
+ if($verb === 'like')
+ $bodyverb = t('%1$s likes %2$s\'s %3$s');
+ if($verb === 'dislike')
+ $bodyverb = t('%1$s doesn\'t like %2$s\'s %3$s');
+ if($verb === 'agree')
+ $bodyverb = t('%1$s agrees with %2$s\'s %3$s');
+ if($verb === 'disagree')
+ $bodyverb = t('%1$s doesn\'t agree with %2$s\'s %3$s');
+ if($verb === 'abstain')
+ $bodyverb = t('%1$s abstains from a decision on %2$s\'s %3$s');
+ if($verb === 'attendyes')
+ $bodyverb = t('%1$s is attending %2$s\'s %3$s');
+ if($verb === 'attendno')
+ $bodyverb = t('%1$s is not attending %2$s\'s %3$s');
+ if($verb === 'attendmaybe')
+ $bodyverb = t('%1$s may attend %2$s\'s %3$s');
+
+ if(! isset($bodyverb))
+ killme();
+
+
+
+ if($extended_like) {
+ $ulink = '[zrl=' . $ch[0]['xchan_url'] . ']' . $ch[0]['xchan_name'] . '[/zrl]';
+ $alink = '[zrl=' . $observer['xchan_url'] . ']' . $observer['xchan_name'] . '[/zrl]';
+ $private = (($public) ? 0 : 1);
+ }
+ else {
+ $arr['parent'] = $item['id'];
+ $arr['thr_parent'] = $item['mid'];
+ $ulink = '[zrl=' . $item_author['xchan_url'] . ']' . $item_author['xchan_name'] . '[/zrl]';
+ $alink = '[zrl=' . $observer['xchan_url'] . ']' . $observer['xchan_name'] . '[/zrl]';
+ $plink = '[zrl=' . z_root() . '/display/' . $item['mid'] . ']' . $post_type . '[/zrl]';
+ $allow_cid = $item['allow_cid'];
+ $allow_gid = $item['allow_gid'];
+ $deny_cid = $item['deny_cid'];
+ $deny_gid = $item['deny_gid'];
+ $private = $item['private'];
+
+ }
+
+
+ $arr['mid'] = $mid;
+ $arr['aid'] = (($extended_like) ? $ch[0]['channel_account_id'] : $owner_aid);
+ $arr['uid'] = $owner_uid;
+ $arr['item_flags'] = $item_flags;
+ $arr['item_wall'] = $item_wall;
+ $arr['parent_mid'] = (($extended_like) ? $mid : $item['mid']);
+ $arr['owner_xchan'] = (($extended_like) ? $ch[0]['xchan_hash'] : $thread_owner['xchan_hash']);
+ $arr['author_xchan'] = $observer['xchan_hash'];
+
+
+ $arr['body'] = sprintf( $bodyverb, $alink, $ulink, $plink );
+ if($obj_type === 'thing' && $r[0]['imgurl']) {
+ $arr['body'] .= "\n\n[zmg=80x80]" . $r[0]['imgurl'] . '[/zmg]';
+ }
+ if($obj_type === 'profile') {
+ if($public) {
+ $arr['body'] .= "\n\n" . '[embed]' . z_root() . '/profile/' . $ch[0]['channel_address'] . '[/embed]';
+ }
+ else
+ $arr['body'] .= "\n\n[zmg=80x80]" . $profile['thumb'] . '[/zmg]';
+ }
+
+
+ $arr['verb'] = $activity;
+ $arr['obj_type'] = $objtype;
+ $arr['object'] = $object;
+
+ if($target) {
+ $arr['tgt_type'] = $tgttype;
+ $arr['target'] = $target;
+ }
+
+ $arr['allow_cid'] = $allow_cid;
+ $arr['allow_gid'] = $allow_gid;
+ $arr['deny_cid'] = $deny_cid;
+ $arr['deny_gid'] = $deny_gid;
+ $arr['item_private'] = $private;
+
+
+ $post = item_store($arr);
+ $post_id = $post['item_id'];
+
+ $arr['id'] = $post_id;
+
+ call_hooks('post_local_end', $arr);
+
+
+ if($extended_like) {
+ $r = q("insert into likes (channel_id,liker,likee,iid,i_mid,verb,target_type,target_id,target) values (%d,'%s','%s',%d,'%s','%s','%s','%s','%s')",
+ intval($ch[0]['channel_id']),
+ dbesc($observer['xchan_hash']),
+ dbesc($ch[0]['channel_hash']),
+ intval($post_id),
+ dbesc($mid),
+ dbesc($activity),
+ dbesc(($tgttype)? $tgttype : $objtype),
+ dbesc($obj_id),
+ dbesc(($target) ? $target : $object)
+ );
+ $r = q("select * from likes where liker = '%s' and likee = '%s' and i_mid = '%s' and verb = '%s' and target_type = '%s' and target_id = '%s' ",
+ dbesc($observer['xchan_hash']),
+ dbesc($ch[0]['channel_hash']),
+ dbesc($mid),
+ dbesc($activity),
+ dbesc(($tgttype)? $tgttype : $objtype),
+ dbesc($obj_id)
+ );
+ if($r)
+ build_sync_packet($ch[0]['channel_id'],array('likes' => $r));
+
+ }
+
+
+ proc_run('php',"include/notifier.php","like","$post_id");
+
+ if($interactive) {
+ notice( t('Action completed.') . EOL);
+ $o .= t('Thank you.');
+ return $o;
+ }
+
+ killme();
+ }
+
+
+
+}
diff --git a/Zotlabs/Module/Linkinfo.php b/Zotlabs/Module/Linkinfo.php
new file mode 100644
index 000000000..ef34bb465
--- /dev/null
+++ b/Zotlabs/Module/Linkinfo.php
@@ -0,0 +1,381 @@
+<?php
+namespace Zotlabs\Module;
+
+
+
+
+
+class Linkinfo extends \Zotlabs\Web\Controller {
+
+ function get() {
+
+ logger('linkinfo: ' . print_r($_REQUEST,true));
+
+ $text = null;
+ $str_tags = '';
+
+
+ $br = "\n";
+
+ if(x($_GET,'binurl'))
+ $url = trim(hex2bin($_GET['binurl']));
+ else
+ $url = trim($_GET['url']);
+
+ $url = strip_zids($url);
+
+ if((substr($url,0,1) != '/') && (substr($url,0,4) != 'http'))
+ $url = 'http://' . $url;
+
+
+ if($_GET['title'])
+ $title = strip_tags(trim($_GET['title']));
+
+ if($_GET['description'])
+ $text = strip_tags(trim($_GET['description']));
+
+ if($_GET['tags']) {
+ $arr_tags = str_getcsv($_GET['tags']);
+ if(count($arr_tags)) {
+ array_walk($arr_tags,'self::arr_add_hashes');
+ $str_tags = $br . implode(' ',$arr_tags) . $br;
+ }
+ }
+
+ logger('linkinfo: ' . $url);
+
+ $result = z_fetch_url($url,false,0,array('novalidate' => true, 'nobody' => true));
+ if($result['success']) {
+ $hdrs=array();
+ $h = explode("\n",$result['header']);
+ foreach ($h as $l) {
+ list($k,$v) = array_map("trim", explode(":", trim($l), 2));
+ $hdrs[$k] = $v;
+ }
+ if (array_key_exists('Content-Type', $hdrs))
+ $type = $hdrs['Content-Type'];
+ if($type) {
+ $zrl = is_matrix_url($url);
+ if(stripos($type,'image/') !== false) {
+ if($zrl)
+ echo $br . '[zmg]' . $url . '[/zmg]' . $br;
+ else
+ echo $br . '[img]' . $url . '[/img]' . $br;
+ killme();
+ }
+ if(stripos($type,'video/') !== false) {
+ if($zrl)
+ echo $br . '[zvideo]' . $url . '[/zvideo]' . $br;
+ else
+ echo $br . '[video]' . $url . '[/video]' . $br;
+ killme();
+ }
+ if(stripos($type,'audio/') !== false) {
+ if($zrl)
+ echo $br . '[zaudio]' . $url . '[/zaudio]' . $br;
+ else
+ echo $br . '[audio]' . $url . '[/audio]' . $br;
+ killme();
+ }
+ }
+ }
+
+ $template = $br . '#^[url=%s]%s[/url]%s' . $br;
+
+ $arr = array('url' => $url, 'text' => '');
+
+ call_hooks('parse_link', $arr);
+
+ if(strlen($arr['text'])) {
+ echo $arr['text'];
+ killme();
+ }
+
+ $x = oembed_process($url);
+ if($x) {
+ echo $x;
+ killme();
+ }
+
+ if($url && $title && $text) {
+
+ $text = $br . '[quote]' . trim($text) . '[/quote]' . $br;
+
+ $title = str_replace(array("\r","\n"),array('',''),$title);
+
+ $result = sprintf($template,$url,($title) ? $title : $url,$text) . $str_tags;
+
+ logger('linkinfo (unparsed): returns: ' . $result);
+
+ echo $result;
+ killme();
+ }
+
+ $siteinfo = self::parseurl_getsiteinfo($url);
+
+ // If this is a Red site, use zrl rather than url so they get zids sent to them by default
+
+ if( x($siteinfo,'generator') && (strpos($siteinfo['generator'], \Zotlabs\Project\System::get_platform_name() . ' ') === 0))
+ $template = str_replace('url','zrl',$template);
+
+ if($siteinfo["title"] == "") {
+ echo sprintf($template,$url,$url,'') . $str_tags;
+ killme();
+ } else {
+ $text = $siteinfo["text"];
+ $title = $siteinfo["title"];
+ }
+
+ $image = "";
+
+ if(sizeof($siteinfo["images"]) > 0){
+ /* Execute below code only if image is present in siteinfo */
+
+ $total_images = 0;
+ $max_images = get_config('system','max_bookmark_images');
+ if($max_images === false)
+ $max_images = 2;
+ else
+ $max_images = intval($max_images);
+
+ foreach ($siteinfo["images"] as $imagedata) {
+ if ($url) {
+ $image .= sprintf('[url=%s]', $url);
+ }
+ $image .= '[img='.$imagedata["width"].'x'.$imagedata["height"].']'.$imagedata["src"].'[/img]';
+ if ($url) {
+ $image .= '[/url]';
+ }
+ $image .= "\n";
+ $total_images ++;
+ if($max_images && $max_images >= $total_images)
+ break;
+ }
+ }
+
+ if(strlen($text)) {
+ $text = $br.'[quote]'.trim($text).'[/quote]'.$br ;
+ }
+
+ if($image) {
+ $text = $br.$br.$image.$text;
+ }
+ $title = str_replace(array("\r","\n"),array('',''),$title);
+
+ $result = sprintf($template,$url,($title) ? $title : $url,$text) . $str_tags;
+
+ logger('linkinfo: returns: ' . $result, LOGGER_DEBUG);
+
+ echo trim($result);
+ killme();
+
+ }
+
+
+ public static function deletexnode(&$doc, $node) {
+ $xpath = new \DomXPath($doc);
+ $list = $xpath->query("//".$node);
+ foreach ($list as $child)
+ $child->parentNode->removeChild($child);
+ }
+
+ public static function completeurl($url, $scheme) {
+ $urlarr = parse_url($url);
+
+ if (isset($urlarr["scheme"]))
+ return($url);
+
+ $schemearr = parse_url($scheme);
+
+ $complete = $schemearr["scheme"]."://".$schemearr["host"];
+
+ if ($schemearr["port"] != "")
+ $complete .= ":".$schemearr["port"];
+
+ if(strpos($urlarr['path'],'/') !== 0)
+ $complete .= '/';
+
+ $complete .= $urlarr["path"];
+
+ if ($urlarr["query"] != "")
+ $complete .= "?".$urlarr["query"];
+
+ if ($urlarr["fragment"] != "")
+ $complete .= "#".$urlarr["fragment"];
+
+ return($complete);
+ }
+
+
+ public static function parseurl_getsiteinfo($url) {
+ $siteinfo = array();
+
+
+ $result = z_fetch_url($url,false,0,array('novalidate' => true));
+ if(! $result['success'])
+ return $siteinfo;
+
+ $header = $result['header'];
+ $body = $result['body'];
+
+ $body = mb_convert_encoding($body, 'UTF-8', 'UTF-8');
+ $body = mb_convert_encoding($body, 'HTML-ENTITIES', "UTF-8");
+
+ $doc = new \DOMDocument();
+ @$doc->loadHTML($body);
+
+ self::deletexnode($doc, 'style');
+ self::deletexnode($doc, 'script');
+ self::deletexnode($doc, 'option');
+ self::deletexnode($doc, 'h1');
+ self::deletexnode($doc, 'h2');
+ self::deletexnode($doc, 'h3');
+ self::deletexnode($doc, 'h4');
+ self::deletexnode($doc, 'h5');
+ self::deletexnode($doc, 'h6');
+ self::deletexnode($doc, 'ol');
+ self::deletexnode($doc, 'ul');
+
+ $xpath = new \DomXPath($doc);
+
+ //$list = $xpath->query("head/title");
+ $list = $xpath->query("//title");
+ foreach ($list as $node)
+ $siteinfo["title"] = html_entity_decode($node->nodeValue, ENT_QUOTES, "UTF-8");
+
+ //$list = $xpath->query("head/meta[@name]");
+ $list = $xpath->query("//meta[@name]");
+ foreach ($list as $node) {
+ $attr = array();
+ if ($node->attributes->length)
+ foreach ($node->attributes as $attribute)
+ $attr[$attribute->name] = $attribute->value;
+
+ $attr["content"] = html_entity_decode($attr["content"], ENT_QUOTES, "UTF-8");
+
+ switch (strtolower($attr["name"])) {
+ case 'generator':
+ $siteinfo['generator'] = $attr['content'];
+ break;
+ case "fulltitle":
+ $siteinfo["title"] = $attr["content"];
+ break;
+ case "description":
+ $siteinfo["text"] = $attr["content"];
+ break;
+ case "dc.title":
+ $siteinfo["title"] = $attr["content"];
+ break;
+ case "dc.description":
+ $siteinfo["text"] = $attr["content"];
+ break;
+ }
+ }
+
+ //$list = $xpath->query("head/meta[@property]");
+ $list = $xpath->query("//meta[@property]");
+ foreach ($list as $node) {
+ $attr = array();
+ if ($node->attributes->length)
+ foreach ($node->attributes as $attribute)
+ $attr[$attribute->name] = $attribute->value;
+
+ $attr["content"] = html_entity_decode($attr["content"], ENT_QUOTES, "UTF-8");
+
+ switch (strtolower($attr["property"])) {
+ case "og:image":
+ $siteinfo["image"] = $attr["content"];
+ break;
+ case "og:title":
+ $siteinfo["title"] = $attr["content"];
+ break;
+ case "og:description":
+ $siteinfo["text"] = $attr["content"];
+ break;
+ }
+ }
+
+ if ($siteinfo["image"] == "") {
+ $list = $xpath->query("//img[@src]");
+ foreach ($list as $node) {
+ $attr = array();
+ if ($node->attributes->length)
+ foreach ($node->attributes as $attribute)
+ $attr[$attribute->name] = $attribute->value;
+
+ $src = self::completeurl($attr["src"], $url);
+ $photodata = @getimagesize($src);
+
+ if (($photodata) && ($photodata[0] > 150) and ($photodata[1] > 150)) {
+ if ($photodata[0] > 300) {
+ $photodata[1] = round($photodata[1] * (300 / $photodata[0]));
+ $photodata[0] = 300;
+ }
+ if ($photodata[1] > 300) {
+ $photodata[0] = round($photodata[0] * (300 / $photodata[1]));
+ $photodata[1] = 300;
+ }
+ $siteinfo["images"][] = array("src"=>$src,
+ "width"=>$photodata[0],
+ "height"=>$photodata[1]);
+ }
+
+ }
+ } else {
+ $src = self::completeurl($siteinfo["image"], $url);
+
+ unset($siteinfo["image"]);
+
+ $photodata = @getimagesize($src);
+
+ if (($photodata) && ($photodata[0] > 10) and ($photodata[1] > 10))
+ $siteinfo["images"][] = array("src"=>$src,
+ "width"=>$photodata[0],
+ "height"=>$photodata[1]);
+ }
+
+ if ($siteinfo["text"] == "") {
+ $text = "";
+
+ $list = $xpath->query("//div[@class='article']");
+ foreach ($list as $node)
+ if (strlen($node->nodeValue) > 40)
+ $text .= " ".trim($node->nodeValue);
+
+ if ($text == "") {
+ $list = $xpath->query("//div[@class='content']");
+ foreach ($list as $node)
+ if (strlen($node->nodeValue) > 40)
+ $text .= " ".trim($node->nodeValue);
+ }
+
+ // If none text was found then take the paragraph content
+ if ($text == "") {
+ $list = $xpath->query("//p");
+ foreach ($list as $node)
+ if (strlen($node->nodeValue) > 40)
+ $text .= " ".trim($node->nodeValue);
+ }
+
+ if ($text != "") {
+ $text = trim(str_replace(array("\n", "\r"), array(" ", " "), $text));
+
+ while (strpos($text, " "))
+ $text = trim(str_replace(" ", " ", $text));
+
+ $siteinfo["text"] = html_entity_decode(substr($text,0,350), ENT_QUOTES, "UTF-8").'...';
+ }
+ }
+
+ return($siteinfo);
+ }
+
+
+ private static function arr_add_hashes(&$item,$k) {
+ $item = '#' . $item;
+ }
+
+
+
+
+}
diff --git a/Zotlabs/Module/Lockview.php b/Zotlabs/Module/Lockview.php
new file mode 100644
index 000000000..0df0dd4da
--- /dev/null
+++ b/Zotlabs/Module/Lockview.php
@@ -0,0 +1,121 @@
+<?php
+namespace Zotlabs\Module;
+
+
+
+class Lockview extends \Zotlabs\Web\Controller {
+
+ function get() {
+
+ $type = ((argc() > 1) ? argv(1) : 0);
+ if (is_numeric($type)) {
+ $item_id = intval($type);
+ $type='item';
+ } else {
+ $item_id = ((argc() > 2) ? intval(argv(2)) : 0);
+ }
+
+ if(! $item_id)
+ killme();
+
+ if (!in_array($type, array('item','photo','event', 'menu_item', 'chatroom')))
+ killme();
+
+ //we have different naming in in menu_item table and chatroom table
+ switch($type) {
+ case 'menu_item':
+ $id = 'mitem_id';
+ break;
+ case 'chatroom':
+ $id = 'cr_id';
+ break;
+ default:
+ $id = 'id';
+ break;
+ }
+
+ $r = q("SELECT * FROM %s WHERE $id = %d LIMIT 1",
+ dbesc($type),
+ intval($item_id)
+ );
+
+ if(! $r)
+ killme();
+
+ $item = $r[0];
+
+ //we have different naming in in menu_item table and chatroom table
+ switch($type) {
+ case 'menu_item':
+ $uid = $item['mitem_channel_id'];
+ break;
+ case 'chatroom':
+ $uid = $item['cr_uid'];
+ break;
+ default:
+ $uid = $item['uid'];
+ break;
+ }
+
+ if($uid != local_channel()) {
+ echo '<li>' . t('Remote privacy information not available.') . '</li>';
+ killme();
+ }
+
+ if(($item['item_private'] == 1) && (! strlen($item['allow_cid'])) && (! strlen($item['allow_gid']))
+ && (! strlen($item['deny_cid'])) && (! strlen($item['deny_gid']))) {
+
+ // if the post is private, but public_policy is blank ("visible to the internet"), and there aren't any
+ // specific recipients, we're the recipient of a post with "bcc" or targeted recipients; so we'll just show it
+ // as unknown specific recipients. The sender will have the visibility list and will fall through to the
+ // next section.
+
+ echo '<li>' . translate_scope((! $item['public_policy']) ? 'specific' : $item['public_policy']) . '</li>';
+ killme();
+ }
+
+ $allowed_users = expand_acl($item['allow_cid']);
+ $allowed_groups = expand_acl($item['allow_gid']);
+ $deny_users = expand_acl($item['deny_cid']);
+ $deny_groups = expand_acl($item['deny_gid']);
+
+ $o = '<li>' . t('Visible to:') . '</li>';
+ $l = array();
+
+ stringify_array_elms($allowed_groups,true);
+ stringify_array_elms($allowed_users,true);
+ stringify_array_elms($deny_groups,true);
+ stringify_array_elms($deny_users,true);
+
+ if(count($allowed_groups)) {
+ $r = q("SELECT name FROM `groups` WHERE hash IN ( " . implode(', ', $allowed_groups) . " )");
+ if($r)
+ foreach($r as $rr)
+ $l[] = '<li><b>' . $rr['name'] . '</b></li>';
+ }
+ if(count($allowed_users)) {
+ $r = q("SELECT xchan_name FROM xchan WHERE xchan_hash IN ( " . implode(', ',$allowed_users) . " )");
+ if($r)
+ foreach($r as $rr)
+ $l[] = '<li>' . $rr['xchan_name'] . '</li>';
+ }
+ if(count($deny_groups)) {
+ $r = q("SELECT name FROM `groups` WHERE hash IN ( " . implode(', ', $deny_groups) . " )");
+ if($r)
+ foreach($r as $rr)
+ $l[] = '<li><b><strike>' . $rr['name'] . '</strike></b></li>';
+ }
+ if(count($deny_users)) {
+ $r = q("SELECT xchan_name FROM xchan WHERE xchan_hash IN ( " . implode(', ', $deny_users) . " )");
+ if($r)
+ foreach($r as $rr)
+ $l[] = '<li><strike>' . $rr['xchan_name'] . '</strike></li>';
+ }
+
+ echo $o . implode($l);
+ killme();
+
+
+ }
+
+}
diff --git a/Zotlabs/Module/Locs.php b/Zotlabs/Module/Locs.php
new file mode 100644
index 000000000..4b5d58df5
--- /dev/null
+++ b/Zotlabs/Module/Locs.php
@@ -0,0 +1,132 @@
+<?php
+namespace Zotlabs\Module; /** @file */
+
+
+
+class Locs extends \Zotlabs\Web\Controller {
+
+ function post() {
+
+ if(! local_channel())
+ return;
+
+ $channel = \App::get_channel();
+
+ if($_REQUEST['primary']) {
+ $hubloc_id = intval($_REQUEST['primary']);
+ if($hubloc_id) {
+
+ $r = q("select hubloc_id from hubloc where hubloc_id = %d and hubloc_hash = '%s' limit 1",
+ intval($hubloc_id),
+ dbesc($channel['channel_hash'])
+ );
+
+ if(! $r) {
+ notice( t('Location not found.') . EOL);
+ return;
+ }
+
+ $r = q("update hubloc set hubloc_primary = 0 where hubloc_primary = 1 and hubloc_hash = '%s' ",
+ dbesc($channel['channel_hash'])
+ );
+ $r = q("update hubloc set hubloc_primary = 1 where hubloc_id = %d and hubloc_hash = '%s'",
+ intval($hubloc_id),
+ dbesc($channel['channel_hash'])
+ );
+
+ proc_run('php','include/notifier.php','location',$channel['channel_id']);
+ return;
+ }
+ }
+
+
+ if($_REQUEST['drop']) {
+ $hubloc_id = intval($_REQUEST['drop']);
+
+ if($hubloc_id) {
+ $r = q("select * from hubloc where hubloc_id = %d and hubloc_url != '%s' and hubloc_hash = '%s' limit 1",
+ intval($hubloc_id),
+ dbesc(z_root()),
+ dbesc($channel['channel_hash'])
+ );
+
+ if(! $r) {
+ notice( t('Location not found.') . EOL);
+ return;
+ }
+ if(intval($r[0]['hubloc_primary'])) {
+ $x = q("select hubloc_id from hubloc where hubloc_primary = 1 and hubloc_hash = '%s'",
+ dbesc($channel['channel_hash'])
+ );
+ if(! $x) {
+ notice( t('Location lookup failed.'));
+ return;
+ }
+ if(count($x) == 1) {
+ notice( t('Please select another location to become primary before removing the primary location.') . EOL);
+ return;
+ }
+ }
+
+ $r = q("update hubloc set hubloc_deleted = 1 where hubloc_id = %d and hubloc_hash = '%s'",
+ intval($hubloc_id),
+ dbesc($channel['channel_hash'])
+ );
+ proc_run('php','include/notifier.php','location',$channel['channel_id']);
+ return;
+ }
+ }
+ }
+
+
+
+ function get() {
+
+
+ if(! local_channel()) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ $channel = \App::get_channel();
+
+ if($_REQUEST['sync']) {
+ proc_run('php','include/notifier.php','location',$channel['channel_id']);
+ info( t('Syncing locations') . EOL);
+ goaway(z_root() . '/locs');
+ }
+
+
+ $r = q("select * from hubloc where hubloc_hash = '%s'",
+ dbesc($channel['channel_hash'])
+ );
+
+ if(! $r) {
+ notice( t('No locations found.') . EOL);
+ return;
+ }
+
+
+ for($x = 0; $x < count($r); $x ++) {
+ $r[$x]['primary'] = (intval($r[$x]['hubloc_primary']) ? true : false);
+ $r[$x]['deleted'] = (intval($r[$x]['hubloc_deleted']) ? true : false);
+ }
+
+ $o = replace_macros(get_markup_template('locmanage.tpl'), array(
+ '$header' => t('Manage Channel Locations'),
+ '$loc' => t('Location'),
+ '$addr' => t('Address'),
+ '$mkprm' => t('Primary'),
+ '$drop' => t('Drop'),
+ '$submit' => t('Submit'),
+ '$sync' => t('Sync Now'),
+ '$sync_text' => t('Please wait several minutes between consecutive operations.'),
+ '$drop_text' => t('When possible, drop a location by logging into that website/hub and removing your channel.'),
+ '$last_resort' => t('Use this form to drop the location if the hub is no longer operating.'),
+ '$hubs' => $r
+ ));
+
+ return $o;
+ }
+
+}
diff --git a/Zotlabs/Module/Login.php b/Zotlabs/Module/Login.php
new file mode 100644
index 000000000..ff75e5268
--- /dev/null
+++ b/Zotlabs/Module/Login.php
@@ -0,0 +1,13 @@
+<?php
+namespace Zotlabs\Module;
+
+
+class Login extends \Zotlabs\Web\Controller {
+
+ function get() {
+ if(local_channel())
+ goaway(z_root());
+ return login((\App::$config['system']['register_policy'] == REGISTER_CLOSED) ? false : true);
+ }
+
+}
diff --git a/Zotlabs/Module/Lostpass.php b/Zotlabs/Module/Lostpass.php
new file mode 100644
index 000000000..eeddd0a13
--- /dev/null
+++ b/Zotlabs/Module/Lostpass.php
@@ -0,0 +1,138 @@
+<?php
+namespace Zotlabs\Module;
+
+
+
+class Lostpass extends \Zotlabs\Web\Controller {
+
+ function post() {
+
+ $loginame = notags(trim($_POST['login-name']));
+ if(! $loginame)
+ goaway(z_root());
+
+ $r = q("SELECT * FROM account WHERE account_email = '%s' LIMIT 1",
+ dbesc($loginame)
+ );
+
+ if(! $r) {
+ notice( t('No valid account found.') . EOL);
+ goaway(z_root());
+ }
+
+ $aid = $r[0]['account_id'];
+ $email = $r[0]['account_email'];
+
+ $hash = random_string();
+
+ $r = q("UPDATE account SET account_reset = '%s' WHERE account_id = %d",
+ dbesc($hash),
+ intval($aid)
+ );
+ if($r)
+ info( t('Password reset request issued. Check your email.') . EOL);
+
+ $email_tpl = get_intltext_template("lostpass_eml.tpl");
+ $message = replace_macros($email_tpl, array(
+ '$sitename' => get_config('system','sitename'),
+ '$siteurl' => z_root(),
+ '$username' => sprintf( t('Site Member (%s)'), $email),
+ '$email' => $email,
+ '$reset_link' => z_root() . '/lostpass?verify=' . $hash
+ ));
+
+ $subject = email_header_encode(sprintf( t('Password reset requested at %s'),get_config('system','sitename')), 'UTF-8');
+
+ $res = mail($email, $subject ,
+ $message,
+ 'From: Administrator@' . $_SERVER['SERVER_NAME'] . "\n"
+ . 'Content-type: text/plain; charset=UTF-8' . "\n"
+ . 'Content-transfer-encoding: 8bit' );
+
+
+ goaway(z_root());
+ }
+
+
+ function get() {
+
+
+ if(x($_GET,'verify')) {
+ $verify = $_GET['verify'];
+
+ $r = q("SELECT * FROM account WHERE account_reset = '%s' LIMIT 1",
+ dbesc($verify)
+ );
+ if(! $r) {
+ notice( t("Request could not be verified. (You may have previously submitted it.) Password reset failed.") . EOL);
+ goaway(z_root());
+ return;
+ }
+
+ $aid = $r[0]['account_id'];
+ $email = $r[0]['account_email'];
+
+ $new_password = autoname(6) . mt_rand(100,9999);
+
+ $salt = random_string(32);
+ $password_encoded = hash('whirlpool', $salt . $new_password);
+
+ $r = q("UPDATE account SET account_salt = '%s', account_password = '%s', account_reset = '', account_flags = (account_flags & ~%d) where account_id = %d",
+ dbesc($salt),
+ dbesc($password_encoded),
+ intval(ACCOUNT_UNVERIFIED),
+ intval($aid)
+ );
+
+ if($r) {
+ $tpl = get_markup_template('pwdreset.tpl');
+ $o .= replace_macros($tpl,array(
+ '$lbl1' => t('Password Reset'),
+ '$lbl2' => t('Your password has been reset as requested.'),
+ '$lbl3' => t('Your new password is'),
+ '$lbl4' => t('Save or copy your new password - and then'),
+ '$lbl5' => '<a href="' . z_root() . '/login">' . t('click here to login') . '</a>.',
+ '$lbl6' => t('Your password may be changed from the <em>Settings</em> page after successful login.'),
+ '$newpass' => $new_password,
+ '$baseurl' => z_root()
+
+ ));
+
+ info("Your password has been reset." . EOL);
+
+ $email_tpl = get_intltext_template("passchanged_eml.tpl");
+ $message = replace_macros($email_tpl, array(
+ '$sitename' => \App::$config['sitename'],
+ '$siteurl' => z_root(),
+ '$username' => sprintf( t('Site Member (%s)'), $email),
+ '$email' => $email,
+ '$new_password' => $new_password,
+ '$uid' => $newuid ));
+
+ $subject = email_header_encode( sprintf( t('Your password has changed at %s'), get_config('system','sitename')), 'UTF-8');
+
+ $res = mail($email,$subject,$message,
+ 'From: ' . 'Administrator@' . $_SERVER['SERVER_NAME'] . "\n"
+ . 'Content-type: text/plain; charset=UTF-8' . "\n"
+ . 'Content-transfer-encoding: 8bit' );
+
+ return $o;
+ }
+
+ }
+ else {
+ $tpl = get_markup_template('lostpass.tpl');
+
+ $o .= replace_macros($tpl,array(
+ '$title' => t('Forgot your Password?'),
+ '$desc' => t('Enter your email address and submit to have your password reset. Then check your email for further instructions.'),
+ '$name' => t('Email Address'),
+ '$submit' => t('Reset')
+ ));
+
+ return $o;
+ }
+
+ }
+
+}
diff --git a/Zotlabs/Module/Magic.php b/Zotlabs/Module/Magic.php
new file mode 100644
index 000000000..63db4a317
--- /dev/null
+++ b/Zotlabs/Module/Magic.php
@@ -0,0 +1,173 @@
+<?php
+namespace Zotlabs\Module;
+
+@require_once('include/zot.php');
+
+
+class Magic extends \Zotlabs\Web\Controller {
+
+ function init() {
+
+ $ret = array('success' => false, 'url' => '', 'message' => '');
+ logger('mod_magic: invoked', LOGGER_DEBUG);
+
+ logger('mod_magic: args: ' . print_r($_REQUEST,true),LOGGER_DATA);
+
+ $addr = ((x($_REQUEST,'addr')) ? $_REQUEST['addr'] : '');
+ $dest = ((x($_REQUEST,'dest')) ? $_REQUEST['dest'] : '');
+ $test = ((x($_REQUEST,'test')) ? intval($_REQUEST['test']) : 0);
+ $rev = ((x($_REQUEST,'rev')) ? intval($_REQUEST['rev']) : 0);
+ $delegate = ((x($_REQUEST,'delegate')) ? $_REQUEST['delegate'] : '');
+
+ $parsed = parse_url($dest);
+ if(! $parsed) {
+ if($test) {
+ $ret['message'] .= 'could not parse ' . $dest . EOL;
+ return($ret);
+ }
+ goaway($dest);
+ }
+
+ $basepath = $parsed['scheme'] . '://' . $parsed['host'] . (($parsed['port']) ? ':' . $parsed['port'] : '');
+
+ $x = q("select * from hubloc where hubloc_url = '%s' order by hubloc_connected desc limit 1",
+ dbesc($basepath)
+ );
+
+ if(! $x) {
+
+ /*
+ * We have no records for, or prior communications with this hub.
+ * If an address was supplied, let's finger them to create a hub record.
+ * Otherwise we'll use the special address '[system]' which will return
+ * either a system channel or the first available normal channel. We don't
+ * really care about what channel is returned - we need the hub information
+ * from that response so that we can create signed auth packets destined
+ * for that hub.
+ *
+ */
+
+ $ret = zot_finger((($addr) ? $addr : '[system]@' . $parsed['host']),null);
+ if($ret['success']) {
+ $j = json_decode($ret['body'],true);
+ if($j)
+ import_xchan($j);
+
+ // Now try again
+
+ $x = q("select * from hubloc where hubloc_url = '%s' order by hubloc_connected desc limit 1",
+ dbesc($basepath)
+ );
+ }
+ }
+
+ if(! $x) {
+ if($rev)
+ goaway($dest);
+ else {
+ logger('mod_magic: no channels found for requested hub.' . print_r($_REQUEST,true));
+ if($test) {
+ $ret['message'] .= 'This site has no previous connections with ' . $basepath . EOL;
+ return $ret;
+ }
+ notice( t('Hub not found.') . EOL);
+ return;
+ }
+ }
+
+ // This is ready-made for a plugin that provides a blacklist or "ask me" before blindly authenticating.
+ // By default, we'll proceed without asking.
+
+ $arr = array(
+ 'channel_id' => local_channel(),
+ 'xchan' => $x[0],
+ 'destination' => $dest,
+ 'proceed' => true
+ );
+
+ call_hooks('magic_auth',$arr);
+ $dest = $arr['destination'];
+ if(! $arr['proceed']) {
+ if($test) {
+ $ret['message'] .= 'cancelled by plugin.' . EOL;
+ return $ret;
+ }
+ goaway($dest);
+ }
+
+ if((get_observer_hash()) && ($x[0]['hubloc_url'] === z_root())) {
+ // We are already authenticated on this site and a registered observer.
+ // Just redirect.
+ if($test) {
+ $ret['success'] = true;
+ $ret['message'] .= 'Local site - you are already authenticated.' . EOL;
+ return $ret;
+ }
+
+ $delegation_success = false;
+ if($delegate) {
+ $r = q("select * from channel left join hubloc on channel_hash = hubloc_hash where hubloc_addr = '%s' limit 1",
+ dbesc($delegate)
+ );
+
+ if($r && intval($r[0]['channel_id'])) {
+ $allowed = perm_is_allowed($r[0]['channel_id'],get_observer_hash(),'delegate');
+ if($allowed) {
+ $_SESSION['delegate_channel'] = $r[0]['channel_id'];
+ $_SESSION['delegate'] = get_observer_hash();
+ $_SESSION['account_id'] = intval($r[0]['channel_account_id']);
+ change_channel($r[0]['channel_id']);
+
+ $delegation_success = true;
+ }
+ }
+ }
+
+
+
+ // FIXME: check and honour local delegation
+
+
+ goaway($dest);
+ }
+
+ if(local_channel()) {
+ $channel = \App::get_channel();
+
+ $token = random_string();
+ $token_sig = base64url_encode(rsa_sign($token,$channel['channel_prvkey']));
+
+ $channel['token'] = $token;
+ $channel['token_sig'] = $token_sig;
+
+ \Zotlabs\Zot\Verify::create('auth',$channel['channel_id'],$token,$x[0]['hubloc_url']);
+
+ $target_url = $x[0]['hubloc_callback'] . '/?f=&auth=' . urlencode($channel['channel_address'] . '@' . \App::get_hostname())
+ . '&sec=' . $token . '&dest=' . urlencode($dest) . '&version=' . ZOT_REVISION;
+
+ if($delegate)
+ $target_url .= '&delegate=' . urlencode($delegate);
+
+ logger('mod_magic: redirecting to: ' . $target_url, LOGGER_DEBUG);
+
+ if($test) {
+ $ret['success'] = true;
+ $ret['url'] = $target_url;
+ $ret['message'] = 'token ' . $token . ' created for channel ' . $channel['channel_id'] . ' for url ' . $x[0]['hubloc_url'] . EOL;
+ return $ret;
+ }
+
+ goaway($target_url);
+
+ }
+
+ if($test) {
+ $ret['message'] = 'Not authenticated or invalid arguments to mod_magic' . EOL;
+ return $ret;
+ }
+
+ goaway($dest);
+
+ }
+
+}
diff --git a/Zotlabs/Module/Mail.php b/Zotlabs/Module/Mail.php
new file mode 100644
index 000000000..35cb3b9bf
--- /dev/null
+++ b/Zotlabs/Module/Mail.php
@@ -0,0 +1,397 @@
+<?php
+namespace Zotlabs\Module;
+
+require_once('include/acl_selectors.php');
+require_once('include/message.php');
+require_once('include/zot.php');
+require_once("include/bbcode.php");
+require_once('include/Contact.php');
+
+
+
+class Mail extends \Zotlabs\Web\Controller {
+
+ function post() {
+
+ if(! local_channel())
+ return;
+
+ $replyto = ((x($_REQUEST,'replyto')) ? notags(trim($_REQUEST['replyto'])) : '');
+ $subject = ((x($_REQUEST,'subject')) ? notags(trim($_REQUEST['subject'])) : '');
+ $body = ((x($_REQUEST,'body')) ? escape_tags(trim($_REQUEST['body'])) : '');
+ $recipient = ((x($_REQUEST,'messageto')) ? notags(trim($_REQUEST['messageto'])) : '');
+ $rstr = ((x($_REQUEST,'messagerecip')) ? notags(trim($_REQUEST['messagerecip'])) : '');
+ $preview = ((x($_REQUEST,'preview')) ? intval($_REQUEST['preview']) : 0);
+ $expires = ((x($_REQUEST,'expires')) ? datetime_convert(date_default_timezone_get(),'UTC', $_REQUEST['expires']) : NULL_DATE);
+
+ // If we have a raw string for a recipient which hasn't been auto-filled,
+ // it means they probably aren't in our address book, hence we don't know
+ // if we have permission to send them private messages.
+ // finger them and find out before we try and send it.
+
+ if(! $recipient) {
+ $channel = \App::get_channel();
+
+ $ret = zot_finger($rstr,$channel);
+
+ if(! $ret['success']) {
+ notice( t('Unable to lookup recipient.') . EOL);
+ return;
+ }
+ $j = json_decode($ret['body'],true);
+
+ logger('message_post: lookup: ' . $url . ' ' . print_r($j,true));
+
+ if(! ($j['success'] && $j['guid'])) {
+ notice( t('Unable to communicate with requested channel.'));
+ return;
+ }
+
+ $x = import_xchan($j);
+
+ if(! $x['success']) {
+ notice( t('Cannot verify requested channel.'));
+ return;
+ }
+
+ $recipient = $x['hash'];
+
+ $their_perms = 0;
+
+ $global_perms = get_perms();
+
+ if($j['permissions']['data']) {
+ $permissions = crypto_unencapsulate($j['permissions'],$channel['channel_prvkey']);
+ if($permissions)
+ $permissions = json_decode($permissions);
+ logger('decrypted permissions: ' . print_r($permissions,true), LOGGER_DATA);
+ }
+ else
+ $permissions = $j['permissions'];
+
+ foreach($permissions as $k => $v) {
+ if($v) {
+ $their_perms = $their_perms | intval($global_perms[$k][1]);
+ }
+ }
+
+ if(! ($their_perms & PERMS_W_MAIL)) {
+ notice( t('Selected channel has private message restrictions. Send failed.'));
+ // reported issue: let's still save the message and continue. We'll just tell them
+ // that nothing useful is likely to happen. They might have spent hours on it.
+ // return;
+
+ }
+ }
+
+ // if(feature_enabled(local_channel(),'richtext')) {
+ // $body = fix_mce_lf($body);
+ // }
+
+ require_once('include/text.php');
+ linkify_tags($a, $body, local_channel());
+
+ if($preview) {
+
+
+
+
+ }
+
+ if(! $recipient) {
+ notice('No recipient found.');
+ \App::$argc = 2;
+ \App::$argv[1] = 'new';
+ return;
+ }
+
+ // We have a local_channel, let send_message use the session channel and save a lookup
+
+ $ret = send_message(0, $recipient, $body, $subject, $replyto, $expires);
+
+ if($ret['success']) {
+ xchan_mail_query($ret['mail']);
+ build_sync_packet(0,array('conv' => array($ret['conv']),'mail' => array(encode_mail($ret['mail'],true))));
+ }
+ else {
+ notice($ret['message']);
+ }
+
+ goaway(z_root() . '/mail/combined');
+
+ }
+
+ function get() {
+
+ $o = '';
+ nav_set_selected('messages');
+
+ if(! local_channel()) {
+ notice( t('Permission denied.') . EOL);
+ return login();
+ }
+
+ $channel = \App::get_channel();
+
+ head_set_icon($channel['xchan_photo_s']);
+
+ $cipher = get_pconfig(local_channel(),'system','default_cipher');
+ if(! $cipher)
+ $cipher = 'aes256';
+
+ $tpl = get_markup_template('mail_head.tpl');
+ $header = replace_macros($tpl, array(
+ '$header' => t('Messages'),
+ ));
+
+ if((argc() == 4) && (argv(2) === 'drop')) {
+ if(! intval(argv(3)))
+ return;
+ $cmd = argv(2);
+ $mailbox = argv(1);
+ $r = private_messages_drop(local_channel(), argv(3));
+ if($r) {
+ //info( t('Message deleted.') . EOL );
+ }
+ goaway(z_root() . '/mail/' . $mailbox);
+ }
+
+ if((argc() == 4) && (argv(2) === 'recall')) {
+ if(! intval(argv(3)))
+ return;
+ $cmd = argv(2);
+ $mailbox = argv(1);
+ $r = q("update mail set mail_recalled = 1 where id = %d and channel_id = %d",
+ intval(argv(3)),
+ intval(local_channel())
+ );
+ $x = q("select * from mail where id = %d and channel_id = %d",
+ intval(argv(3)),
+ intval(local_channel())
+ );
+ if($x) {
+ build_sync_packet(local_channel(),array('mail' => encode_mail($x[0],true)));
+ }
+
+ proc_run('php','include/notifier.php','mail',intval(argv(3)));
+
+ if($r) {
+ info( t('Message recalled.') . EOL );
+ }
+ goaway(z_root() . '/mail/' . $mailbox . '/' . argv(3));
+
+ }
+
+ if((argc() == 4) && (argv(2) === 'dropconv')) {
+ if(! intval(argv(3)))
+ return;
+ $cmd = argv(2);
+ $mailbox = argv(1);
+ $r = private_messages_drop(local_channel(), argv(3), true);
+ if($r)
+ info( t('Conversation removed.') . EOL );
+ goaway(z_root() . '/mail/' . $mailbox);
+ }
+
+ if((argc() > 1) && (argv(1) === 'new')) {
+
+ $plaintext = true;
+
+ $tpl = get_markup_template('msg-header.tpl');
+
+ $header = replace_macros($tpl, array(
+ '$baseurl' => z_root(),
+ '$editselect' => (($plaintext) ? 'none' : '/(profile-jot-text|prvmail-text)/'),
+ '$nickname' => $channel['channel_address'],
+ '$linkurl' => t('Please enter a link URL:'),
+ '$expireswhen' => t('Expires YYYY-MM-DD HH:MM')
+ ));
+
+ \App::$page['htmlhead'] .= $header;
+
+ $prename = '';
+ $preid = '';
+
+ if(x($_REQUEST,'hash')) {
+
+ $r = q("select abook.*, xchan.* from abook left join xchan on abook_xchan = xchan_hash
+ where abook_channel = %d and abook_xchan = '%s' limit 1",
+ intval(local_channel()),
+ dbesc($_REQUEST['hash'])
+ );
+
+ if(!$r) {
+ $r = q("select * from xchan where xchan_hash = '%s' and xchan_network = 'zot' limit 1",
+ dbesc($_REQUEST['hash'])
+ );
+ }
+
+ if($r) {
+ $prename = (($r[0]['abook_id']) ? $r[0]['xchan_name'] : $r[0]['xchan_addr']);
+ $preurl = $r[0]['xchan_url'];
+ $preid = (($r[0]['abook_id']) ? ($r[0]['xchan_hash']) : '');
+ }
+ else {
+ notice( t('Requested channel is not in this network') . EOL );
+ }
+
+ }
+
+ $tpl = get_markup_template('prv_message.tpl');
+ $o .= replace_macros($tpl,array(
+ '$new' => true,
+ '$header' => t('Send Private Message'),
+ '$to' => t('To:'),
+ '$prefill' => $prename,
+ '$preid' => $preid,
+ '$subject' => t('Subject:'),
+ '$subjtxt' => ((x($_REQUEST,'subject')) ? strip_tags($_REQUEST['subject']) : ''),
+ '$text' => ((x($_REQUEST,'body')) ? htmlspecialchars($_REQUEST['body'], ENT_COMPAT, 'UTF-8') : ''),
+ '$yourmessage' => t('Your message:'),
+ '$parent' => '',
+ '$attach' => t('Attach file'),
+ '$insert' => t('Insert web link'),
+ '$submit' => t('Send'),
+ '$defexpire' => '',
+ '$feature_expire' => ((feature_enabled(local_channel(),'content_expire')) ? true : false),
+ '$expires' => t('Set expiration date'),
+ '$feature_encrypt' => ((feature_enabled(local_channel(),'content_encrypt')) ? true : false),
+ '$encrypt' => t('Encrypt text'),
+ '$cipher' => $cipher,
+ ));
+
+ return $o;
+ }
+
+ switch(argv(1)) {
+ case 'combined':
+ $mailbox = 'combined';
+ break;
+ case 'inbox':
+ $mailbox = 'inbox';
+ break;
+ case 'outbox':
+ $mailbox = 'outbox';
+ break;
+ default:
+ $mailbox = 'combined';
+ break;
+ }
+
+ $last_message = private_messages_list(local_channel(), $mailbox, 0, 1);
+
+ $mid = ((argc() > 2) && (intval(argv(2)))) ? argv(2) : $last_message[0]['id'];
+
+ $plaintext = true;
+
+ // if( local_channel() && feature_enabled(local_channel(),'richtext') )
+ // $plaintext = false;
+
+
+
+ if($mailbox == 'combined') {
+ $messages = private_messages_fetch_conversation(local_channel(), $mid, true);
+ }
+ else {
+ $messages = private_messages_fetch_message(local_channel(), $mid, true);
+ }
+
+ if(! $messages) {
+ //info( t('Message not found.') . EOL);
+ return;
+ }
+
+ if($messages[0]['to_xchan'] === $channel['channel_hash'])
+ \App::$poi = $messages[0]['from'];
+ else
+ \App::$poi = $messages[0]['to'];
+
+ // require_once('include/Contact.php');
+
+ // \App::set_widget('mail_conversant',vcard_from_xchan(\App::$poi,$get_observer_hash,'mail'));
+
+
+ $tpl = get_markup_template('msg-header.tpl');
+
+ \App::$page['htmlhead'] .= replace_macros($tpl, array(
+ '$nickname' => $channel['channel_address'],
+ '$baseurl' => z_root(),
+ '$editselect' => (($plaintext) ? 'none' : '/(profile-jot-text|prvmail-text)/'),
+ '$linkurl' => t('Please enter a link URL:'),
+ '$expireswhen' => t('Expires YYYY-MM-DD HH:MM')
+ ));
+
+ $mails = array();
+
+ $seen = 0;
+ $unknown = false;
+
+ foreach($messages as $message) {
+
+ $s = theme_attachments($message);
+
+ $mails[] = array(
+ 'mailbox' => $mailbox,
+ 'id' => $message['id'],
+ 'mid' => $message['mid'],
+ 'from_name' => $message['from']['xchan_name'],
+ 'from_url' => chanlink_hash($message['from_xchan']),
+ 'from_photo' => $message['from']['xchan_photo_s'],
+ 'to_name' => $message['to']['xchan_name'],
+ 'to_url' => chanlink_hash($message['to_xchan']),
+ 'to_photo' => $message['to']['xchan_photo_s'],
+ 'subject' => $message['title'],
+ 'body' => smilies(bbcode($message['body'])),
+ 'attachments' => $s,
+ 'delete' => t('Delete message'),
+ 'dreport' => t('Delivery report'),
+ 'recall' => t('Recall message'),
+ 'can_recall' => (($channel['channel_hash'] == $message['from_xchan']) ? true : false),
+ 'is_recalled' => (intval($message['mail_recalled']) ? t('Message has been recalled.') : ''),
+ 'date' => datetime_convert('UTC',date_default_timezone_get(),$message['created'], 'c'),
+ );
+
+ $seen = $message['seen'];
+
+ }
+
+ $recp = (($message['from_xchan'] === $channel['channel_hash']) ? 'to' : 'from');
+
+ $tpl = get_markup_template('mail_display.tpl');
+ $o = replace_macros($tpl, array(
+ '$mailbox' => $mailbox,
+ '$prvmsg_header' => $message['title'],
+ '$thread_id' => $mid,
+ '$thread_subject' => $message['title'],
+ '$thread_seen' => $seen,
+ '$delete' => t('Delete Conversation'),
+ '$canreply' => (($unknown) ? false : '1'),
+ '$unknown_text' => t("No secure communications available. You <strong>may</strong> be able to respond from the sender's profile page."),
+ '$mails' => $mails,
+
+ // reply
+ '$header' => t('Send Reply'),
+ '$to' => t('To:'),
+ '$reply' => true,
+ '$subject' => t('Subject:'),
+ '$subjtxt' => $message['title'],
+ '$yourmessage' => sprintf(t('Your message for %s (%s):'), $message[$recp]['xchan_name'], $message[$recp]['xchan_addr']),
+ '$text' => '',
+ '$parent' => $message['parent_mid'],
+ '$recphash' => $message[$recp]['xchan_hash'],
+ '$attach' => t('Attach file'),
+ '$insert' => t('Insert web link'),
+ '$submit' => t('Submit'),
+ '$defexpire' => '',
+ '$feature_expire' => ((feature_enabled(local_channel(),'content_expire')) ? true : false),
+ '$expires' => t('Set expiration date'),
+ '$feature_encrypt' => ((feature_enabled(local_channel(),'content_encrypt')) ? true : false),
+ '$encrypt' => t('Encrypt text'),
+ '$cipher' => $cipher,
+ ));
+
+ return $o;
+
+ }
+
+}
diff --git a/Zotlabs/Module/Manage.php b/Zotlabs/Module/Manage.php
new file mode 100644
index 000000000..fee202263
--- /dev/null
+++ b/Zotlabs/Module/Manage.php
@@ -0,0 +1,181 @@
+<?php
+namespace Zotlabs\Module;
+
+
+class Manage extends \Zotlabs\Web\Controller {
+
+ function get() {
+
+ if((! get_account_id()) || ($_SESSION['delegate'])) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ require_once('include/security.php');
+
+ $change_channel = ((argc() > 1) ? intval(argv(1)) : 0);
+
+ if((argc() > 2) && (argv(2) === 'default')) {
+ $r = q("select channel_id from channel where channel_id = %d and channel_account_id = %d limit 1",
+ intval($change_channel),
+ intval(get_account_id())
+ );
+ if($r) {
+ q("update account set account_default_channel = %d where account_id = %d",
+ intval($change_channel),
+ intval(get_account_id())
+ );
+ }
+ goaway(z_root() . '/manage');
+ }
+
+ if($change_channel) {
+ $r = change_channel($change_channel);
+
+ if((argc() > 2) && !(argv(2) === 'default')) {
+ goaway(z_root() . '/' . implode('/',array_slice(\App::$argv,2))); // Go to whatever is after /manage/, but with the new channel
+ }
+ else {
+ if($r && $r['channel_startpage'])
+ goaway(z_root() . '/' . $r['channel_startpage']); // If nothing extra is specified, go to the default page
+ }
+ goaway(z_root());
+ }
+
+ $channels = null;
+
+ if(local_channel()) {
+ $r = q("select channel.*, xchan.* from channel left join xchan on channel.channel_hash = xchan.xchan_hash where channel.channel_account_id = %d and channel_removed = 0 order by channel_name ",
+ intval(get_account_id())
+ );
+
+ $account = \App::get_account();
+
+ if($r && count($r)) {
+ $channels = $r;
+ for($x = 0; $x < count($channels); $x ++) {
+ $channels[$x]['link'] = 'manage/' . intval($channels[$x]['channel_id']);
+ $channels[$x]['default'] = (($channels[$x]['channel_id'] == $account['account_default_channel']) ? "1" : '');
+ $channels[$x]['default_links'] = '1';
+
+
+ $c = q("SELECT id, item_wall FROM item
+ WHERE item_unseen = 1 and uid = %d " . item_normal(),
+ intval($channels[$x]['channel_id'])
+ );
+
+ if($c) {
+ foreach ($c as $it) {
+ if(intval($it['item_wall']))
+ $channels[$x]['home'] ++;
+ else
+ $channels[$x]['network'] ++;
+ }
+ }
+
+
+ $intr = q("SELECT COUNT(abook.abook_id) AS total FROM abook left join xchan on abook.abook_xchan = xchan.xchan_hash where abook_channel = %d and abook_pending = 1 and abook_self = 0 and abook_ignored = 0 and xchan_deleted = 0 and xchan_orphan = 0 ",
+ intval($channels[$x]['channel_id'])
+ );
+
+ if($intr)
+ $channels[$x]['intros'] = intval($intr[0]['total']);
+
+
+ $mails = q("SELECT count(id) as total from mail WHERE channel_id = %d AND mail_seen = 0 and from_xchan != '%s' ",
+ intval($channels[$x]['channel_id']),
+ dbesc($channels[$x]['channel_hash'])
+ );
+
+ if($mails)
+ $channels[$x]['mail'] = intval($mails[0]['total']);
+
+
+ $events = q("SELECT type, start, adjust FROM `event`
+ WHERE `event`.`uid` = %d AND start < '%s' AND start > '%s' and `ignore` = 0
+ ORDER BY `start` ASC ",
+ intval($channels[$x]['channel_id']),
+ dbesc(datetime_convert('UTC', date_default_timezone_get(), 'now + 7 days')),
+ dbesc(datetime_convert('UTC', date_default_timezone_get(), 'now - 1 days'))
+ );
+
+ if($events) {
+ $channels[$x]['all_events'] = count($events);
+
+ if($channels[$x]['all_events']) {
+ $str_now = datetime_convert('UTC', date_default_timezone_get(), 'now', 'Y-m-d');
+ foreach($events as $e) {
+ $bd = false;
+ if($e['type'] === 'birthday') {
+ $channels[$x]['birthdays'] ++;
+ $bd = true;
+ }
+ else {
+ $channels[$x]['events'] ++;
+ }
+ if(datetime_convert('UTC', ((intval($e['adjust'])) ? date_default_timezone_get() : 'UTC'), $e['start'], 'Y-m-d') === $str_now) {
+ $channels[$x]['all_events_today'] ++;
+ if($bd)
+ $channels[$x]['birthdays_today'] ++;
+ else
+ $channels[$x]['events_today'] ++;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ $r = q("select count(channel_id) as total from channel where channel_account_id = %d and channel_removed = 0",
+ intval(get_account_id())
+ );
+ $limit = account_service_class_fetch(get_account_id(),'total_identities');
+ if($limit !== false) {
+ $channel_usage_message = sprintf( t("You have created %1$.0f of %2$.0f allowed channels."), $r[0]['total'], $limit);
+ }
+ else {
+ $channel_usage_message = '';
+ }
+ }
+
+ $create = array( 'new_channel', t('Create a new channel'), t('Create New'));
+
+ $delegates = q("select * from abook left join xchan on abook_xchan = xchan_hash where
+ abook_channel = %d and (abook_their_perms & %d) > 0",
+ intval(local_channel()),
+ intval(PERMS_A_DELEGATE)
+ );
+
+ if($delegates) {
+ for($x = 0; $x < count($delegates); $x ++) {
+ $delegates[$x]['link'] = 'magic?f=&dest=' . urlencode($delegates[$x]['xchan_url'])
+ . '&delegate=' . urlencode($delegates[$x]['xchan_addr']);
+ $delegates[$x]['channel_name'] = $delegates[$x]['xchan_name'];
+ $delegates[$x]['delegate'] = 1;
+ }
+ }
+ else {
+ $delegates = null;
+ }
+
+ $o = replace_macros(get_markup_template('channels.tpl'), array(
+ '$header' => t('Channel Manager'),
+ '$msg_selected' => t('Current Channel'),
+ '$selected' => local_channel(),
+ '$desc' => t('Switch to one of your channels by selecting it.'),
+ '$msg_default' => t('Default Channel'),
+ '$msg_make_default' => t('Make Default'),
+ '$create' => $create,
+ '$all_channels' => $channels,
+ '$mail_format' => t('%d new messages'),
+ '$intros_format' => t('%d new introductions'),
+ '$channel_usage_message' => $channel_usage_message,
+ '$delegated_desc' => t('Delegated Channel'),
+ '$delegates' => $delegates
+ ));
+
+ return $o;
+
+ }
+
+}
diff --git a/Zotlabs/Module/Match.php b/Zotlabs/Module/Match.php
new file mode 100644
index 000000000..c422e4b3e
--- /dev/null
+++ b/Zotlabs/Module/Match.php
@@ -0,0 +1,84 @@
+<?php
+namespace Zotlabs\Module;
+
+/**
+ * @brief Controller for /match.
+ *
+ * It takes keywords from your profile and queries the directory server for
+ * matching keywords from other profiles.
+ *
+ * @FIXME this has never been properly ported from Friendica.
+ *
+ * @param App &$a
+ * @return void|string
+ */
+
+class Match extends \Zotlabs\Web\Controller {
+
+ function get() {
+
+ $o = '';
+ if (! local_channel())
+ return;
+
+ $_SESSION['return_url'] = z_root() . '/' . \App::$cmd;
+
+ $o .= '<h2>' . t('Profile Match') . '</h2>';
+
+ $r = q("SELECT `keywords` FROM `profile` WHERE `is_default` = 1 AND `uid` = %d LIMIT 1",
+ intval(local_channel())
+ );
+ if (! count($r))
+ return;
+
+ if (! $r[0]['keywords']) {
+ notice( t('No keywords to match. Please add keywords to your default profile.') . EOL);
+ return;
+ }
+
+ $params = array();
+ $tags = trim($r[0]['keywords']);
+
+ if ($tags) {
+ $params['s'] = $tags;
+ if (\App::$pager['page'] != 1)
+ $params['p'] = \App::$pager['page'];
+
+ // if(strlen(get_config('system','directory_submit_url')))
+ // $x = post_url('http://dir.friendica.com/msearch', $params);
+ // else
+ // $x = post_url(z_root() . '/msearch', $params);
+
+ $j = json_decode($x);
+
+ if ($j->total) {
+ \App::set_pager_total($j->total);
+ \App::set_pager_itemspage($j->items_page);
+ }
+
+ if (count($j->results)) {
+ $tpl = get_markup_template('match.tpl');
+ foreach ($j->results as $jj) {
+ $connlnk = z_root() . '/follow/?url=' . $jj->url;
+ $o .= replace_macros($tpl,array(
+ '$url' => zid($jj->url),
+ '$name' => $jj->name,
+ '$photo' => $jj->photo,
+ '$inttxt' => ' ' . t('is interested in:'),
+ '$conntxt' => t('Connect'),
+ '$connlnk' => $connlnk,
+ '$tags' => $jj->tags
+ ));
+ }
+ } else {
+ info( t('No matches') . EOL);
+ }
+ }
+
+ $o .= cleardiv();
+ $o .= paginate($a);
+
+ return $o;
+ }
+
+}
diff --git a/Zotlabs/Module/Menu.php b/Zotlabs/Module/Menu.php
new file mode 100644
index 000000000..9ada63911
--- /dev/null
+++ b/Zotlabs/Module/Menu.php
@@ -0,0 +1,173 @@
+<?php
+namespace Zotlabs\Module;
+
+require_once('include/menu.php');
+require_once('include/identity.php');
+
+
+class Menu extends \Zotlabs\Web\Controller {
+
+ function init() {
+ if (array_key_exists('sys', $_REQUEST) && $_REQUEST['sys'] && is_site_admin()) {
+ $sys = get_sys_channel();
+ if ($sys && intval($sys['channel_id'])) {
+ \App::$is_sys = true;
+ }
+ }
+ }
+
+ function post() {
+
+ $uid = local_channel();
+
+ if(array_key_exists('sys', $_REQUEST) && $_REQUEST['sys'] && is_site_admin()) {
+ $sys = get_sys_channel();
+ $uid = intval($sys['channel_id']);
+ \App::$is_sys = true;
+ }
+
+ if(! $uid)
+ return;
+
+ $_REQUEST['menu_channel_id'] = $uid;
+
+ if($_REQUEST['menu_bookmark'])
+ $_REQUEST['menu_flags'] |= MENU_BOOKMARK;
+ if($_REQUEST['menu_system'])
+ $_REQUEST['menu_flags'] |= MENU_SYSTEM;
+
+ $menu_id = ((argc() > 1) ? intval(argv(1)) : 0);
+ if($menu_id) {
+ $_REQUEST['menu_id'] = intval(argv(1));
+ $r = menu_edit($_REQUEST);
+ if($r) {
+ menu_sync_packet($uid,get_observer_hash(),$menu_id);
+ //info( t('Menu updated.') . EOL);
+ goaway(z_root() . '/mitem/' . $menu_id . ((\App::$is_sys) ? '?f=&sys=1' : ''));
+ }
+ else
+ notice( t('Unable to update menu.'). EOL);
+ }
+ else {
+ $r = menu_create($_REQUEST);
+ if($r) {
+ menu_sync_packet($uid,get_observer_hash(),$r);
+
+ //info( t('Menu created.') . EOL);
+ goaway(z_root() . '/mitem/' . $r . ((\App::$is_sys) ? '?f=&sys=1' : ''));
+ }
+ else
+ notice( t('Unable to create menu.'). EOL);
+
+ }
+ }
+
+
+
+
+ function get() {
+
+ $uid = local_channel();
+
+ if (\App::$is_sys && is_site_admin()) {
+ $sys = get_sys_channel();
+ $uid = intval($sys['channel_id']);
+ }
+
+ if(! $uid) {
+ notice( t('Permission denied.') . EOL);
+ return '';
+ }
+
+ if(argc() == 1) {
+
+
+
+ // list menus
+ $x = menu_list($uid);
+ if($x) {
+ for($y = 0; $y < count($x); $y ++) {
+ $m = menu_fetch($x[$y]['menu_name'],$uid,get_observer_hash());
+ if($m)
+ $x[$y]['element'] = '[element]' . base64url_encode(json_encode(menu_element($m))) . '[/element]';
+ $x[$y]['bookmark'] = (($x[$y]['menu_flags'] & MENU_BOOKMARK) ? true : false);
+ }
+ }
+
+ $create = replace_macros(get_markup_template('menuedit.tpl'), array(
+ '$menu_name' => array('menu_name', t('Menu Name'), '', t('Unique name (not visible on webpage) - required'), '*'),
+ '$menu_desc' => array('menu_desc', t('Menu Title'), '', t('Visible on webpage - leave empty for no title'), ''),
+ '$menu_bookmark' => array('menu_bookmark', t('Allow Bookmarks'), 0 , t('Menu may be used to store saved bookmarks'), array(t('No'), t('Yes'))),
+ '$submit' => t('Submit and proceed'),
+ '$sys' => \App::$is_sys,
+ '$display' => 'none'
+ ));
+
+ $o = replace_macros(get_markup_template('menulist.tpl'),array(
+ '$title' => t('Menus'),
+ '$create' => $create,
+ '$menus' => $x,
+ '$nametitle' => t('Menu Name'),
+ '$desctitle' => t('Menu Title'),
+ '$edit' => t('Edit'),
+ '$drop' => t('Drop'),
+ '$created' => t('Created'),
+ '$edited' => t('Edited'),
+ '$new' => t('New'),
+ '$bmark' => t('Bookmarks allowed'),
+ '$hintnew' => t('Create'),
+ '$hintdrop' => t('Delete this menu'),
+ '$hintcontent' => t('Edit menu contents'),
+ '$hintedit' => t('Edit this menu'),
+ '$sys' => \App::$is_sys
+ ));
+
+ return $o;
+
+ }
+
+ if(argc() > 1) {
+ if(intval(argv(1))) {
+
+ if(argc() == 3 && argv(2) == 'drop') {
+ menu_sync_packet($uid,get_observer_hash(),intval(argv(1)),true);
+ $r = menu_delete_id(intval(argv(1)),$uid);
+ if(!$r)
+ notice( t('Menu could not be deleted.'). EOL);
+
+ goaway(z_root() . '/menu' . ((\App::$is_sys) ? '?f=&sys=1' : ''));
+ }
+
+ $m = menu_fetch_id(intval(argv(1)),$uid);
+
+ if(! $m) {
+ notice( t('Menu not found.') . EOL);
+ return '';
+ }
+
+ $o = replace_macros(get_markup_template('menuedit.tpl'), array(
+ '$header' => t('Edit Menu'),
+ '$sys' => \App::$is_sys,
+ '$menu_id' => intval(argv(1)),
+ '$menu_edit_link' => 'mitem/' . intval(argv(1)) . ((\App::$is_sys) ? '?f=&sys=1' : ''),
+ '$hintedit' => t('Add or remove entries to this menu'),
+ '$editcontents' => t('Edit menu contents'),
+ '$menu_name' => array('menu_name', t('Menu name'), $m['menu_name'], t('Must be unique, only seen by you'), '*'),
+ '$menu_desc' => array('menu_desc', t('Menu title'), $m['menu_desc'], t('Menu title as seen by others'), ''),
+ '$menu_bookmark' => array('menu_bookmark', t('Allow bookmarks'), (($m['menu_flags'] & MENU_BOOKMARK) ? 1 : 0), t('Menu may be used to store saved bookmarks'), array(t('No'), t('Yes'))),
+ '$menu_system' => (($m['menu_flags'] & MENU_SYSTEM) ? 1 : 0),
+ '$submit' => t('Submit and proceed')
+ ));
+
+ return $o;
+
+ }
+ else {
+ notice( t('Not found.') . EOL);
+ return;
+ }
+ }
+
+ }
+
+}
diff --git a/Zotlabs/Module/Message.php b/Zotlabs/Module/Message.php
new file mode 100644
index 000000000..58a138899
--- /dev/null
+++ b/Zotlabs/Module/Message.php
@@ -0,0 +1,110 @@
+<?php
+namespace Zotlabs\Module;
+
+require_once('include/acl_selectors.php');
+require_once('include/message.php');
+require_once('include/zot.php');
+require_once("include/bbcode.php");
+require_once('include/Contact.php');
+
+
+
+class Message extends \Zotlabs\Web\Controller {
+
+ function get() {
+
+ $o = '';
+ nav_set_selected('messages');
+
+ if(! local_channel()) {
+ notice( t('Permission denied.') . EOL);
+ return login();
+ }
+
+ $channel = \App::get_channel();
+ head_set_icon($channel['xchan_photo_s']);
+
+ $cipher = get_pconfig(local_channel(),'system','default_cipher');
+ if(! $cipher)
+ $cipher = 'aes256';
+
+ /*
+ if((argc() == 3) && (argv(1) === 'dropconv')) {
+ if(! intval(argv(2)))
+ return;
+ $cmd = argv(1);
+ $r = private_messages_drop(local_channel(), argv(2), true);
+ if($r)
+ info( t('Conversation removed.') . EOL );
+ goaway(z_root() . '/mail/combined' );
+ }
+
+ if(argc() == 2) {
+
+ switch(argv(1)) {
+ case 'combined':
+ $mailbox = 'combined';
+ $header = t('Conversations');
+ break;
+ case 'inbox':
+ $mailbox = 'inbox';
+ $header = t('Received Messages');
+ break;
+ case 'outbox':
+ $mailbox = 'outbox';
+ $header = t('Sent Messages');
+ break;
+ default:
+ break;
+ }
+
+ // private_messages_list() can do other more complicated stuff, for now keep it simple
+
+ $r = private_messages_list(local_channel(), $mailbox, \App::$pager['start'], \App::$pager['itemspage']);
+
+ if(! $r) {
+ info( t('No messages.') . EOL);
+ return $o;
+ }
+
+ $messages = array();
+
+ foreach($r as $rr) {
+
+ $messages[] = array(
+ 'id' => $rr['id'],
+ 'from_name' => $rr['from']['xchan_name'],
+ 'from_url' => chanlink_hash($rr['from_xchan']),
+ 'from_photo' => $rr['from']['xchan_photo_s'],
+ 'to_name' => $rr['to']['xchan_name'],
+ 'to_url' => chanlink_hash($rr['to_xchan']),
+ 'to_photo' => $rr['to']['xchan_photo_s'],
+ 'subject' => (($rr['seen']) ? $rr['title'] : '<strong>' . $rr['title'] . '</strong>'),
+ 'delete' => t('Delete conversation'),
+ 'body' => smilies(bbcode($rr['body'])),
+ 'date' => datetime_convert('UTC',date_default_timezone_get(),$rr['created'], t('D, d M Y - g:i A')),
+ 'seen' => $rr['seen']
+ );
+ }
+
+
+ $tpl = get_markup_template('mail_head.tpl');
+ $o = replace_macros($tpl, array(
+ '$header' => $header,
+ '$messages' => $messages
+ ));
+
+
+ $o .= alt_pager($a,count($r));
+
+ return $o;
+
+ return;
+
+ }
+ */
+
+ return;
+ }
+
+}
diff --git a/Zotlabs/Module/Mitem.php b/Zotlabs/Module/Mitem.php
new file mode 100644
index 000000000..b64b50c8e
--- /dev/null
+++ b/Zotlabs/Module/Mitem.php
@@ -0,0 +1,245 @@
+<?php
+namespace Zotlabs\Module;
+
+require_once('include/menu.php');
+require_once('include/acl_selectors.php');
+
+
+class Mitem extends \Zotlabs\Web\Controller {
+
+ function init() {
+
+ $uid = local_channel();
+
+ if(array_key_exists('sys',$_REQUEST) && $_REQUEST['sys'] && is_site_admin()) {
+ $sys = get_sys_channel();
+ $uid = intval($sys['channel_id']);
+ \App::$is_sys = true;
+ }
+
+ if(! $uid)
+ return;
+
+ if(argc() < 2)
+ return;
+
+ $m = menu_fetch_id(intval(argv(1)),$uid);
+ if(! $m) {
+ notice( t('Menu not found.') . EOL);
+ return '';
+ }
+ \App::$data['menu'] = $m;
+
+ }
+
+ function post() {
+
+ $uid = local_channel();
+
+ if(\App::$is_sys && is_site_admin()) {
+ $sys = get_sys_channel();
+ $uid = intval($sys['channel_id']);
+ }
+
+ if(! $uid) {
+ return;
+ }
+
+ if(! \App::$data['menu'])
+ return;
+
+ if(!$_REQUEST['mitem_desc'] || !$_REQUEST['mitem_link']) {
+ notice( t('Unable to create element.') . EOL);
+ return;
+ }
+
+ $_REQUEST['mitem_channel_id'] = $uid;
+ $_REQUEST['menu_id'] = \App::$data['menu']['menu_id'];
+
+ $_REQUEST['mitem_flags'] = 0;
+ if($_REQUEST['usezid'])
+ $_REQUEST['mitem_flags'] |= MENU_ITEM_ZID;
+ if($_REQUEST['newwin'])
+ $_REQUEST['mitem_flags'] |= MENU_ITEM_NEWWIN;
+
+
+ $mitem_id = ((argc() > 2) ? intval(argv(2)) : 0);
+ if($mitem_id) {
+ $_REQUEST['mitem_id'] = $mitem_id;
+ $r = menu_edit_item($_REQUEST['menu_id'],$uid,$_REQUEST);
+ if($r) {
+ menu_sync_packet($uid,get_observer_hash(),$_REQUEST['menu_id']);
+ //info( t('Menu element updated.') . EOL);
+ goaway(z_root() . '/mitem/' . $_REQUEST['menu_id'] . ((\App::$is_sys) ? '?f=&sys=1' : ''));
+ }
+ else
+ notice( t('Unable to update menu element.') . EOL);
+
+ }
+ else {
+ $r = menu_add_item($_REQUEST['menu_id'],$uid,$_REQUEST);
+ if($r) {
+ menu_sync_packet($uid,get_observer_hash(),$_REQUEST['menu_id']);
+ //info( t('Menu element added.') . EOL);
+ if($_REQUEST['submit']) {
+ goaway(z_root() . '/menu' . ((\App::$is_sys) ? '?f=&sys=1' : ''));
+ }
+ if($_REQUEST['submit-more']) {
+ goaway(z_root() . '/mitem/' . $_REQUEST['menu_id'] . '?f=&display=block' . ((\App::$is_sys) ? '&sys=1' : '') );
+ }
+ }
+ else
+ notice( t('Unable to add menu element.') . EOL);
+
+ }
+
+ }
+
+
+ function get() {
+
+ $uid = local_channel();
+ $channel = \App::get_channel();
+ $observer = \App::get_observer();
+
+ $ob_hash = (($observer) ? $observer['xchan_hash'] : '');
+
+ if(\App::$is_sys && is_site_admin()) {
+ $sys = get_sys_channel();
+ $uid = intval($sys['channel_id']);
+ $channel = $sys;
+ $ob_hash = $sys['xchan_hash'];
+ }
+
+ if(! $uid) {
+ notice( t('Permission denied.') . EOL);
+ return '';
+ }
+
+ if(argc() < 2 || (! \App::$data['menu'])) {
+ notice( t('Not found.') . EOL);
+ return '';
+ }
+
+ $m = menu_fetch(\App::$data['menu']['menu_name'],$uid,$ob_hash);
+ \App::$data['menu_item'] = $m;
+
+ $menu_list = menu_list($uid);
+
+ foreach($menu_list as $menus) {
+ if($menus['menu_name'] != $m['menu']['menu_name'])
+ $menu_names[] = $menus['menu_name'];
+ }
+
+ $acl = new \Zotlabs\Access\AccessList($channel);
+
+ $lockstate = (($channel['channel_allow_cid'] || $channel['channel_allow_gid'] || $channel['channel_deny_cid'] || $channel['channel_deny_gid']) ? 'lock' : 'unlock');
+
+ if(argc() == 2) {
+ $r = q("select * from menu_item where mitem_menu_id = %d and mitem_channel_id = %d order by mitem_order asc, mitem_desc asc",
+ intval(\App::$data['menu']['menu_id']),
+ intval($uid)
+ );
+
+ if($_GET['display']) {
+ $display = $_GET['display'];
+ }
+ else {
+ $display = (($r) ? 'none' : 'block');
+ }
+
+ $create = replace_macros(get_markup_template('mitemedit.tpl'), array(
+ '$menu_id' => \App::$data['menu']['menu_id'],
+ '$permissions' => t('Menu Item Permissions'),
+ '$permdesc' => t("\x28click to open/close\x29"),
+ '$aclselect' => populate_acl($acl->get(),false),
+ '$mitem_desc' => array('mitem_desc', t('Link Name'), '', 'Visible name of the link','*'),
+ '$mitem_link' => array('mitem_link', t('Link or Submenu Target'), '', t('Enter URL of the link or select a menu name to create a submenu'), '*', 'list="menu-names"'),
+ '$usezid' => array('usezid', t('Use magic-auth if available'), true, '', array(t('No'), t('Yes'))),
+ '$newwin' => array('newwin', t('Open link in new window'), false,'', array(t('No'), t('Yes'))),
+ '$mitem_order' => array('mitem_order', t('Order in list'),'0',t('Higher numbers will sink to bottom of listing')),
+ '$submit' => t('Submit and finish'),
+ '$submit_more' => t('Submit and continue'),
+ '$display' => $display,
+ '$lockstate' => $lockstate,
+ '$menu_names' => $menu_names,
+ '$sys' => \App::$is_sys
+ ));
+
+ $o .= replace_macros(get_markup_template('mitemlist.tpl'),array(
+ '$title' => t('Menu:'),
+ '$create' => $create,
+ '$nametitle' => t('Link Name'),
+ '$targettitle' => t('Link Target'),
+ '$menuname' => \App::$data['menu']['menu_name'],
+ '$menudesc' => \App::$data['menu']['menu_desc'],
+ '$edmenu' => t('Edit menu'),
+ '$menu_id' => \App::$data['menu']['menu_id'],
+ '$mlist' => $r,
+ '$edit' => t('Edit element'),
+ '$drop' => t('Drop element'),
+ '$new' => t('New element'),
+ '$hintmenu' => t('Edit this menu container'),
+ '$hintnew' => t('Add menu element'),
+ '$hintdrop' => t('Delete this menu item'),
+ '$hintedit' => t('Edit this menu item'),
+ ));
+
+ return $o;
+ }
+
+
+ if(argc() > 2) {
+
+ if(intval(argv(2))) {
+
+ $m = q("select * from menu_item where mitem_id = %d and mitem_channel_id = %d limit 1",
+ intval(argv(2)),
+ intval($uid)
+ );
+
+ if(! $m) {
+ notice( t('Menu item not found.') . EOL);
+ goaway(z_root() . '/menu'. ((\App::$is_sys) ? '?f=&sys=1' : ''));
+ }
+
+ $mitem = $m[0];
+
+ $lockstate = (($mitem['allow_cid'] || $mitem['allow_gid'] || $mitem['deny_cid'] || $mitem['deny_gid']) ? 'lock' : 'unlock');
+
+ if(argc() == 4 && argv(3) == 'drop') {
+ menu_sync_packet($uid,get_observer_hash(),$mitem['mitem_menu_id']);
+ $r = menu_del_item($mitem['mitem_menu_id'], $uid, intval(argv(2)));
+ menu_sync_packet($uid,get_observer_hash(),$mitem['mitem_menu_id']);
+ if($r)
+ info( t('Menu item deleted.') . EOL);
+ else
+ notice( t('Menu item could not be deleted.'). EOL);
+
+ goaway(z_root() . '/mitem/' . $mitem['mitem_menu_id'] . ((\App::$is_sys) ? '?f=&sys=1' : ''));
+ }
+
+ // edit menu item
+ $o = replace_macros(get_markup_template('mitemedit.tpl'), array(
+ '$header' => t('Edit Menu Element'),
+ '$menu_id' => \App::$data['menu']['menu_id'],
+ '$permissions' => t('Menu Item Permissions'),
+ '$permdesc' => t("\x28click to open/close\x29"),
+ '$aclselect' => populate_acl($mitem,false),
+ '$mitem_id' => intval(argv(2)),
+ '$mitem_desc' => array('mitem_desc', t('Link text'), $mitem['mitem_desc'], '','*'),
+ '$mitem_link' => array('mitem_link', t('Link or Submenu Target'), $mitem['mitem_link'], 'Enter URL of the link or select a menu name to create a submenu', '*', 'list="menu-names"'),
+ '$usezid' => array('usezid', t('Use magic-auth if available'), (($mitem['mitem_flags'] & MENU_ITEM_ZID) ? 1 : 0), '', array(t('No'), t('Yes'))),
+ '$newwin' => array('newwin', t('Open link in new window'), (($mitem['mitem_flags'] & MENU_ITEM_NEWWIN) ? 1 : 0),'', array(t('No'), t('Yes'))),
+ '$mitem_order' => array('mitem_order', t('Order in list'),$mitem['mitem_order'],t('Higher numbers will sink to bottom of listing')),
+ '$submit' => t('Submit'),
+ '$lockstate' => $lockstate,
+ '$menu_names' => $menu_names
+ ));
+
+ return $o;
+ }
+ }
+ }
+
+}
diff --git a/Zotlabs/Module/Mood.php b/Zotlabs/Module/Mood.php
new file mode 100644
index 000000000..b1007fd06
--- /dev/null
+++ b/Zotlabs/Module/Mood.php
@@ -0,0 +1,146 @@
+<?php
+namespace Zotlabs\Module;
+
+require_once('include/security.php');
+require_once('include/bbcode.php');
+require_once('include/items.php');
+
+
+
+class Mood extends \Zotlabs\Web\Controller {
+
+ function init() {
+
+ if(! local_channel())
+ return;
+
+ $uid = local_channel();
+ $channel = \App::get_channel();
+ $verb = notags(trim($_GET['verb']));
+
+ if(! $verb)
+ return;
+
+ $verbs = get_mood_verbs();
+
+ if(! array_key_exists($verb,$verbs))
+ return;
+
+ $activity = ACTIVITY_MOOD . '#' . urlencode($verb);
+
+ $parent = ((x($_GET,'parent')) ? intval($_GET['parent']) : 0);
+
+
+ logger('mood: verb ' . $verb, LOGGER_DEBUG);
+
+
+ if($parent) {
+ $r = q("select mid, owner_xchan, private, allow_cid, allow_gid, deny_cid, deny_gid
+ from item where id = %d and parent = %d and uid = %d limit 1",
+ intval($parent),
+ intval($parent),
+ intval($uid)
+ );
+ if(count($r)) {
+ $parent_mid = $r[0]['mid'];
+ $private = $r[0]['item_private'];
+ $allow_cid = $r[0]['allow_cid'];
+ $allow_gid = $r[0]['allow_gid'];
+ $deny_cid = $r[0]['deny_cid'];
+ $deny_gid = $r[0]['deny_gid'];
+ }
+ }
+ else {
+
+ $private = 0;
+
+ $allow_cid = $channel['channel_allow_cid'];
+ $allow_gid = $channel['channel_allow_gid'];
+ $deny_cid = $channel['channel_deny_cid'];
+ $deny_gid = $channel['channel_deny_gid'];
+ }
+
+ $poster = \App::get_observer();
+
+ $mid = item_message_id();
+
+ $action = sprintf( t('%1$s is %2$s','mood'), '[zrl=' . $poster['xchan_url'] . ']' . $poster['xchan_name'] . '[/zrl]' , $verbs[$verb]);
+
+ $arr = array();
+
+ $arr['aid'] = get_account_id();
+ $arr['uid'] = $uid;
+ $arr['mid'] = $mid;
+ $arr['parent_mid'] = (($parent_mid) ? $parent_mid : $mid);
+ $arr['author_xchan'] = $poster['xchan_hash'];
+ $arr['owner_xchan'] = (($parent_mid) ? $r[0]['owner_xchan'] : $poster['xchan_hash']);
+ $arr['title'] = '';
+ $arr['allow_cid'] = $allow_cid;
+ $arr['allow_gid'] = $allow_gid;
+ $arr['deny_cid'] = $deny_cid;
+ $arr['deny_gid'] = $deny_gid;
+ $arr['item_private'] = $private;
+ $arr['verb'] = $activity;
+ $arr['body'] = $action;
+ $arr['item_origin'] = 1;
+ $arr['item_wall'] = 1;
+ $arr['item_unseen'] = 1;
+ if(! $parent_mid)
+ $item['item_thread_top'] = 1;
+
+ if ((! $arr['plink']) && intval($arr['item_thread_top'])) {
+ $arr['plink'] = z_root() . '/channel/' . $channel['channel_address'] . '/?f=&mid=' . $arr['mid'];
+ }
+
+
+ $post = item_store($arr);
+ $item_id = $post['item_id'];
+
+ if($item_id) {
+ proc_run('php',"include/notifier.php","activity", $item_id);
+ }
+
+ call_hooks('post_local_end', $arr);
+
+ if($_SESSION['return_url'])
+ goaway(z_root() . '/' . $_SESSION['return_url']);
+
+ return;
+ }
+
+
+
+ function get() {
+
+ if(! local_channel()) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ $parent = ((x($_GET,'parent')) ? intval($_GET['parent']) : '0');
+
+
+
+ $verbs = get_mood_verbs();
+
+ $shortlist = array();
+ foreach($verbs as $k => $v)
+ if($v !== 'NOTRANSLATION')
+ $shortlist[] = array($k,$v);
+
+
+ $tpl = get_markup_template('mood_content.tpl');
+
+ $o = replace_macros($tpl,array(
+ '$title' => t('Mood'),
+ '$desc' => t('Set your current mood and tell your friends'),
+ '$verbs' => $shortlist,
+ '$parent' => $parent,
+ '$submit' => t('Submit'),
+ ));
+
+ return $o;
+
+ }
+
+}
diff --git a/Zotlabs/Module/Msearch.php b/Zotlabs/Module/Msearch.php
new file mode 100644
index 000000000..e96f78e16
--- /dev/null
+++ b/Zotlabs/Module/Msearch.php
@@ -0,0 +1,47 @@
+<?php
+namespace Zotlabs\Module;
+
+
+class Msearch extends \Zotlabs\Web\Controller {
+
+ function post() {
+
+ $perpage = (($_POST['n']) ? $_POST['n'] : 80);
+ $page = (($_POST['p']) ? intval($_POST['p'] - 1) : 0);
+ $startrec = (($page+1) * $perpage) - $perpage;
+
+ $search = $_POST['s'];
+ if(! strlen($search))
+ killme();
+
+ $r = q("SELECT COUNT(*) AS `total` FROM `profile` LEFT JOIN `user` ON `user`.`uid` = `profile`.`uid` WHERE `is_default` = 1 AND `user`.`hidewall` = 0 AND MATCH `keywords` AGAINST ('%s') ",
+ dbesc($search)
+ );
+ if(count($r))
+ $total = $r[0]['total'];
+
+ $r = q("SELECT `keywords`, `username`, `nickname`, `user`.`uid` FROM `user` LEFT JOIN `profile` ON `user`.`uid` = `profile`.`uid` WHERE `is_default` = 1 AND `user`.`hidewall` = 0 AND MATCH `keywords` AGAINST ('%s') LIMIT %d , %d ",
+ dbesc($search),
+ intval($startrec),
+ intval($perpage)
+ );
+
+ $results = array();
+ if(count($r)) {
+ foreach($r as $rr)
+ $results[] = array(
+ 'name' => $rr['name'],
+ 'url' => z_root() . '/channel/' . $rr['nickname'],
+ 'photo' => z_root() . '/photo/avatar/' . $rr['uid'],
+ 'tags' => str_replace(array(',',' '),array(' ',' '),$rr['keywords'])
+ );
+ }
+
+ $output = array('total' => $total, 'items_page' => $perpage, 'page' => $page + 1, 'results' => $results);
+
+ echo json_encode($output);
+
+ killme();
+
+ }
+}
diff --git a/Zotlabs/Module/Network.php b/Zotlabs/Module/Network.php
new file mode 100644
index 000000000..77353da05
--- /dev/null
+++ b/Zotlabs/Module/Network.php
@@ -0,0 +1,531 @@
+<?php
+namespace Zotlabs\Module;
+
+require_once('include/items.php');
+require_once('include/group.php');
+require_once('include/contact_widgets.php');
+require_once('include/conversation.php');
+require_once('include/acl_selectors.php');
+
+
+
+class Network extends \Zotlabs\Web\Controller {
+
+ function init() {
+ if(! local_channel()) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ if(count($_GET) < 2) {
+ $network_options = get_pconfig(local_channel(),'system','network_page_default');
+ if($network_options)
+ goaway('network' . '?f=&' . $network_options);
+ }
+
+ $channel = \App::get_channel();
+ \App::$profile_uid = local_channel();
+ head_set_icon($channel['xchan_photo_s']);
+
+ }
+
+ function get($update = 0, $load = false) {
+
+ if(! local_channel()) {
+ $_SESSION['return_url'] = \App::$query_string;
+ return login(false);
+ }
+
+ if($load)
+ $_SESSION['loadtime'] = datetime_convert();
+
+ $arr = array('query' => \App::$query_string);
+
+ call_hooks('network_content_init', $arr);
+
+ $channel = \App::get_channel();
+ $item_normal = item_normal();
+
+ $datequery = $datequery2 = '';
+
+ $group = 0;
+
+ $nouveau = false;
+
+ $datequery = ((x($_GET,'dend') && is_a_date_arg($_GET['dend'])) ? notags($_GET['dend']) : '');
+ $datequery2 = ((x($_GET,'dbegin') && is_a_date_arg($_GET['dbegin'])) ? notags($_GET['dbegin']) : '');
+ $nouveau = ((x($_GET,'new')) ? intval($_GET['new']) : 0);
+ $gid = ((x($_GET,'gid')) ? intval($_GET['gid']) : 0);
+ $category = ((x($_REQUEST,'cat')) ? $_REQUEST['cat'] : '');
+ $hashtags = ((x($_REQUEST,'tag')) ? $_REQUEST['tag'] : '');
+ $verb = ((x($_REQUEST,'verb')) ? $_REQUEST['verb'] : '');
+
+ $search = (($_GET['search']) ? $_GET['search'] : '');
+ if($search) {
+ if(strpos($search,'@') === 0) {
+ $r = q("select abook_id from abook left join xchan on abook_xchan = xchan_hash where xchan_name = '%s' and abook_channel = %d limit 1",
+ dbesc(substr($search,1)),
+ intval(local_channel())
+ );
+ if($r) {
+ $_GET['cid'] = $r[0]['abook_id'];
+ $search = $_GET['search'] = '';
+ }
+ }
+ elseif(strpos($search,'#') === 0) {
+ $hashtags = substr($search,1);
+ $search = $_GET['search'] = '';
+ }
+ }
+
+ if($datequery)
+ $_GET['order'] = 'post';
+
+
+ // filter by collection (e.g. group)
+
+ if($gid) {
+ $r = q("SELECT * FROM groups WHERE id = %d AND uid = %d LIMIT 1",
+ intval($gid),
+ intval(local_channel())
+ );
+ if(! $r) {
+ if($update)
+ killme();
+ notice( t('No such group') . EOL );
+ goaway(z_root() . '/network');
+ // NOTREACHED
+ }
+
+ $group = $gid;
+ $group_hash = $r[0]['hash'];
+ $def_acl = array('allow_gid' => '<' . $r[0]['hash'] . '>');
+ }
+
+ $o = '';
+
+
+ // if no tabs are selected, defaults to comments
+
+ $cid = ((x($_GET,'cid')) ? intval($_GET['cid']) : 0);
+ $star = ((x($_GET,'star')) ? intval($_GET['star']) : 0);
+ $order = ((x($_GET,'order')) ? notags($_GET['order']) : 'comment');
+ $liked = ((x($_GET,'liked')) ? intval($_GET['liked']) : 0);
+ $conv = ((x($_GET,'conv')) ? intval($_GET['conv']) : 0);
+ $spam = ((x($_GET,'spam')) ? intval($_GET['spam']) : 0);
+ $cmin = ((x($_GET,'cmin')) ? intval($_GET['cmin']) : 0);
+ $cmax = ((x($_GET,'cmax')) ? intval($_GET['cmax']) : 99);
+ $firehose = ((x($_GET,'fh')) ? intval($_GET['fh']) : 0);
+ $file = ((x($_GET,'file')) ? $_GET['file'] : '');
+
+
+ $deftag = '';
+
+ if(x($_GET,'search') || x($_GET,'file'))
+ $nouveau = true;
+ if($cid) {
+ $r = q("SELECT abook_xchan FROM abook WHERE abook_id = %d AND abook_channel = %d LIMIT 1",
+ intval($cid),
+ intval(local_channel())
+ );
+ if(! $r) {
+ if($update) {
+ killme();
+ }
+ notice( t('No such channel') . EOL );
+ goaway(z_root() . '/network');
+ // NOTREACHED
+ }
+ if($_GET['pf'] === '1')
+ $deftag = '@' . t('forum') . '+' . intval($cid) . '+';
+ else
+ $def_acl = array('allow_cid' => '<' . $r[0]['abook_xchan'] . '>');
+ }
+
+ if(! $update) {
+ $tabs = network_tabs();
+ $o .= $tabs;
+
+ // search terms header
+ if($search) {
+ $o .= replace_macros(get_markup_template("section_title.tpl"),array(
+ '$title' => t('Search Results For:') . ' ' . htmlspecialchars($search, ENT_COMPAT,'UTF-8')
+ ));
+ }
+
+ nav_set_selected('network');
+
+ $channel_acl = array(
+ 'allow_cid' => $channel['channel_allow_cid'],
+ 'allow_gid' => $channel['channel_allow_gid'],
+ 'deny_cid' => $channel['channel_deny_cid'],
+ 'deny_gid' => $channel['channel_deny_gid']
+ );
+
+ $private_editing = ((($group || $cid) && (! intval($_GET['pf']))) ? true : false);
+
+ $x = array(
+ 'is_owner' => true,
+ 'allow_location' => ((intval(get_pconfig($channel['channel_id'],'system','use_browser_location'))) ? '1' : ''),
+ 'default_location' => $channel['channel_location'],
+ 'nickname' => $channel['channel_address'],
+ 'lockstate' => (($private_editing || $channel['channel_allow_cid'] || $channel['channel_allow_gid'] || $channel['channel_deny_cid'] || $channel['channel_deny_gid']) ? 'lock' : 'unlock'),
+ 'acl' => populate_acl((($private_editing) ? $def_acl : $channel_acl), true, (($channel['channel_r_stream'] & PERMS_PUBLIC) ? t('Public') : '')),
+ 'bang' => (($private_editing) ? '!' : ''),
+ 'visitor' => true,
+ 'profile_uid' => local_channel(),
+ 'editor_autocomplete' => true,
+ 'bbco_autocomplete' => 'bbcode',
+ 'bbcode' => true
+ );
+ if($deftag)
+ $x['pretext'] = $deftag;
+
+
+ $status_editor = status_editor($a,$x);
+ $o .= $status_editor;
+
+ }
+
+
+ // We don't have to deal with ACL's on this page. You're looking at everything
+ // that belongs to you, hence you can see all of it. We will filter by group if
+ // desired.
+
+
+ $sql_options = (($star)
+ ? " and item_starred = 1 "
+ : '');
+
+ $sql_nets = '';
+
+ $sql_extra = " AND `item`.`parent` IN ( SELECT `parent` FROM `item` WHERE item_thread_top = 1 $sql_options ) ";
+
+ if($group) {
+ $contact_str = '';
+ $contacts = group_get_members($group);
+ if($contacts) {
+ foreach($contacts as $c) {
+ if($contact_str)
+ $contact_str .= ',';
+ $contact_str .= "'" . $c['xchan'] . "'";
+ }
+ }
+ else {
+ $contact_str = ' 0 ';
+ info( t('Privacy group is empty'));
+ }
+
+ $sql_extra = " AND item.parent IN ( SELECT DISTINCT parent FROM item WHERE true $sql_options AND (( author_xchan IN ( $contact_str ) OR owner_xchan in ( $contact_str )) or allow_gid like '" . protect_sprintf('%<' . dbesc($group_hash) . '>%') . "' ) and id = parent $item_normal ) ";
+
+ $x = group_rec_byhash(local_channel(), $group_hash);
+
+ if($x) {
+ $title = replace_macros(get_markup_template("section_title.tpl"),array(
+ '$title' => t('Privacy group: ') . $x['name']
+ ));
+ }
+
+ $o = $tabs;
+ $o .= $title;
+ $o .= $status_editor;
+
+ }
+
+ elseif($cid) {
+
+ $r = q("SELECT abook.*, xchan.* from abook left join xchan on abook_xchan = xchan_hash where abook_id = %d and abook_channel = %d and abook_blocked = 0 limit 1",
+ intval($cid),
+ intval(local_channel())
+ );
+ if($r) {
+ $sql_extra = " AND item.parent IN ( SELECT DISTINCT parent FROM item WHERE true $sql_options AND uid = " . intval(local_channel()) . " AND ( author_xchan = '" . dbesc($r[0]['abook_xchan']) . "' or owner_xchan = '" . dbesc($r[0]['abook_xchan']) . "' ) $item_normal ) ";
+ $title = replace_macros(get_markup_template("section_title.tpl"),array(
+ '$title' => '<a href="' . zid($r[0]['xchan_url']) . '" ><img src="' . zid($r[0]['xchan_photo_s']) . '" alt="' . urlencode($r[0]['xchan_name']) . '" /></a> <a href="' . zid($r[0]['xchan_url']) . '" >' . $r[0]['xchan_name'] . '</a>'
+ ));
+ $o = $tabs;
+ $o .= $title;
+ $o .= $status_editor;
+ }
+ else {
+ notice( t('Invalid connection.') . EOL);
+ goaway(z_root() . '/network');
+ }
+ }
+
+ if(x($category)) {
+ $sql_extra .= protect_sprintf(term_query('item', $category, TERM_CATEGORY));
+ }
+ if(x($hashtags)) {
+ $sql_extra .= protect_sprintf(term_query('item', $hashtags, TERM_HASHTAG, TERM_COMMUNITYTAG));
+ }
+
+ if(! $update) {
+ // The special div is needed for liveUpdate to kick in for this page.
+ // We only launch liveUpdate if you aren't filtering in some incompatible
+ // way and also you aren't writing a comment (discovered in javascript).
+
+ if($gid || $cid || $cmin || ($cmax != 99) || $star || $liked || $conv || $spam || $nouveau || $list)
+ $firehose = 0;
+
+ $maxheight = get_pconfig(local_channel(),'system','network_divmore_height');
+ if(! $maxheight)
+ $maxheight = 400;
+
+
+ $o .= '<div id="live-network"></div>' . "\r\n";
+ $o .= "<script> var profile_uid = " . local_channel()
+ . "; var profile_page = " . \App::$pager['page']
+ . "; divmore_height = " . intval($maxheight) . "; </script>\r\n";
+
+ \App::$page['htmlhead'] .= replace_macros(get_markup_template("build_query.tpl"),array(
+ '$baseurl' => z_root(),
+ '$pgtype' => 'network',
+ '$uid' => ((local_channel()) ? local_channel() : '0'),
+ '$gid' => (($gid) ? $gid : '0'),
+ '$cid' => (($cid) ? $cid : '0'),
+ '$cmin' => (($cmin) ? $cmin : '0'),
+ '$cmax' => (($cmax) ? $cmax : '0'),
+ '$star' => (($star) ? $star : '0'),
+ '$liked' => (($liked) ? $liked : '0'),
+ '$conv' => (($conv) ? $conv : '0'),
+ '$spam' => (($spam) ? $spam : '0'),
+ '$fh' => (($firehose) ? $firehose : '0'),
+ '$nouveau' => (($nouveau) ? $nouveau : '0'),
+ '$wall' => '0',
+ '$list' => ((x($_REQUEST,'list')) ? intval($_REQUEST['list']) : 0),
+ '$page' => ((\App::$pager['page'] != 1) ? \App::$pager['page'] : 1),
+ '$search' => (($search) ? $search : ''),
+ '$order' => $order,
+ '$file' => $file,
+ '$cats' => $category,
+ '$tags' => $hashtags,
+ '$dend' => $datequery,
+ '$mid' => '',
+ '$verb' => $verb,
+ '$dbegin' => $datequery2
+ ));
+ }
+
+ $sql_extra3 = '';
+
+ if($datequery) {
+ $sql_extra3 .= protect_sprintf(sprintf(" AND item.created <= '%s' ", dbesc(datetime_convert(date_default_timezone_get(),'',$datequery))));
+ }
+ if($datequery2) {
+ $sql_extra3 .= protect_sprintf(sprintf(" AND item.created >= '%s' ", dbesc(datetime_convert(date_default_timezone_get(),'',$datequery2))));
+ }
+
+ $sql_extra2 = (($nouveau) ? '' : " AND item.parent = item.id ");
+ $sql_extra3 = (($nouveau) ? '' : $sql_extra3);
+
+ if(x($_GET,'search')) {
+ $search = escape_tags($_GET['search']);
+ if(strpos($search,'#') === 0) {
+ $sql_extra .= term_query('item',substr($search,1),TERM_HASHTAG,TERM_COMMUNITYTAG);
+ }
+ else {
+ $sql_extra .= sprintf(" AND item.body like '%s' ",
+ dbesc(protect_sprintf('%' . $search . '%'))
+ );
+ }
+ }
+
+ if($verb) {
+ $sql_extra .= sprintf(" AND item.verb like '%s' ",
+ dbesc(protect_sprintf('%' . $verb . '%'))
+ );
+ }
+
+ if(strlen($file)) {
+ $sql_extra .= term_query('item',$file,TERM_FILE);
+ }
+
+ if($conv) {
+ $sql_extra .= sprintf(" AND parent IN (SELECT distinct(parent) from item where ( author_xchan like '%s' or item_mentionsme = 1 )) ",
+ dbesc(protect_sprintf($channel['channel_hash']))
+ );
+ }
+
+ if($update && ! $load) {
+
+ // only setup pagination on initial page view
+ $pager_sql = '';
+
+ }
+ else {
+ $itemspage = get_pconfig(local_channel(),'system','itemspage');
+ \App::set_pager_itemspage(((intval($itemspage)) ? $itemspage : 20));
+ $pager_sql = sprintf(" LIMIT %d OFFSET %d ", intval(\App::$pager['itemspage']), intval(\App::$pager['start']));
+ }
+
+
+ if(($cmin != 0) || ($cmax != 99)) {
+
+ // Not everybody who shows up in the network stream will be in your address book.
+ // By default those that aren't are assumed to have closeness = 99; but this isn't
+ // recorded anywhere. So if cmax is 99, we'll open the search up to anybody in
+ // the stream with a NULL address book entry.
+
+ $sql_nets .= " AND ";
+
+ if($cmax == 99)
+ $sql_nets .= " ( ";
+
+ $sql_nets .= "( abook.abook_closeness >= " . intval($cmin) . " ";
+ $sql_nets .= " AND abook.abook_closeness <= " . intval($cmax) . " ) ";
+
+ if($cmax == 99)
+ $sql_nets .= " OR abook.abook_closeness IS NULL ) ";
+
+
+ }
+
+ $abook_uids = " and abook.abook_channel = " . local_channel() . " ";
+
+ if($firehose && (! get_config('system','disable_discover_tab'))) {
+ require_once('include/identity.php');
+ $sys = get_sys_channel();
+ $uids = " and item.uid = " . intval($sys['channel_id']) . " ";
+ \App::$data['firehose'] = intval($sys['channel_id']);
+ }
+ else {
+ $uids = " and item.uid = " . local_channel() . " ";
+ }
+
+ if(get_pconfig(local_channel(),'system','network_list_mode'))
+ $page_mode = 'list';
+ else
+ $page_mode = 'client';
+
+ $simple_update = (($update) ? " and item_unseen = 1 " : '');
+
+ // This fixes a very subtle bug so I'd better explain it. You wake up in the morning or return after a day
+ // or three and look at your matrix page - after opening up your browser. The first page loads just as it
+ // should. All of a sudden a few seconds later, page 2 will get inserted at the beginning of the page
+ // (before the page 1 content). The update code is actually doing just what it's supposed
+ // to, it's fetching posts that have the ITEM_UNSEEN bit set. But the reason that page 2 content is being
+ // returned in an UPDATE is because you hadn't gotten that far yet - you're still on page 1 and everything
+ // that we loaded for page 1 is now marked as seen. But the stuff on page 2 hasn't been. So... it's being
+ // treated as "new fresh" content because it is unseen. We need to distinguish it somehow from content
+ // which "arrived as you were reading page 1". We're going to do this
+ // by storing in your session the current UTC time whenever you LOAD a network page, and only UPDATE items
+ // which are both ITEM_UNSEEN and have "changed" since that time. Cross fingers...
+
+ if($update && $_SESSION['loadtime'])
+ $simple_update = " AND (( item_unseen = 1 AND item.changed > '" . datetime_convert('UTC','UTC',$_SESSION['loadtime']) . "' ) OR item.changed > '" . datetime_convert('UTC','UTC',$_SESSION['loadtime']) . "' ) ";
+ if($load)
+ $simple_update = '';
+
+ if($nouveau && $load) {
+ // "New Item View" - show all items unthreaded in reverse created date order
+
+ $items = q("SELECT item.*, item.id AS item_id, received FROM item
+ left join abook on ( item.owner_xchan = abook.abook_xchan $abook_uids )
+ WHERE true $uids $item_normal
+ and (abook.abook_blocked = 0 or abook.abook_flags is null)
+ $simple_update
+ $sql_extra $sql_nets
+ ORDER BY item.received DESC $pager_sql "
+ );
+
+ require_once('include/items.php');
+
+ xchan_query($items);
+
+ $items = fetch_post_tags($items,true);
+ }
+ elseif($update) {
+
+ // Normal conversation view
+
+ if($order === 'post')
+ $ordering = "created";
+ else
+ $ordering = "commented";
+
+ if($load) {
+
+ // Fetch a page full of parent items for this page
+
+ $r = q("SELECT distinct item.id AS item_id, $ordering FROM item
+ left join abook on ( item.owner_xchan = abook.abook_xchan $abook_uids )
+ WHERE true $uids $item_normal
+ AND item.parent = item.id
+ and (abook.abook_blocked = 0 or abook.abook_flags is null)
+ $sql_extra3 $sql_extra $sql_nets
+ ORDER BY $ordering DESC $pager_sql "
+ );
+
+ }
+ else {
+ // this is an update
+ $r = q("SELECT item.parent AS item_id FROM item
+ left join abook on ( item.owner_xchan = abook.abook_xchan $abook_uids )
+ WHERE true $uids $item_normal $simple_update
+ and (abook.abook_blocked = 0 or abook.abook_flags is null)
+ $sql_extra3 $sql_extra $sql_nets "
+ );
+ $_SESSION['loadtime'] = datetime_convert();
+ }
+
+ // Then fetch all the children of the parents that are on this page
+ $parents_str = '';
+ $update_unseen = '';
+
+ if($r) {
+
+ $parents_str = ids_to_querystr($r,'item_id');
+
+ $items = q("SELECT item.*, item.id AS item_id FROM item
+ WHERE true $uids $item_normal
+ AND item.parent IN ( %s )
+ $sql_extra ",
+ dbesc($parents_str)
+ );
+
+ xchan_query($items,true,(($firehose) ? local_channel() : 0));
+ $items = fetch_post_tags($items,true);
+ $items = conv_sort($items,$ordering);
+ }
+ else {
+ $items = array();
+ }
+
+ if($page_mode === 'list') {
+
+ /**
+ * in "list mode", only mark the parent item and any like activities as "seen".
+ * We won't distinguish between comment likes and post likes. The important thing
+ * is that the number of unseen comments will be accurate. The SQL to separate the
+ * comment likes could also get somewhat hairy.
+ */
+
+ if($parents_str) {
+ $update_unseen = " AND ( id IN ( " . dbesc($parents_str) . " )";
+ $update_unseen .= " OR ( parent IN ( " . dbesc($parents_str) . " ) AND verb in ( '" . dbesc(ACTIVITY_LIKE) . "','" . dbesc(ACTIVITY_DISLIKE) . "' ))) ";
+ }
+ }
+ else {
+ if($parents_str) {
+ $update_unseen = " AND parent IN ( " . dbesc($parents_str) . " )";
+ }
+ }
+ }
+
+ if(($update_unseen) && (! $firehose))
+ $r = q("UPDATE item SET item_unseen = 0 WHERE item_unseen = 1 AND uid = %d $update_unseen ",
+ intval(local_channel())
+ );
+
+ $mode = (($nouveau) ? 'network-new' : 'network');
+
+ $o .= conversation($a,$items,$mode,$update,$page_mode);
+
+ if(($items) && (! $update))
+ $o .= alt_pager($a,count($items));
+
+ return $o;
+ }
+
+}
diff --git a/Zotlabs/Module/New_channel.php b/Zotlabs/Module/New_channel.php
new file mode 100644
index 000000000..3dca1b0b4
--- /dev/null
+++ b/Zotlabs/Module/New_channel.php
@@ -0,0 +1,151 @@
+<?php
+namespace Zotlabs\Module;
+
+require_once('include/identity.php');
+require_once('include/permissions.php');
+
+
+
+class New_channel extends \Zotlabs\Web\Controller {
+
+ function init() {
+
+ $cmd = ((argc() > 1) ? argv(1) : '');
+
+ if($cmd === 'autofill.json') {
+ require_once('library/urlify/URLify.php');
+ $result = array('error' => false, 'message' => '');
+ $n = trim($_REQUEST['name']);
+
+ $x = strtolower(\URLify::transliterate($n));
+
+ $test = array();
+
+ // first name
+ if(strpos($x,' '))
+ $test[] = legal_webbie(substr($x,0,strpos($x,' ')));
+ if($test[0]) {
+ // first name plus first initial of last
+ $test[] = ((strpos($x,' ')) ? $test[0] . legal_webbie(trim(substr($x,strpos($x,' '),2))) : '');
+ // first name plus random number
+ $test[] = $test[0] . mt_rand(1000,9999);
+ }
+ // fullname
+ $test[] = legal_webbie($x);
+ // fullname plus random number
+ $test[] = legal_webbie($x) . mt_rand(1000,9999);
+
+ json_return_and_die(check_webbie($test));
+ }
+
+ if($cmd === 'checkaddr.json') {
+ require_once('library/urlify/URLify.php');
+ $result = array('error' => false, 'message' => '');
+ $n = trim($_REQUEST['nick']);
+
+ $x = strtolower(\URLify::transliterate($n));
+
+ $test = array();
+
+ $n = legal_webbie($x);
+ if(strlen($n)) {
+ $test[] = $n;
+ $test[] = $n . mt_rand(1000,9999);
+ }
+
+ for($y = 0; $y < 100; $y ++)
+ $test[] = 'id' . mt_rand(1000,9999);
+
+ json_return_and_die(check_webbie($test));
+ }
+
+
+ }
+
+ function post() {
+
+ $arr = $_POST;
+
+ $acc = \App::get_account();
+ $arr['account_id'] = get_account_id();
+
+ // prevent execution by delegated channels as well as those not logged in.
+ // get_account_id() returns the account_id from the session. But \App::$account
+ // may point to the original authenticated account.
+
+ if((! $acc) || ($acc['account_id'] != $arr['account_id'])) {
+ notice( t('Permission denied.') . EOL );
+ return;
+ }
+
+ $result = create_identity($arr);
+
+ if(! $result['success']) {
+ notice($result['message']);
+ return;
+ }
+
+ $newuid = $result['channel']['channel_id'];
+
+ change_channel($result['channel']['channel_id']);
+
+ if(! strlen($next_page = get_config('system','workflow_channel_next')))
+ $next_page = 'settings';
+
+ goaway(z_root() . '/' . $next_page);
+
+ }
+
+ function get() {
+
+ $acc = \App::get_account();
+
+ if((! $acc) || $acc['account_id'] != get_account_id()) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ $default_role = '';
+ $aid = get_account_id();
+ if($aid) {
+ $r = q("select count(channel_id) as total from channel where channel_account_id = %d",
+ intval($aid)
+ );
+ if($r && (! intval($r[0]['total']))) {
+ $default_role = get_config('system','default_permissions_role');
+ }
+
+ $limit = account_service_class_fetch(get_account_id(),'total_identities');
+
+ if($r && ($limit !== false)) {
+ $channel_usage_message = sprintf( t("You have created %1$.0f of %2$.0f allowed channels."), $r[0]['total'], $limit);
+ }
+ else {
+ $channel_usage_message = '';
+ }
+ }
+
+ $name = array('name', t('Name or caption'), ((x($_REQUEST,'name')) ? $_REQUEST['name'] : ''), t('Examples: "Bob Jameson", "Lisa and her Horses", "Soccer", "Aviation Group"'));
+ $nickhub = '@' . \App::get_hostname();
+ $nickname = array('nickname', t('Choose a short nickname'), ((x($_REQUEST,'nickname')) ? $_REQUEST['nickname'] : ''), sprintf( t('Your nickname will be used to create an easy to remember channel address e.g. nickname%s'), $nickhub));
+ $privacy_role = ((x($_REQUEST,'permissions_role')) ? $_REQUEST['permissions_role'] : "" );
+ $role = array('permissions_role' , t('Channel role and privacy'), ($privacy_role) ? $privacy_role : 'social', t('Select a channel role with your privacy requirements.') . ' <a href="help/roles" target="_blank">' . t('Read more about roles') . '</a>',get_roles());
+
+ $o = replace_macros(get_markup_template('new_channel.tpl'), array(
+ '$title' => t('Create Channel'),
+ '$desc' => t('A channel is your identity on this network. It can represent a person, a blog, or a forum to name a few. Channels can make connections with other channels to share information with highly detailed permissions.'),
+ '$label_import' => t('or <a href="import">import an existing channel</a> from another location.'),
+ '$name' => $name,
+ '$role' => $role,
+ '$default_role' => $default_role,
+ '$nickname' => $nickname,
+ '$submit' => t('Create'),
+ '$channel_usage_message' => $channel_usage_message
+ ));
+
+ return $o;
+
+ }
+
+
+}
diff --git a/Zotlabs/Module/Nojs.php b/Zotlabs/Module/Nojs.php
new file mode 100644
index 000000000..6fd6d8106
--- /dev/null
+++ b/Zotlabs/Module/Nojs.php
@@ -0,0 +1,15 @@
+<?php
+namespace Zotlabs\Module;
+
+
+class Nojs extends \Zotlabs\Web\Controller {
+
+ function init() {
+ $n = ((argc() > 1) ? intval(argv(1)) : 1);
+ setcookie('jsdisabled', $n, 0, '/');
+ $p = $_GET['redir'];
+ $hasq = strpos($p,'?');
+ goaway(z_root() . (($p) ? '/' . $p : '') . (($hasq) ? '' : '?f=' ) . '&jsdisabled=' . $n);
+
+ }
+}
diff --git a/Zotlabs/Module/Notes.php b/Zotlabs/Module/Notes.php
new file mode 100644
index 000000000..e530e6ff4
--- /dev/null
+++ b/Zotlabs/Module/Notes.php
@@ -0,0 +1,40 @@
+<?php
+namespace Zotlabs\Module; /** @file */
+
+
+class Notes extends \Zotlabs\Web\Controller {
+
+ function init() {
+
+ if(! local_channel())
+ return;
+
+ $ret = array('success' => true);
+ if(array_key_exists('note_text',$_REQUEST)) {
+ $body = escape_tags($_REQUEST['note_text']);
+
+ // I've had my notes vanish into thin air twice in four years.
+ // Provide a backup copy if there were contents previously
+ // and there are none being saved now.
+
+ if(! $body) {
+ $old_text = get_pconfig(local_channel(),'notes','text');
+ if($old_text)
+ set_pconfig(local_channel(),'notes','text.bak',$old_text);
+ }
+ set_pconfig(local_channel(),'notes','text',$body);
+ }
+
+ // push updates to channel clones
+
+ if((argc() > 1) && (argv(1) === 'sync')) {
+ require_once('include/zot.php');
+ build_sync_packet();
+ }
+
+ logger('notes saved.', LOGGER_DEBUG);
+ json_return_and_die($ret);
+
+ }
+
+}
diff --git a/Zotlabs/Module/Notifications.php b/Zotlabs/Module/Notifications.php
new file mode 100644
index 000000000..d51d2861c
--- /dev/null
+++ b/Zotlabs/Module/Notifications.php
@@ -0,0 +1,111 @@
+<?php
+namespace Zotlabs\Module;
+
+
+class Notifications extends \Zotlabs\Web\Controller {
+
+ function post() {
+
+ if(! local_channel()) {
+ goaway(z_root());
+ }
+
+ $request_id = ((\App::$argc > 1) ? \App::$argv[1] : 0);
+
+ if($request_id === "all")
+ return;
+
+ if($request_id) {
+
+ $r = q("SELECT * FROM `intro` WHERE `id` = %d AND `uid` = %d LIMIT 1",
+ intval($request_id),
+ intval(local_channel())
+ );
+
+ if(count($r)) {
+ $intro_id = $r[0]['id'];
+ $contact_id = $r[0]['contact-id'];
+ }
+ else {
+ notice( t('Invalid request identifier.') . EOL);
+ return;
+ }
+
+ // If it is a friend suggestion, the contact is not a new friend but an existing friend
+ // that should not be deleted.
+
+ $fid = $r[0]['fid'];
+
+ if($_POST['submit'] == t('Discard')) {
+ $r = q("DELETE FROM `intro` WHERE `id` = %d",
+ intval($intro_id)
+ );
+ if(! $fid) {
+
+ // The check for blocked and pending is in case the friendship was already approved
+ // and we just want to get rid of the now pointless notification
+
+ $r = q("DELETE FROM `contact` WHERE `id` = %d AND `uid` = %d AND `self` = 0 AND `blocked` = 1 AND `pending` = 1",
+ intval($contact_id),
+ intval(local_channel())
+ );
+ }
+ goaway(z_root() . '/notifications/intros');
+ }
+ if($_POST['submit'] == t('Ignore')) {
+ $r = q("UPDATE `intro` SET `ignore` = 1 WHERE `id` = %d",
+ intval($intro_id));
+ goaway(z_root() . '/notifications/intros');
+ }
+ }
+ }
+
+
+
+
+
+ function get() {
+
+ if(! local_channel()) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ nav_set_selected('notifications');
+
+ $o = '';
+
+ $notif_tpl = get_markup_template('notifications.tpl');
+
+ $not_tpl = get_markup_template('notify.tpl');
+ require_once('include/bbcode.php');
+
+ $r = q("SELECT * from notify where uid = %d and seen = 0 order by date desc",
+ intval(local_channel())
+ );
+
+ if (count($r) > 0) {
+ $notifications_available =1;
+ foreach ($r as $it) {
+ $notif_content .= replace_macros($not_tpl,array(
+ '$item_link' => z_root().'/notify/view/'. $it['id'],
+ '$item_image' => $it['photo'],
+ '$item_text' => strip_tags(bbcode($it['msg'])),
+ '$item_when' => relative_date($it['date'])
+ ));
+ }
+ } else {
+ $notif_content .= t('No more system notifications.');
+ }
+
+ $o .= replace_macros($notif_tpl,array(
+ '$notif_header' => t('System Notifications'),
+ '$notif_link_mark_seen' => t('Mark all system notifications seen'),
+ '$notif_content' => $notif_content,
+ '$notifications_available' => $notifications_available,
+ ));
+
+ return $o;
+ }
+
+}
diff --git a/Zotlabs/Module/Notify.php b/Zotlabs/Module/Notify.php
new file mode 100644
index 000000000..227491145
--- /dev/null
+++ b/Zotlabs/Module/Notify.php
@@ -0,0 +1,69 @@
+<?php
+namespace Zotlabs\Module;
+
+
+
+class Notify extends \Zotlabs\Web\Controller {
+
+ function init() {
+ if(! local_channel())
+ return;
+
+ if(argc() > 2 && argv(1) === 'view' && intval(argv(2))) {
+ $r = q("select * from notify where id = %d and uid = %d limit 1",
+ intval(argv(2)),
+ intval(local_channel())
+ );
+ if($r) {
+ q("update notify set seen = 1 where (( parent != '' and parent = '%s' and otype = '%s' ) or link = '%s' ) and uid = %d",
+ dbesc($r[0]['parent']),
+ dbesc($r[0]['otype']),
+ dbesc($r[0]['link']),
+ intval(local_channel())
+ );
+ goaway($r[0]['link']);
+ }
+ goaway(z_root());
+ }
+
+
+ }
+
+
+ function get() {
+ if(! local_channel())
+ return login();
+
+ $notif_tpl = get_markup_template('notifications.tpl');
+
+ $not_tpl = get_markup_template('notify.tpl');
+ require_once('include/bbcode.php');
+
+ $r = q("SELECT * from notify where uid = %d and seen = 0 order by date desc",
+ intval(local_channel())
+ );
+
+ if($r) {
+ foreach ($r as $it) {
+ $notif_content .= replace_macros($not_tpl,array(
+ '$item_link' => z_root().'/notify/view/'. $it['id'],
+ '$item_image' => $it['photo'],
+ '$item_text' => strip_tags(bbcode($it['msg'])),
+ '$item_when' => relative_date($it['date'])
+ ));
+ }
+ }
+ else {
+ $notif_content .= t('No more system notifications.');
+ }
+
+ $o .= replace_macros($notif_tpl,array(
+ '$notif_header' => t('System Notifications'),
+ '$tabs' => '', // $tabs,
+ '$notif_content' => $notif_content,
+ ));
+
+ return $o;
+
+ }
+}
diff --git a/Zotlabs/Module/Oembed.php b/Zotlabs/Module/Oembed.php
new file mode 100644
index 000000000..b02182053
--- /dev/null
+++ b/Zotlabs/Module/Oembed.php
@@ -0,0 +1,36 @@
+<?php
+namespace Zotlabs\Module;
+require_once("include/oembed.php");
+
+
+class Oembed extends \Zotlabs\Web\Controller {
+
+ function init(){
+ // logger('mod_oembed ' . \App::$query_string, LOGGER_ALL);
+
+ if(argc() > 1) {
+ if (argv(1) == 'b2h'){
+ $url = array( "", trim(hex2bin($_REQUEST['url'])));
+ echo oembed_replacecb($url);
+ killme();
+ }
+
+ elseif (argv(1) == 'h2b'){
+ $text = trim(hex2bin($_REQUEST['text']));
+ echo oembed_html2bbcode($text);
+ killme();
+ }
+
+ else {
+ echo "<html><body>";
+ $src = base64url_decode(argv(1));
+ $j = oembed_fetch_url($src);
+ echo $j->html;
+ // logger('mod-oembed ' . $h, LOGGER_ALL);
+ echo "</body></html>";
+ }
+ }
+ killme();
+ }
+
+}
diff --git a/Zotlabs/Module/Oep.php b/Zotlabs/Module/Oep.php
new file mode 100644
index 000000000..f36a452e8
--- /dev/null
+++ b/Zotlabs/Module/Oep.php
@@ -0,0 +1,403 @@
+<?php
+namespace Zotlabs\Module;
+
+// oembed provider
+
+
+
+
+class Oep extends \Zotlabs\Web\Controller {
+
+ function init() {
+
+ logger('oep: ' . print_r($_REQUEST,true), LOGGER_DEBUG, LOG_INFO);
+
+ $html = ((argc() > 1 && argv(1) === 'html') ? true : false);
+ if($_REQUEST['url']) {
+ $_REQUEST['url'] = strip_zids($_REQUEST['url']);
+ $url = $_REQUEST['url'];
+ }
+
+ if(! $url)
+ http_status_exit(404, 'Not found');
+
+ $maxwidth = $_REQUEST['maxwidth'];
+ $maxheight = $_REQUEST['maxheight'];
+ $format = $_REQUEST['format'];
+ if($format && $format !== 'json')
+ http_status_exit(501, 'Not implemented');
+
+ if(fnmatch('*/photos/*/album/*',$url))
+ $arr = $this->oep_album_reply($_REQUEST);
+ elseif(fnmatch('*/photos/*/image/*',$url))
+ $arr = $this->oep_photo_reply($_REQUEST);
+ elseif(fnmatch('*/photos*',$url))
+ $arr = $this->oep_phototop_reply($_REQUEST);
+ elseif(fnmatch('*/display/*',$url))
+ $arr = $this->oep_display_reply($_REQUEST);
+ elseif(fnmatch('*/channel/*mid=*',$url))
+ $arr = $this->oep_mid_reply($_REQUEST);
+ elseif(fnmatch('*/channel*',$url))
+ $arr = $this->oep_profile_reply($_REQUEST);
+ elseif(fnmatch('*/profile/*',$url))
+ $arr = $this->oep_profile_reply($_REQUEST);
+
+ if($arr) {
+ if($html) {
+ if($arr['type'] === 'rich') {
+ header('Content-Type: text/html');
+ echo $arr['html'];
+ }
+ }
+ else {
+ header('Content-Type: application/json+oembed');
+ echo json_encode($arr);
+ }
+ killme();
+ }
+
+ http_status_exit(404,'Not found');
+
+ }
+
+ function oep_display_reply($args) {
+
+ $ret = array();
+ $url = $args['url'];
+ $maxwidth = intval($args['maxwidth']);
+ $maxheight = intval($args['maxheight']);
+
+ if(preg_match('#//(.*?)/(.*?)/(.*?)/(.*?)mid\=(.*?)(&|$)#',$url,$matches)) {
+ $chn = $matches[3];
+ $res = $matches[5];
+ }
+
+ if(! ($chn && $res))
+ return;
+ $c = q("select * from channel where channel_address = '%s' limit 1",
+ dbesc($chn)
+ );
+
+ if(! $c)
+ return;
+
+ $sql_extra = item_permissions_sql($c[0]['channel_id']);
+
+ $p = q("select * from item where mid = '%s' and uid = %d $sql_extra limit 1",
+ dbesc($res),
+ intval($c[0]['channel_id'])
+ );
+ if(! $p)
+ return;
+
+ xchan_query($p,true);
+ $p = fetch_post_tags($p,true);
+
+ $o = "[share author='".urlencode($p[0]['author']['xchan_name']).
+ "' profile='".$p[0]['author']['xchan_url'] .
+ "' avatar='".$p[0]['author']['xchan_photo_s'].
+ "' link='".$p[0]['plink'].
+ "' posted='".$p[0]['created'].
+ "' message_id='".$p[0]['mid']."']";
+ if($p[0]['title'])
+ $o .= '[b]'.$p[0]['title'].'[/b]'."\r\n";
+ $o .= $p[0]['body'];
+ $o .= "[/share]";
+ $o = bbcode($o);
+
+ $ret['type'] = 'rich';
+
+ $w = (($maxwidth) ? $maxwidth : 640);
+ $h = (($maxheight) ? $maxheight : $w * 2 / 3);
+
+ $ret['html'] = '<div style="width: ' . $w . '; height: ' . $h . '; font-family: sans-serif,arial,freesans;" >' . $o . '</div>';
+
+ $ret['width'] = $w;
+ $ret['height'] = $h;
+
+ return $ret;
+
+ }
+
+ function oep_mid_reply($args) {
+
+ $ret = array();
+ $url = $args['url'];
+ $maxwidth = intval($args['maxwidth']);
+ $maxheight = intval($args['maxheight']);
+
+ if(preg_match('#//(.*?)/(.*?)/(.*?)/(.*?)mid\=(.*?)(&|$)#',$url,$matches)) {
+ $chn = $matches[3];
+ $res = $matches[5];
+ }
+
+ if(! ($chn && $res))
+ return;
+ $c = q("select * from channel where channel_address = '%s' limit 1",
+ dbesc($chn)
+ );
+
+ if(! $c)
+ return;
+
+ $sql_extra = item_permissions_sql($c[0]['channel_id']);
+
+ $p = q("select * from item where mid = '%s' and uid = %d $sql_extra limit 1",
+ dbesc($res),
+ intval($c[0]['channel_id'])
+ );
+ if(! $p)
+ return;
+
+ xchan_query($p,true);
+ $p = fetch_post_tags($p,true);
+
+ $o = "[share author='".urlencode($p[0]['author']['xchan_name']).
+ "' profile='".$p[0]['author']['xchan_url'] .
+ "' avatar='".$p[0]['author']['xchan_photo_s'].
+ "' link='".$p[0]['plink'].
+ "' posted='".$p[0]['created'].
+ "' message_id='".$p[0]['mid']."']";
+ if($p[0]['title'])
+ $o .= '[b]'.$p[0]['title'].'[/b]'."\r\n";
+ $o .= $p[0]['body'];
+ $o .= "[/share]";
+ $o = bbcode($o);
+
+ $ret['type'] = 'rich';
+
+ $w = (($maxwidth) ? $maxwidth : 640);
+ $h = (($maxheight) ? $maxheight : $w * 2 / 3);
+
+ $ret['html'] = '<div style="width: ' . $w . '; height: ' . $h . '; font-family: sans-serif,arial,freesans;" >' . $o . '</div>';
+
+ $ret['width'] = $w;
+ $ret['height'] = $h;
+
+ return $ret;
+
+ }
+
+ function oep_profile_reply($args) {
+
+
+ require_once('include/identity.php');
+ require_once('include/Contact.php');
+ $url = $args['url'];
+
+ if(preg_match('#//(.*?)/(.*?)/(.*?)(/|\?|&|$)#',$url,$matches)) {
+ $chn = $matches[3];
+ }
+
+ if(! $chn)
+ return;
+
+ $c = channelx_by_nick($chn);
+
+ if(! $c)
+ return;
+
+
+ $maxwidth = intval($args['maxwidth']);
+ $maxheight = intval($args['maxheight']);
+
+ $width = 800;
+ $height = 375;
+
+ if($maxwidth) {
+ $width = $maxwidth;
+ $height = (375 / 800) * $width;
+ }
+ if($maxheight) {
+ if($maxheight < $height) {
+ $width = (800 / 375) * $maxheight;
+ $height = $maxheight;
+ }
+ }
+ $ret = array();
+
+ $ret['type'] = 'rich';
+ $ret['width'] = intval($width);
+ $ret['height'] = intval($height);
+
+ $ret['html'] = get_zcard($c,get_observer_hash(),array('width' => $width, 'height' => $height));
+
+ return $ret;
+
+ }
+
+ function oep_album_reply($args) {
+
+ $ret = array();
+ $url = $args['url'];
+ $maxwidth = intval($args['maxwidth']);
+ $maxheight = intval($args['maxheight']);
+
+ if(preg_match('|//(.*?)/(.*?)/(.*?)/album/|',$url,$matches)) {
+ $chn = $matches[3];
+ $res = hex2bin(basename($url));
+ }
+
+ if(! ($chn && $res))
+ return;
+ $c = q("select * from channel where channel_address = '%s' limit 1",
+ dbesc($chn)
+ );
+
+ if(! $c)
+ return;
+
+ $sql_extra = permissions_sql($c[0]['channel_id']);
+
+ $p = q("select resource_id from photo where album = '%s' and uid = %d and scale = 0 $sql_extra order by created desc limit 1",
+ dbesc($res),
+ intval($c[0]['channel_id'])
+ );
+ if(! $p)
+ return;
+
+ $res = $p[0]['resource_id'];
+
+ $r = q("select height, width, scale, resource_id from photo where uid = %d and resource_id = '%s' $sql_extra order by scale asc",
+ intval($c[0]['channel_id']),
+ dbesc($res)
+ );
+
+ if($r) {
+ foreach($r as $rr) {
+ $foundres = false;
+ if($maxheight && $rr['height'] > $maxheight)
+ continue;
+ if($maxwidth && $rr['width'] > $maxwidth)
+ continue;
+ $foundres = true;
+ break;
+ }
+
+ if($foundres) {
+ $ret['type'] = 'link';
+ $ret['thumbnail_url'] = z_root() . '/photo/' . '/' . $rr['resource_id'] . '-' . $rr['scale'];
+ $ret['thumbnail_width'] = $rr['width'];
+ $ret['thumbnail_height'] = $rr['height'];
+ }
+
+
+ }
+ return $ret;
+
+ }
+
+
+ function oep_phototop_reply($args) {
+
+ $ret = array();
+ $url = $args['url'];
+ $maxwidth = intval($args['maxwidth']);
+ $maxheight = intval($args['maxheight']);
+
+ if(preg_match('|//(.*?)/(.*?)/(.*?)$|',$url,$matches)) {
+ $chn = $matches[3];
+ }
+
+ if(! $chn)
+ return;
+ $c = q("select * from channel where channel_address = '%s' limit 1",
+ dbesc($chn)
+ );
+
+ if(! $c)
+ return;
+
+ $sql_extra = permissions_sql($c[0]['channel_id']);
+
+ $p = q("select resource_id from photo where uid = %d and scale = 0 $sql_extra order by created desc limit 1",
+ intval($c[0]['channel_id'])
+ );
+ if(! $p)
+ return;
+
+ $res = $p[0]['resource_id'];
+
+ $r = q("select height, width, scale, resource_id from photo where uid = %d and resource_id = '%s' $sql_extra order by scale asc",
+ intval($c[0]['channel_id']),
+ dbesc($res)
+ );
+
+ if($r) {
+ foreach($r as $rr) {
+ $foundres = false;
+ if($maxheight && $rr['height'] > $maxheight)
+ continue;
+ if($maxwidth && $rr['width'] > $maxwidth)
+ continue;
+ $foundres = true;
+ break;
+ }
+
+ if($foundres) {
+ $ret['type'] = 'link';
+ $ret['thumbnail_url'] = z_root() . '/photo/' . '/' . $rr['resource_id'] . '-' . $rr['scale'];
+ $ret['thumbnail_width'] = $rr['width'];
+ $ret['thumbnail_height'] = $rr['height'];
+ }
+
+
+ }
+ return $ret;
+
+ }
+
+
+ function oep_photo_reply($args) {
+
+ $ret = array();
+ $url = $args['url'];
+ $maxwidth = intval($args['maxwidth']);
+ $maxheight = intval($args['maxheight']);
+
+ if(preg_match('|//(.*?)/(.*?)/(.*?)/image/|',$url,$matches)) {
+ $chn = $matches[3];
+ $res = basename($url);
+ }
+
+ if(! ($chn && $res))
+ return;
+ $c = q("select * from channel where channel_address = '%s' limit 1",
+ dbesc($chn)
+ );
+
+ if(! $c)
+ return;
+
+ $sql_extra = permissions_sql($c[0]['channel_id']);
+
+
+ $r = q("select height, width, scale, resource_id from photo where uid = %d and resource_id = '%s' $sql_extra order by scale asc",
+ intval($c[0]['channel_id']),
+ dbesc($res)
+ );
+
+ if($r) {
+ foreach($r as $rr) {
+ $foundres = false;
+ if($maxheight && $rr['height'] > $maxheight)
+ continue;
+ if($maxwidth && $rr['width'] > $maxwidth)
+ continue;
+ $foundres = true;
+ break;
+ }
+
+ if($foundres) {
+ $ret['type'] = 'link';
+ $ret['thumbnail_url'] = z_root() . '/photo/' . '/' . $rr['resource_id'] . '-' . $rr['scale'];
+ $ret['thumbnail_width'] = $rr['width'];
+ $ret['thumbnail_height'] = $rr['height'];
+ }
+
+
+ }
+ return $ret;
+
+ }
+}
diff --git a/Zotlabs/Module/Oexchange.php b/Zotlabs/Module/Oexchange.php
new file mode 100644
index 000000000..24fc14821
--- /dev/null
+++ b/Zotlabs/Module/Oexchange.php
@@ -0,0 +1,77 @@
+<?php
+namespace Zotlabs\Module;
+
+
+
+class Oexchange extends \Zotlabs\Web\Controller {
+
+ function init() {
+
+ if((argc() > 1) && (argv(1) === 'xrd')) {
+ $tpl = get_markup_template('oexchange_xrd.tpl');
+
+ $o = replace_macros($tpl, array('$base' => z_root()));
+ echo $o;
+ killme();
+ }
+ }
+
+ function get() {
+
+ if(! local_channel()) {
+ if(remote_channel()) {
+ $observer = \App::get_observer();
+ if($observer && $observer['xchan_url']) {
+ $parsed = @parse_url($observer['xchan_url']);
+ if(! $parsed) {
+ notice( t('Unable to find your hub.') . EOL);
+ return;
+ }
+ $url = $parsed['scheme'] . '://' . $parsed['host'] . (($parsed['port']) ? ':' . $parsed['port'] : '');
+ $url .= '/oexchange';
+ $result = z_post_url($url,$_REQUEST);
+ json_return_and_die($result);
+ }
+ }
+
+ return login(false);
+ }
+
+ if((argc() > 1) && argv(1) === 'done') {
+ info( t('Post successful.') . EOL);
+ return;
+ }
+
+ $url = (((x($_REQUEST,'url')) && strlen($_REQUEST['url']))
+ ? urlencode(notags(trim($_REQUEST['url']))) : '');
+ $title = (((x($_REQUEST,'title')) && strlen($_REQUEST['title']))
+ ? '&title=' . urlencode(notags(trim($_REQUEST['title']))) : '');
+ $description = (((x($_REQUEST,'description')) && strlen($_REQUEST['description']))
+ ? '&description=' . urlencode(notags(trim($_REQUEST['description']))) : '');
+ $tags = (((x($_REQUEST,'tags')) && strlen($_REQUEST['tags']))
+ ? '&tags=' . urlencode(notags(trim($_REQUEST['tags']))) : '');
+
+ $ret = z_fetch_url(z_root() . '/urlinfo?f=&url=' . $url . $title . $description . $tags);
+
+ if($ret['success'])
+ $s = $ret['body'];
+
+ if(! strlen($s))
+ return;
+
+ $post = array();
+
+ $post['profile_uid'] = local_channel();
+ $post['return'] = '/oexchange/done' ;
+ $post['body'] = $s;
+ $post['type'] = 'wall';
+
+ $_REQUEST = $post;
+ $mod = new Item();
+ $mod->post();
+
+ }
+
+
+
+}
diff --git a/Zotlabs/Module/Online.php b/Zotlabs/Module/Online.php
new file mode 100644
index 000000000..39399db38
--- /dev/null
+++ b/Zotlabs/Module/Online.php
@@ -0,0 +1,17 @@
+<?php
+namespace Zotlabs\Module; /** @file */
+
+
+class Online extends \Zotlabs\Web\Controller {
+
+ function init() {
+
+ $ret = array('result' => false);
+ if(argc() != 2)
+ json_return_and_die($ret);
+
+ $ret = get_online_status(argv(1));
+ json_return_and_die($ret);
+ }
+
+}
diff --git a/Zotlabs/Module/Openid.php b/Zotlabs/Module/Openid.php
new file mode 100644
index 000000000..7a6e4a81f
--- /dev/null
+++ b/Zotlabs/Module/Openid.php
@@ -0,0 +1,198 @@
+<?php
+namespace Zotlabs\Module;
+
+
+require_once('library/openid/openid.php');
+require_once('include/auth.php');
+
+
+class Openid extends \Zotlabs\Web\Controller {
+
+ function get() {
+
+ $noid = get_config('system','disable_openid');
+ if($noid)
+ goaway(z_root());
+
+ logger('mod_openid ' . print_r($_REQUEST,true), LOGGER_DATA);
+
+ if(x($_REQUEST,'openid_mode')) {
+
+ $openid = new LightOpenID(z_root());
+
+ if($openid->validate()) {
+
+ logger('openid: validate');
+
+ $authid = normalise_openid($_REQUEST['openid_identity']);
+
+ if(! strlen($authid)) {
+ logger( t('OpenID protocol error. No ID returned.') . EOL);
+ goaway(z_root());
+ }
+
+ $x = match_openid($authid);
+ if($x) {
+
+ $r = q("select * from channel where channel_id = %d limit 1",
+ intval($x)
+ );
+ if($r) {
+ $y = q("select * from account where account_id = %d limit 1",
+ intval($r[0]['channel_account_id'])
+ );
+ if($y) {
+ foreach($y as $record) {
+ if(($record['account_flags'] == ACCOUNT_OK) || ($record['account_flags'] == ACCOUNT_UNVERIFIED)) {
+ logger('mod_openid: openid success for ' . $x[0]['channel_name']);
+ $_SESSION['uid'] = $r[0]['channel_id'];
+ $_SESSION['account_id'] = $r[0]['channel_account_id'];
+ $_SESSION['authenticated'] = true;
+ authenticate_success($record,true,true,true,true);
+ goaway(z_root());
+ }
+ }
+ }
+ }
+ }
+
+ // Successful OpenID login - but we can't match it to an existing account.
+ // See if they've got an xchan
+
+ $r = q("select * from xconfig left join xchan on xchan_hash = xconfig.xchan where cat = 'system' and k = 'openid' and v = '%s' limit 1",
+ dbesc($authid)
+ );
+
+ if($r) {
+ $_SESSION['authenticated'] = 1;
+ $_SESSION['visitor_id'] = $r[0]['xchan_hash'];
+ $_SESSION['my_url'] = $r[0]['xchan_url'];
+ $_SESSION['my_address'] = $r[0]['xchan_addr'];
+ $arr = array('xchan' => $r[0], 'session' => $_SESSION);
+ call_hooks('magic_auth_openid_success',$arr);
+ \App::set_observer($r[0]);
+ require_once('include/security.php');
+ \App::set_groups(init_groups_visitor($_SESSION['visitor_id']));
+ info(sprintf( t('Welcome %s. Remote authentication successful.'),$r[0]['xchan_name']));
+ logger('mod_openid: remote auth success from ' . $r[0]['xchan_addr']);
+ if($_SESSION['return_url'])
+ goaway($_SESSION['return_url']);
+ goaway(z_root());
+ }
+
+ // no xchan...
+ // create one.
+ // We should probably probe the openid url and figure out if they have any kind of social presence we might be able to
+ // scrape some identifying info from.
+
+ $name = $authid;
+ $url = trim($_REQUEST['openid_identity'],'/');
+ if(strpos($url,'http') === false)
+ $url = 'https://' . $url;
+ $pphoto = z_root() . '/' . get_default_profile_photo();
+ $parsed = @parse_url($url);
+ if($parsed) {
+ $host = $parsed['host'];
+ }
+
+ $attr = $openid->getAttributes();
+
+ if(is_array($attr) && count($attr)) {
+ foreach($attr as $k => $v) {
+ if($k === 'namePerson/friendly')
+ $nick = notags(trim($v));
+ if($k === 'namePerson/first')
+ $first = notags(trim($v));
+ if($k === 'namePerson')
+ $name = notags(trim($v));
+ if($k === 'contact/email')
+ $addr = notags(trim($v));
+ if($k === 'media/image/aspect11')
+ $photosq = trim($v);
+ if($k === 'media/image/default')
+ $photo_other = trim($v);
+ }
+ }
+ if(! $nick) {
+ if($first)
+ $nick = $first;
+ else
+ $nick = $name;
+ }
+
+ require_once('library/urlify/URLify.php');
+ $x = strtolower(\URLify::transliterate($nick));
+ if($nick & $host)
+ $addr = $nick . '@' . $host;
+ $network = 'unknown';
+
+ if($photosq)
+ $pphoto = $photosq;
+ elseif($photo_other)
+ $pphoto = $photo_other;
+
+ $mimetype = guess_image_type($pphoto);
+
+ $x = q("insert into xchan ( xchan_hash, xchan_guid, xchan_guid_sig, xchan_pubkey, xchan_photo_mimetype,
+ xchan_photo_l, xchan_addr, xchan_url, xchan_connurl, xchan_follow, xchan_connpage, xchan_name, xchan_network, xchan_photo_date,
+ xchan_name_date, xchan_hidden)
+ values ( '%s', '%s', '%s', '%s' , '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', 1) ",
+ dbesc($url),
+ dbesc(''),
+ dbesc(''),
+ dbesc(''),
+ dbesc($mimetype),
+ dbesc($pphoto),
+ dbesc($addr),
+ dbesc($url),
+ dbesc(''),
+ dbesc(''),
+ dbesc(''),
+ dbesc($name),
+ dbesc($network),
+ dbesc(datetime_convert()),
+ dbesc(datetime_convert())
+ );
+ if($x) {
+ $r = q("select * from xchan where xchan_hash = '%s' limit 1",
+ dbesc($url)
+ );
+ if($r) {
+
+ $photos = import_xchan_photo($pphoto,$url);
+ if($photos) {
+ $z = q("update xchan set xchan_photo_date = '%s', xchan_photo_l = '%s', xchan_photo_m = '%s',
+ xchan_photo_s = '%s', xchan_photo_mimetype = '%s' where xchan_hash = '%s'",
+ dbesc(datetime_convert()),
+ dbesc($photos[0]),
+ dbesc($photos[1]),
+ dbesc($photos[2]),
+ dbesc($photos[3]),
+ dbesc($url)
+ );
+ }
+
+ set_xconfig($url,'system','openid',$authid);
+ $_SESSION['authenticated'] = 1;
+ $_SESSION['visitor_id'] = $r[0]['xchan_hash'];
+ $_SESSION['my_url'] = $r[0]['xchan_url'];
+ $_SESSION['my_address'] = $r[0]['xchan_addr'];
+ $arr = array('xchan' => $r[0], 'session' => $_SESSION);
+ call_hooks('magic_auth_openid_success',$arr);
+ \App::set_observer($r[0]);
+ info(sprintf( t('Welcome %s. Remote authentication successful.'),$r[0]['xchan_name']));
+ logger('mod_openid: remote auth success from ' . $r[0]['xchan_addr']);
+ if($_SESSION['return_url'])
+ goaway($_SESSION['return_url']);
+ goaway(z_root());
+ }
+ }
+
+ }
+ }
+ notice( t('Login failed.') . EOL);
+ goaway(z_root());
+ // NOTREACHED
+ }
+
+}
diff --git a/Zotlabs/Module/Opensearch.php b/Zotlabs/Module/Opensearch.php
new file mode 100644
index 000000000..8e76038c9
--- /dev/null
+++ b/Zotlabs/Module/Opensearch.php
@@ -0,0 +1,24 @@
+<?php
+namespace Zotlabs\Module;
+
+
+class Opensearch extends \Zotlabs\Web\Controller {
+
+ function init() {
+
+ $tpl = get_markup_template('opensearch.tpl');
+
+ header("Content-type: application/opensearchdescription+xml");
+
+ $o = replace_macros($tpl, array(
+ '$baseurl' => z_root(),
+ '$nodename' => \App::get_hostname(),
+ ));
+
+ echo $o;
+
+ killme();
+
+ }
+
+}
diff --git a/Zotlabs/Module/Page.php b/Zotlabs/Module/Page.php
new file mode 100644
index 000000000..64b940b0f
--- /dev/null
+++ b/Zotlabs/Module/Page.php
@@ -0,0 +1,150 @@
+<?php
+namespace Zotlabs\Module;
+
+require_once('include/items.php');
+require_once('include/conversation.php');
+require_once('include/page_widgets.php');
+
+
+class Page extends \Zotlabs\Web\Controller {
+
+ function init() {
+ // We need this to make sure the channel theme is always loaded.
+
+ $which = argv(1);
+ $profile = 0;
+ profile_load($a,$which,$profile);
+
+
+
+ if(\App::$profile['profile_uid'])
+ head_set_icon(\App::$profile['thumb']);
+
+ // load the item here in the init function because we need to extract
+ // the page layout and initialise the correct theme.
+
+
+ $observer = \App::get_observer();
+ $ob_hash = (($observer) ? $observer['xchan_hash'] : '');
+
+
+ // perm_is_allowed is denied unconditionally when 'site blocked to unauthenticated members'.
+ // This bypasses that restriction for sys channel (public) content
+
+ if((! perm_is_allowed(\App::$profile['profile_uid'],$ob_hash,'view_pages')) && (! is_sys_channel(\App::$profile['profile_uid']))) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ if(argc() < 3) {
+ notice( t('Invalid item.') . EOL);
+ return;
+ }
+
+ $channel_address = argv(1);
+
+ // The page link title was stored in a urlencoded format
+ // php or the browser may/will have decoded it, so re-encode it for our search
+
+ $page_id = urlencode(argv(2));
+
+ $u = q("select channel_id from channel where channel_address = '%s' limit 1",
+ dbesc($channel_address)
+ );
+
+ if(! $u) {
+ notice( t('Channel not found.') . EOL);
+ return;
+ }
+
+ if($_REQUEST['rev'])
+ $revision = " and revision = " . intval($_REQUEST['rev']) . " ";
+ else
+ $revision = " order by revision desc ";
+
+ require_once('include/security.php');
+ $sql_options = item_permissions_sql($u[0]['channel_id']);
+
+ $r = q("select item.* from item left join item_id on item.id = item_id.iid
+ where item.uid = %d and sid = '%s' and (( service = 'WEBPAGE' and item_type = %d )
+ OR ( service = 'PDL' AND item_type = %d )) $sql_options $revision limit 1",
+ intval($u[0]['channel_id']),
+ dbesc($page_id),
+ intval(ITEM_TYPE_WEBPAGE),
+ intval(ITEM_TYPE_PDL)
+ );
+ if(! $r) {
+
+ // Check again with no permissions clause to see if it is a permissions issue
+
+ $x = q("select item.* from item left join item_id on item.id = item_id.iid
+ where item.uid = %d and sid = '%s' and service = 'WEBPAGE' and
+ item_type = %d $revision limit 1",
+ intval($u[0]['channel_id']),
+ dbesc($page_id),
+ intval(ITEM_TYPE_WEBPAGE)
+ );
+
+ if($x) {
+ // Yes, it's there. You just aren't allowed to see it.
+ notice( t('Permission denied.') . EOL);
+ }
+ else {
+ notice( t('Page not found.') . EOL);
+ }
+ return;
+ }
+
+ if($r[0]['title'])
+ \App::$page['title'] = escape_tags($r[0]['title']);
+
+ if($r[0]['item_type'] == ITEM_TYPE_PDL) {
+ require_once('include/comanche.php');
+ comanche_parser(get_app(),$r[0]['body']);
+ \App::$pdl = $r[0]['body'];
+ }
+ elseif($r[0]['layout_mid']) {
+ $l = q("select body from item where mid = '%s' and uid = %d limit 1",
+ dbesc($r[0]['layout_mid']),
+ intval($u[0]['channel_id'])
+ );
+
+ if($l) {
+ require_once('include/comanche.php');
+ comanche_parser(get_app(),$l[0]['body']);
+ \App::$pdl = $l[0]['body'];
+ }
+ }
+
+ \App::$data['webpage'] = $r;
+
+ }
+
+
+
+
+ function get() {
+
+ $r = \App::$data['webpage'];
+ if(! $r)
+ return;
+
+ if($r[0]['item_type'] == ITEM_TYPE_PDL) {
+ $r[0]['body'] = t('Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.');
+ $r[0]['mimetype'] = 'text/plain';
+ $r[0]['title'] = '';
+
+ }
+
+ xchan_query($r);
+ $r = fetch_post_tags($r,true);
+
+ if($r[0]['mimetype'] === 'application/x-pdl')
+ \App::$page['pdl_content'] = true;
+
+ $o .= prepare_page($r[0]);
+ return $o;
+
+ }
+
+}
diff --git a/Zotlabs/Module/Pconfig.php b/Zotlabs/Module/Pconfig.php
new file mode 100644
index 000000000..b6264bddc
--- /dev/null
+++ b/Zotlabs/Module/Pconfig.php
@@ -0,0 +1,122 @@
+<?php
+namespace Zotlabs\Module;
+
+
+
+
+
+class Pconfig extends \Zotlabs\Web\Controller {
+
+ function post() {
+
+ if(! local_channel())
+ return;
+
+
+ if($_SESSION['delegate'])
+ return;
+
+ check_form_security_token_redirectOnErr('/pconfig', 'pconfig');
+
+ $cat = trim(escape_tags($_POST['cat']));
+ $k = trim(escape_tags($_POST['k']));
+ $v = trim($_POST['v']);
+
+ if(in_array(argv(2),$this->disallowed_pconfig())) {
+ notice( t('This setting requires special processing and editing has been blocked.') . EOL);
+ return;
+ }
+
+ if(strpos($k,'password') !== false) {
+ $v = z_obscure($v);
+ }
+
+ set_pconfig(local_channel(),$cat,$k,$v);
+ build_sync_packet();
+
+ goaway(z_root() . '/pconfig/' . $cat . '/' . $k);
+
+ }
+
+
+ function get() {
+
+ if(! local_channel()) {
+ return login();
+ }
+
+ $content = '<h3>' . t('Configuration Editor') . '</h3>';
+ $content .= '<div class="descriptive-paragraph">' . t('Warning: Changing some settings could render your channel inoperable. Please leave this page unless you are comfortable with and knowledgeable about how to correctly use this feature.') . '</div>' . EOL . EOL;
+
+
+
+ if(argc() == 3) {
+ $content .= '<a href="pconfig">pconfig[' . local_channel() . ']</a>' . EOL;
+ $content .= '<a href="pconfig/' . escape_tags(argv(1)) . '">pconfig[' . local_channel() . '][' . escape_tags(argv(1)) . ']</a>' . EOL . EOL;
+ $content .= '<a href="pconfig/' . escape_tags(argv(1)) . '/' . escape_tags(argv(2)) . '" >pconfig[' . local_channel() . '][' . escape_tags(argv(1)) . '][' . escape_tags(argv(2)) . ']</a> = ' . get_pconfig(local_channel(),escape_tags(argv(1)),escape_tags(argv(2))) . EOL;
+
+ if(in_array(argv(2),$this->disallowed_pconfig())) {
+ notice( t('This setting requires special processing and editing has been blocked.') . EOL);
+ return $content;
+ }
+ else
+ $content .= $this->pconfig_form(escape_tags(argv(1)),escape_tags(argv(2)));
+ }
+
+
+ if(argc() == 2) {
+ $content .= '<a href="pconfig">pconfig[' . local_channel() . ']</a>' . EOL;
+ load_pconfig(local_channel(),escape_tags(argv(1)));
+ foreach(\App::$config[local_channel()][escape_tags(argv(1))] as $k => $x) {
+ $content .= '<a href="pconfig/' . escape_tags(argv(1)) . '/' . $k . '" >pconfig[' . local_channel() . '][' . escape_tags(argv(1)) . '][' . $k . ']</a> = ' . escape_tags($x) . EOL;
+ }
+ }
+
+ if(argc() == 1) {
+
+ $r = q("select * from pconfig where uid = " . local_channel());
+ if($r) {
+ foreach($r as $rr) {
+ $content .= '<a href="' . 'pconfig/' . escape_tags($rr['cat']) . '/' . escape_tags($rr['k']) . '" >pconfig[' . local_channel() . '][' . escape_tags($rr['cat']) . '][' . escape_tags($rr['k']) . ']</a> = ' . escape_tags($rr['v']) . EOL;
+ }
+ }
+ }
+ return $content;
+
+ }
+
+
+ function pconfig_form($cat,$k) {
+
+ $o = '<form action="pconfig" method="post" >';
+ $o .= '<input type="hidden" name="form_security_token" value="' . get_form_security_token('pconfig') . '" />';
+
+ $v = get_pconfig(local_channel(),$cat,$k);
+ if(strpos($k,'password') !== false)
+ $v = z_unobscure($v);
+
+ $o .= '<input type="hidden" name="cat" value="' . $cat . '" />';
+ $o .= '<input type="hidden" name="k" value="' . $k . '" />';
+
+ if(strpos($v,"\n"))
+ $o .= '<textarea name="v" >' . escape_tags($v) . '</textarea>';
+ else
+ $o .= '<input type="text" name="v" value="' . escape_tags($v) . '" />';
+
+ $o .= EOL . EOL;
+ $o .= '<input type="submit" name="submit" value="' . t('Submit') . '" />';
+ $o .= '</form>';
+
+ return $o;
+
+ }
+
+
+
+ function disallowed_pconfig() {
+ return array(
+ 'permissions_role'
+ );
+ }
+
+}
diff --git a/Zotlabs/Module/Pdledit.php b/Zotlabs/Module/Pdledit.php
new file mode 100644
index 000000000..accfb6fa1
--- /dev/null
+++ b/Zotlabs/Module/Pdledit.php
@@ -0,0 +1,72 @@
+<?php
+namespace Zotlabs\Module;
+
+
+class Pdledit extends \Zotlabs\Web\Controller {
+
+ function post() {
+ if(! local_channel())
+ return;
+ if(! $_REQUEST['module'])
+ return;
+ if(! trim($_REQUEST['content'])) {
+ del_pconfig(local_channel(),'system','mod_' . $_REQUEST['module'] . '.pdl');
+ goaway(z_root() . '/pdledit/' . $_REQUEST['module']);
+ }
+ set_pconfig(local_channel(),'system','mod_' . $_REQUEST['module'] . '.pdl',escape_tags($_REQUEST['content']));
+ build_sync_packet();
+ info( t('Layout updated.') . EOL);
+ goaway(z_root() . '/pdledit/' . $_REQUEST['module']);
+ }
+
+
+ function get() {
+
+ if(! local_channel()) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ if(argc() > 1)
+ $module = 'mod_' . argv(1) . '.pdl';
+ else {
+ $o .= '<div class="generic-content-wrapper-styled">';
+ $o .= '<h1>' . t('Edit System Page Description') . '</h1>';
+ $files = glob('mod/*');
+ if($files) {
+ foreach($files as $f) {
+ $name = basename($f,'.php');
+ $x = theme_include('mod_' . $name . '.pdl');
+ if($x) {
+ $o .= '<a href="pdledit/' . $name . '" >' . $name . '</a><br />';
+ }
+ }
+ }
+
+ $o .= '</div>';
+
+ // list module pdl files
+ return $o;
+ }
+
+ $t = get_pconfig(local_channel(),'system',$module);
+ if(! $t)
+ $t = file_get_contents(theme_include($module));
+ if(! $t) {
+ notice( t('Layout not found.') . EOL);
+ return '';
+ }
+
+ $o = replace_macros(get_markup_template('pdledit.tpl'),array(
+ '$header' => t('Edit System Page Description'),
+ '$mname' => t('Module Name:'),
+ '$help' => t('Layout Help'),
+ '$module' => argv(1),
+ '$content' => htmlspecialchars($t,ENT_COMPAT,'UTF-8'),
+ '$submit' => t('Submit')
+ ));
+
+ return $o;
+ }
+
+}
diff --git a/Zotlabs/Module/Photo.php b/Zotlabs/Module/Photo.php
new file mode 100644
index 000000000..408688886
--- /dev/null
+++ b/Zotlabs/Module/Photo.php
@@ -0,0 +1,250 @@
+<?php
+namespace Zotlabs\Module;
+
+require_once('include/security.php');
+require_once('include/photo/photo_driver.php');
+
+
+class Photo extends \Zotlabs\Web\Controller {
+
+ function init() {
+
+ $prvcachecontrol = false;
+
+ switch(argc()) {
+ case 4:
+ $person = argv(3);
+ $res = argv(2);
+ $type = argv(1);
+ break;
+ case 2:
+ $photo = argv(1);
+ break;
+ case 1:
+ default:
+ killme();
+ // NOTREACHED
+ }
+
+ $observer_xchan = get_observer_hash();
+
+ $default = get_default_profile_photo();
+
+ if(isset($type)) {
+
+ /**
+ * Profile photos - Access controls on default profile photos are not honoured since they need to be exchanged with remote sites.
+ *
+ */
+
+ if($type === 'profile') {
+ switch($res) {
+
+ case 'm':
+ $resolution = 5;
+ $default = get_default_profile_photo(80);
+ break;
+ case 's':
+ $resolution = 6;
+ $default = get_default_profile_photo(48);
+ break;
+ case 'l':
+ default:
+ $resolution = 4;
+ break;
+ }
+ }
+
+ $uid = $person;
+
+ $r = q("SELECT * FROM photo WHERE scale = %d AND uid = %d AND photo_usage = %d LIMIT 1",
+ intval($resolution),
+ intval($uid),
+ intval(PHOTO_PROFILE)
+ );
+ if(count($r)) {
+ $data = dbunescbin($r[0]['data']);
+ $mimetype = $r[0]['type'];
+ }
+ if(intval($r[0]['os_storage']))
+ $data = file_get_contents($data);
+ if(! isset($data)) {
+ $data = file_get_contents($default);
+ $mimetype = 'image/png';
+ }
+ }
+ else {
+
+ /**
+ * Other photos
+ */
+
+ /* Check for a cookie to indicate display pixel density, in order to detect high-resolution
+ displays. This procedure was derived from the "Retina Images" by Jeremey Worboys,
+ used in accordance with the Creative Commons Attribution 3.0 Unported License.
+ Project link: https://github.com/Retina-Images/Retina-Images
+ License link: http://creativecommons.org/licenses/by/3.0/
+ */
+ $cookie_value = false;
+ if (isset($_COOKIE['devicePixelRatio'])) {
+ $cookie_value = intval($_COOKIE['devicePixelRatio']);
+ }
+ else {
+ // Force revalidation of cache on next request
+ $cache_directive = 'no-cache';
+ $status = 'no cookie';
+ }
+
+ $resolution = 0;
+
+ if(strpos($photo,'.') !== false)
+ $photo = substr($photo,0,strpos($photo,'.'));
+
+ if(substr($photo,-2,1) == '-') {
+ $resolution = intval(substr($photo,-1,1));
+ $photo = substr($photo,0,-2);
+ // If viewing on a high-res screen, attempt to serve a higher resolution image:
+ if ($resolution == 2 && ($cookie_value > 1))
+ {
+ $resolution = 1;
+ }
+ }
+
+ // If using resolution 1, make sure it exists before proceeding:
+ if ($resolution == 1)
+ {
+ $r = q("SELECT uid FROM photo WHERE resource_id = '%s' AND scale = %d LIMIT 1",
+ dbesc($photo),
+ intval($resolution)
+ );
+ if (!($r))
+ $resolution = 2;
+ }
+
+ $r = q("SELECT uid FROM photo WHERE resource_id = '%s' AND scale = %d LIMIT 1",
+ dbesc($photo),
+ intval($resolution)
+ );
+ if($r) {
+
+ $allowed = (($r[0]['uid']) ? perm_is_allowed($r[0]['uid'],$observer_xchan,'view_storage') : true);
+
+ $sql_extra = permissions_sql($r[0]['uid']);
+
+ // Now we'll see if we can access the photo
+
+ $r = q("SELECT * FROM photo WHERE resource_id = '%s' AND scale = %d $sql_extra LIMIT 1",
+ dbesc($photo),
+ intval($resolution)
+ );
+
+ if($r && $allowed) {
+ $data = dbunescbin($r[0]['data']);
+ $mimetype = $r[0]['type'];
+ if(intval($r[0]['os_storage']))
+ $data = file_get_contents($data);
+ }
+ else {
+
+ // Does the picture exist? It may be a remote person with no credentials,
+ // but who should otherwise be able to view it. Show a default image to let
+ // them know permissions was denied. It may be possible to view the image
+ // through an authenticated profile visit.
+ // There won't be many completely unauthorised people seeing this because
+ // they won't have the photo link, so there's a reasonable chance that the person
+ // might be able to obtain permission to view it.
+
+ $r = q("SELECT * FROM `photo` WHERE `resource_id` = '%s' AND `scale` = %d LIMIT 1",
+ dbesc($photo),
+ intval($resolution)
+ );
+
+ if($r) {
+ logger('mod_photo: forbidden. ' . \App::$query_string);
+ $observer = \App::get_observer();
+ logger('mod_photo: observer = ' . (($observer) ? $observer['xchan_addr'] : '(not authenticated)'));
+ $data = file_get_contents('images/nosign.png');
+ $mimetype = 'image/png';
+ $prvcachecontrol = true;
+ }
+ }
+ }
+ }
+
+ if(! isset($data)) {
+ if(isset($resolution)) {
+ switch($resolution) {
+
+ case 4:
+ $data = file_get_contents(get_default_profile_photo());
+ $mimetype = 'image/png';
+ break;
+ case 5:
+ $data = file_get_contents(get_default_profile_photo(80));
+ $mimetype = 'image/png';
+ break;
+ case 6:
+ $data = file_get_contents(get_default_profile_photo(48));
+ $mimetype = 'image/png';
+ break;
+ default:
+ killme();
+ // NOTREACHED
+ break;
+ }
+ }
+ }
+
+ if(isset($res) && intval($res) && $res < 500) {
+ $ph = photo_factory($data, $mimetype);
+ if($ph->is_valid()) {
+ $ph->scaleImageSquare($res);
+ $data = $ph->imageString();
+ $mimetype = $ph->getType();
+ }
+ }
+
+ // Writing in cachefile
+ if (isset($cachefile) && $cachefile != '')
+ file_put_contents($cachefile, $data);
+
+ if(function_exists('header_remove')) {
+ header_remove('Pragma');
+ header_remove('pragma');
+ }
+
+ header("Content-type: " . $mimetype);
+
+ if($prvcachecontrol) {
+
+ // it is a private photo that they have no permission to view.
+ // tell the browser not to cache it, in case they authenticate
+ // and subsequently have permission to see it
+
+ header("Cache-Control: no-store, no-cache, must-revalidate");
+
+ }
+ else {
+ // The photo cache default is 1 day to provide a privacy trade-off,
+ // as somebody reducing photo permissions on a photo that is already
+ // "in the wild" won't be able to stop the photo from being viewed
+ // for this amount amount of time once it is in the browser cache.
+ // The privacy expectations of your site members and their perception
+ // of privacy where it affects the entire project may be affected.
+ // This has performance considerations but we highly recommend you
+ // leave it alone.
+
+ $cache = get_config('system','photo_cache_time');
+ if(! $cache)
+ $cache = (3600 * 24); // 1 day
+
+ header("Expires: " . gmdate("D, d M Y H:i:s", time() + $cache) . " GMT");
+ header("Cache-Control: max-age=" . $cache);
+
+ }
+ echo $data;
+ killme();
+ // NOTREACHED
+ }
+
+}
diff --git a/Zotlabs/Module/Photos.php b/Zotlabs/Module/Photos.php
new file mode 100644
index 000000000..ce350666f
--- /dev/null
+++ b/Zotlabs/Module/Photos.php
@@ -0,0 +1,1385 @@
+<?php
+namespace Zotlabs\Module;
+require_once('include/photo/photo_driver.php');
+require_once('include/photos.php');
+require_once('include/items.php');
+require_once('include/acl_selectors.php');
+require_once('include/bbcode.php');
+require_once('include/security.php');
+require_once('include/Contact.php');
+require_once('include/attach.php');
+require_once('include/text.php');
+
+
+
+class Photos extends \Zotlabs\Web\Controller {
+
+ function init() {
+
+
+ if((get_config('system','block_public')) && (! local_channel()) && (! remote_channel())) {
+ return;
+ }
+
+ $o = '';
+
+ if(argc() > 1) {
+ $nick = argv(1);
+
+ profile_load($a,$nick);
+
+ $channelx = channelx_by_nick($nick);
+
+ if(! $channelx)
+ return;
+
+ \App::$data['channel'] = $channelx;
+
+ $observer = \App::get_observer();
+ \App::$data['observer'] = $observer;
+
+ $observer_xchan = (($observer) ? $observer['xchan_hash'] : '');
+
+ head_set_icon(\App::$data['channel']['xchan_photo_s']);
+
+ \App::$page['htmlhead'] .= "<script> var ispublic = '" . t('everybody') . "'; var profile_uid = " . ((\App::$data['channel']) ? \App::$data['channel']['channel_id'] : 0) . "; </script>" ;
+
+ }
+
+ return;
+ }
+
+
+
+ function post() {
+
+ logger('mod-photos: photos_post: begin' , LOGGER_DEBUG);
+
+
+ logger('mod_photos: REQUEST ' . print_r($_REQUEST,true), LOGGER_DATA);
+ logger('mod_photos: FILES ' . print_r($_FILES,true), LOGGER_DATA);
+
+ $ph = photo_factory('');
+
+ $phototypes = $ph->supportedTypes();
+
+ $can_post = false;
+
+ $page_owner_uid = \App::$data['channel']['channel_id'];
+
+ if(perm_is_allowed($page_owner_uid,get_observer_hash(),'write_storage'))
+ $can_post = true;
+
+ if(! $can_post) {
+ notice( t('Permission denied.') . EOL );
+ if(is_ajax())
+ killme();
+ return;
+ }
+
+ $s = abook_self($page_owner_uid);
+
+ if(! $s) {
+ notice( t('Page owner information could not be retrieved.') . EOL);
+ logger('mod_photos: post: unable to locate contact record for page owner. uid=' . $page_owner_uid);
+ if(is_ajax())
+ killme();
+ return;
+ }
+
+ $owner_record = $s[0];
+
+ $acl = new \Zotlabs\Access\AccessList(\App::$data['channel']);
+
+ if((argc() > 3) && (argv(2) === 'album')) {
+
+ $album = hex2bin(argv(3));
+
+ if($album === t('Profile Photos')) {
+ // not allowed
+ goaway(z_root() . '/' . $_SESSION['photo_return']);
+ }
+
+ if(! photos_album_exists($page_owner_uid,$album)) {
+ notice( t('Album not found.') . EOL);
+ goaway(z_root() . '/' . $_SESSION['photo_return']);
+ }
+
+
+ /*
+ * RENAME photo album
+ */
+
+ $newalbum = notags(trim($_REQUEST['albumname']));
+ if($newalbum != $album) {
+
+ // @fixme - syncronise with DAV or disallow completely
+
+ goaway(z_root() . '/' . $_SESSION['photo_return']);
+
+ // $x = photos_album_rename($page_owner_uid,$album,$newalbum);
+ // if($x) {
+ // $newurl = str_replace(bin2hex($album),bin2hex($newalbum),$_SESSION['photo_return']);
+ // goaway(z_root() . '/' . $newurl);
+ // }
+ }
+
+ /*
+ * DELETE photo album and all its photos
+ */
+
+ if($_REQUEST['dropalbum'] == t('Delete Album')) {
+
+
+ // This is dangerous because we combined file storage and photos into one interface
+ // This function will remove all photos from any directory with the same name since
+ // we have not passed the path value.
+
+ // The correct solution would be to use a full pathname from your storage root for 'album'
+ // We also need to prevent/block removing the storage root folder.
+
+ $folder_hash = '';
+
+ $r = q("select * from attach where is_dir = 1 and uid = %d and filename = '%s'",
+ intval($page_owner_uid),
+ dbesc($album)
+ );
+ if(! $r) {
+ notice( t('Album not found.') . EOL);
+ return;
+ }
+ if(count($r) > 1) {
+ notice( t('Multiple storage folders exist with this album name, but within different directories. Please remove the desired folder or folders using the Files manager') . EOL);
+ return;
+ }
+ else {
+ $folder_hash = $r[0]['hash'];
+ }
+
+
+
+ $res = array();
+
+ // get the list of photos we are about to delete
+
+ if(remote_channel() && (! local_channel())) {
+ $str = photos_album_get_db_idstr($page_owner_uid,$album,remote_channel());
+ }
+ elseif(local_channel()) {
+ $str = photos_album_get_db_idstr(local_channel(),$album);
+ }
+ else {
+ $str = null;
+ }
+ if(! $str) {
+ goaway(z_root() . '/' . $_SESSION['photo_return']);
+ }
+
+ $r = q("select id from item where resource_id in ( $str ) and resource_type = 'photo' and uid = %d " . item_normal(),
+ intval($page_owner_uid)
+ );
+ if($r) {
+ foreach($r as $i) {
+ attach_delete($page_owner_uid, $i['resource_id'], 1 );
+ }
+ }
+
+ // remove the associated photos in case they weren't attached to an item
+
+ q("delete from photo where resource_id in ( $str ) and uid = %d",
+ intval($page_owner_uid)
+ );
+
+ // @FIXME do the same for the linked attach
+
+ if($folder_hash) {
+ attach_delete($page_owner_uid,$folder_hash, 1);
+
+ $sync = attach_export_data(\App::$data['channel'],$folder_hash, true);
+
+ if($sync)
+ build_sync_packet($page_owner_uid,array('file' => array($sync)));
+ }
+
+ }
+
+ goaway(z_root() . '/photos/' . \App::$data['channel']['channel_address']);
+ }
+
+ if((argc() > 2) && (x($_REQUEST,'delete')) && ($_REQUEST['delete'] === t('Delete Photo'))) {
+
+ // same as above but remove single photo
+
+ $ob_hash = get_observer_hash();
+ if(! $ob_hash)
+ goaway(z_root() . '/' . $_SESSION['photo_return']);
+
+ $r = q("SELECT `id`, `resource_id` FROM `photo` WHERE ( xchan = '%s' or `uid` = %d ) AND `resource_id` = '%s' LIMIT 1",
+ dbesc($ob_hash),
+ intval(local_channel()),
+ dbesc(\App::$argv[2])
+ );
+
+ if($r) {
+ attach_delete($page_owner_uid, $r[0]['resource_id'], 1 );
+ $sync = attach_export_data(\App::$data['channel'],$r[0]['resource_id'], true);
+
+ if($sync)
+ build_sync_packet($page_owner_uid,array('file' => array($sync)));
+ }
+
+ goaway(z_root() . '/photos/' . \App::$data['channel']['channel_address'] . '/album/' . $_SESSION['album_return']);
+ }
+
+
+ if((\App::$argc > 2) && ((x($_POST,'desc') !== false) || (x($_POST,'newtag') !== false)) || (x($_POST,'albname') !== false)) {
+
+
+ $desc = ((x($_POST,'desc')) ? notags(trim($_POST['desc'])) : '');
+ $rawtags = ((x($_POST,'newtag')) ? notags(trim($_POST['newtag'])) : '');
+ $item_id = ((x($_POST,'item_id')) ? intval($_POST['item_id']) : 0);
+ $albname = ((x($_POST,'albname')) ? notags(trim($_POST['albname'])) : '');
+ $is_nsfw = ((x($_POST,'adult')) ? intval($_POST['adult']) : 0);
+
+ $acl->set_from_array($_POST);
+ $perm = $acl->get();
+
+ $resource_id = argv(2);
+
+ if(! strlen($albname))
+ $albname = datetime_convert('UTC',date_default_timezone_get(),'now', 'Y');
+
+
+ if((x($_POST,'rotate') !== false) &&
+ ( (intval($_POST['rotate']) == 1) || (intval($_POST['rotate']) == 2) )) {
+ logger('rotate');
+
+ $r = q("select * from photo where `resource_id` = '%s' and uid = %d and scale = 0 limit 1",
+ dbesc($resource_id),
+ intval($page_owner_uid)
+ );
+ if(count($r)) {
+ $d = (($r[0]['os_storage']) ? @file_get_contents($r[0]['data']) : dbunescbin($r[0]['data']));
+ $ph = photo_factory($d, $r[0]['type']);
+ if($ph->is_valid()) {
+ $rotate_deg = ( (intval($_POST['rotate']) == 1) ? 270 : 90 );
+ $ph->rotate($rotate_deg);
+
+ $width = $ph->getWidth();
+ $height = $ph->getHeight();
+
+ if(intval($r[0]['os_storage'])) {
+ @file_put_contents($r[0]['data'],$ph->imageString());
+ $data = $r[0]['data'];
+ $fsize = @filesize($r[0]['data']);
+ q("update attach set filesize = %d where hash = '%s' and uid = %d limit 1",
+ intval($fsize),
+ dbesc($resource_id),
+ intval($page_owner_uid)
+ );
+ }
+ else {
+ $data = $ph->imageString();
+ $fsize = strlen($data);
+ }
+
+ $x = q("update photo set data = '%s', `size` = %d, height = %d, width = %d where `resource_id` = '%s' and uid = %d and scale = 0",
+ dbescbin($data),
+ intval($fsize),
+ intval($height),
+ intval($width),
+ dbesc($resource_id),
+ intval($page_owner_uid)
+ );
+
+ if($width > 1024 || $height > 1024)
+ $ph->scaleImage(1024);
+
+ $width = $ph->getWidth();
+ $height = $ph->getHeight();
+
+ $x = q("update photo set data = '%s', height = %d, width = %d where `resource_id` = '%s' and uid = %d and scale = 1",
+ dbescbin($ph->imageString()),
+ intval($height),
+ intval($width),
+ dbesc($resource_id),
+ intval($page_owner_uid)
+ );
+
+
+ if($width > 640 || $height > 640)
+ $ph->scaleImage(640);
+
+ $width = $ph->getWidth();
+ $height = $ph->getHeight();
+
+ $x = q("update photo set data = '%s', height = %d, width = %d where `resource_id` = '%s' and uid = %d and scale = 2",
+ dbescbin($ph->imageString()),
+ intval($height),
+ intval($width),
+ dbesc($resource_id),
+ intval($page_owner_uid)
+ );
+
+
+ if($width > 320 || $height > 320)
+ $ph->scaleImage(320);
+
+ $width = $ph->getWidth();
+ $height = $ph->getHeight();
+
+ $x = q("update photo set data = '%s', height = %d, width = %d where `resource_id` = '%s' and uid = %d and scale = 3",
+ dbescbin($ph->imageString()),
+ intval($height),
+ intval($width),
+ dbesc($resource_id),
+ intval($page_owner_uid)
+ );
+ }
+ }
+ }
+
+ $p = q("SELECT type, is_nsfw, description, resource_id, scale, allow_cid, allow_gid, deny_cid, deny_gid FROM photo WHERE resource_id = '%s' AND uid = %d ORDER BY scale DESC",
+ dbesc($resource_id),
+ intval($page_owner_uid)
+ );
+ if($p) {
+ $ext = $phototypes[$p[0]['type']];
+
+ $r = q("UPDATE `photo` SET `description` = '%s', `allow_cid` = '%s', `allow_gid` = '%s', `deny_cid` = '%s', `deny_gid` = '%s' WHERE `resource_id` = '%s' AND `uid` = %d",
+ dbesc($desc),
+ dbesc($perm['allow_cid']),
+ dbesc($perm['allow_gid']),
+ dbesc($perm['deny_cid']),
+ dbesc($perm['deny_gid']),
+ dbesc($resource_id),
+ intval($page_owner_uid)
+ );
+ }
+
+ $item_private = (($str_contact_allow || $str_group_allow || $str_contact_deny || $str_group_deny) ? true : false);
+
+ $old_is_nsfw = $p[0]['is_nsfw'];
+ if($old_is_nsfw != $is_nsfw) {
+ $r = q("update photo set is_nsfw = %d where resource_id = '%s' and uid = %d",
+ intval($is_nsfw),
+ dbesc($resource_id),
+ intval($page_owner_uid)
+ );
+ }
+
+ /* Don't make the item visible if the only change was the album name */
+
+ $visibility = 0;
+ if($p[0]['description'] !== $desc || strlen($rawtags))
+ $visibility = 1;
+
+ if(! $item_id) {
+ $item_id = photos_create_item(\App::$data['channel'],get_observer_hash(),$p[0],$visibility);
+
+ }
+
+ if($item_id) {
+ $r = q("SELECT * FROM `item` WHERE `id` = %d AND `uid` = %d LIMIT 1",
+ intval($item_id),
+ intval($page_owner_uid)
+ );
+
+ if($r) {
+ $old_tag = $r[0]['tag'];
+ $old_inform = $r[0]['inform'];
+ }
+ }
+
+
+ // make sure the linked item has the same permissions as the photo regardless of any other changes
+ $x = q("update item set allow_cid = '%s', allow_gid = '%s', deny_cid = '%s', deny_gid = '%s', item_private = %d
+ where id = %d",
+ dbesc($perm['allow_cid']),
+ dbesc($perm['allow_gid']),
+ dbesc($perm['deny_cid']),
+ dbesc($perm['deny_gid']),
+ intval($acl->is_private()),
+ intval($item_id)
+ );
+
+ // make sure the attach has the same permissions as the photo regardless of any other changes
+ $x = q("update attach set allow_cid = '%s', allow_gid = '%s', deny_cid = '%s', deny_gid = '%s' where hash = '%s' and uid = %d and is_photo = 1",
+ dbesc($perm['allow_cid']),
+ dbesc($perm['allow_gid']),
+ dbesc($perm['deny_cid']),
+ dbesc($perm['deny_gid']),
+ dbesc($resource_id),
+ intval($page_owner_uid)
+ );
+
+
+
+ if(strlen($rawtags)) {
+
+ $str_tags = '';
+ $inform = '';
+
+ // if the new tag doesn't have a namespace specifier (@foo or #foo) give it a mention
+
+ $x = substr($rawtags,0,1);
+ if($x !== '@' && $x !== '#')
+ $rawtags = '@' . $rawtags;
+
+ require_once('include/text.php');
+ $profile_uid = \App::$profile['profile_uid'];
+
+ $results = linkify_tags($a, $rawtags, (local_channel()) ? local_channel() : $profile_uid);
+
+ $success = $results['success'];
+ $post_tags = array();
+
+ foreach($results as $result) {
+ $success = $result['success'];
+ if($success['replaced']) {
+ $post_tags[] = array(
+ 'uid' => $profile_uid,
+ 'type' => $success['termtype'],
+ 'otype' => TERM_OBJ_POST,
+ 'term' => $success['term'],
+ 'url' => $success['url']
+ );
+ }
+ }
+
+ $r = q("select * from item where id = %d and uid = %d limit 1",
+ intval($item_id),
+ intval($page_owner_uid)
+ );
+
+ if($r) {
+ $r = fetch_post_tags($r,true);
+ $datarray = $r[0];
+ if($post_tags) {
+ if((! array_key_exists('term',$datarray)) || (! is_array($datarray['term'])))
+ $datarray['term'] = $post_tags;
+ else
+ $datarray['term'] = array_merge($datarray['term'],$post_tags);
+ }
+ item_store_update($datarray,$execflag);
+ }
+
+ }
+
+ goaway(z_root() . '/' . $_SESSION['photo_return']);
+ return; // NOTREACHED
+
+ $sync = attach_export_data(\App::$data['channel'],$resource_id);
+
+ if($sync)
+ build_sync_packet($page_owner_uid,array('file' => array($sync)));
+
+ }
+
+
+ /**
+ * default post action - upload a photo
+ */
+
+ $channel = \App::$data['channel'];
+ $observer = \App::$data['observer'];
+
+ $_REQUEST['source'] = 'photos';
+ require_once('include/attach.php');
+
+ if(! local_channel()) {
+ $_REQUEST['contact_allow'] = expand_acl($channel['channel_allow_cid']);
+ $_REQUEST['group_allow'] = expand_acl($channel['channel_allow_gid']);
+ $_REQUEST['contact_deny'] = expand_acl($channel['channel_deny_cid']);
+ $_REQUEST['group_deny'] = expand_acl($channel['channel_deny_gid']);
+ }
+
+ $r = attach_store($channel,get_observer_hash(), '', $_REQUEST);
+
+ if(! $r['success']) {
+ notice($r['message'] . EOL);
+ }
+
+ if($_REQUEST['newalbum'])
+ goaway(z_root() . '/photos/' . \App::$data['channel']['channel_address'] . '/album/' . bin2hex($_REQUEST['newalbum']));
+ else
+ goaway(z_root() . '/photos/' . \App::$data['channel']['channel_address'] . '/album/' . bin2hex(datetime_convert('UTC',date_default_timezone_get(),'now', 'Y')));
+
+ }
+
+
+
+ function get() {
+
+ // URLs:
+ // photos/name
+ // photos/name/album/xxxxx (xxxxx is album name)
+ // photos/name/image/xxxxx
+
+
+ if((get_config('system','block_public')) && (! local_channel()) && (! remote_channel())) {
+ notice( t('Public access denied.') . EOL);
+ return;
+ }
+
+ $unsafe = ((array_key_exists('unsafe',$_REQUEST) && $_REQUEST['unsafe']) ? 1 : 0);
+
+ require_once('include/bbcode.php');
+ require_once('include/security.php');
+ require_once('include/conversation.php');
+
+ if(! x(\App::$data,'channel')) {
+ notice( t('No photos selected') . EOL );
+ return;
+ }
+
+ $ph = photo_factory('');
+ $phototypes = $ph->supportedTypes();
+
+ $_SESSION['photo_return'] = \App::$cmd;
+
+ //
+ // Parse arguments
+ //
+
+ $can_comment = perm_is_allowed(\App::$profile['profile_uid'],get_observer_hash(),'post_comments');
+
+ if(argc() > 3) {
+ $datatype = argv(2);
+ $datum = argv(3);
+ } else {
+ if(argc() > 2) {
+ $datatype = argv(2);
+ $datum = '';
+ }
+ else
+ $datatype = 'summary';
+ }
+
+ if(argc() > 4)
+ $cmd = argv(4);
+ else
+ $cmd = 'view';
+
+ //
+ // Setup permissions structures
+ //
+
+ $can_post = false;
+ $visitor = 0;
+
+
+ $owner_uid = \App::$data['channel']['channel_id'];
+ $owner_aid = \App::$data['channel']['channel_account_id'];
+
+ $observer = \App::get_observer();
+
+ $can_post = perm_is_allowed($owner_uid,$observer['xchan_hash'],'write_storage');
+ $can_view = perm_is_allowed($owner_uid,$observer['xchan_hash'],'view_storage');
+
+ if(! $can_view) {
+ notice( t('Access to this item is restricted.') . EOL);
+ return;
+ }
+
+ $sql_extra = permissions_sql($owner_uid);
+
+ $o = "";
+
+ $o .= "<script> var profile_uid = " . \App::$profile['profile_uid']
+ . "; var netargs = '?f='; var profile_page = " . \App::$pager['page'] . "; </script>\r\n";
+
+ // tabs
+
+ $_is_owner = (local_channel() && (local_channel() == $owner_uid));
+ $o .= profile_tabs($a,$_is_owner, \App::$data['channel']['channel_address']);
+
+ /**
+ * Display upload form
+ */
+
+ if( $can_post) {
+
+ $uploader = '';
+
+ $ret = array('post_url' => z_root() . '/photos/' . \App::$data['channel']['channel_address'],
+ 'addon_text' => $uploader,
+ 'default_upload' => true);
+
+ call_hooks('photo_upload_form',$ret);
+
+ /* Show space usage */
+
+ $r = q("select sum(size) as total from photo where aid = %d and scale = 0 ",
+ intval(\App::$data['channel']['channel_account_id'])
+ );
+
+
+ $limit = service_class_fetch(\App::$data['channel']['channel_id'],'photo_upload_limit');
+ if($limit !== false) {
+ $usage_message = sprintf( t("%1$.2f MB of %2$.2f MB photo storage used."), $r[0]['total'] / 1024000, $limit / 1024000 );
+ }
+ else {
+ $usage_message = sprintf( t('%1$.2f MB photo storage used.'), $r[0]['total'] / 1024000 );
+ }
+
+ if($_is_owner) {
+ $channel = \App::get_channel();
+
+ $acl = new \Zotlabs\Access\AccessList($channel);
+ $channel_acl = $acl->get();
+
+ $lockstate = (($acl->is_private()) ? 'lock' : 'unlock');
+ }
+
+ $aclselect = (($_is_owner) ? populate_acl($channel_acl,false) : '');
+
+ // this is wrong but is to work around an issue with js_upload wherein it chokes if these variables
+ // don't exist. They really should be set to a parseable representation of the channel's default permissions
+ // which can be processed by getSelected()
+
+ if(! $aclselect) {
+ $aclselect = '<input id="group_allow" type="hidden" name="allow_gid[]" value="" /><input id="contact_allow" type="hidden" name="allow_cid[]" value="" /><input id="group_deny" type="hidden" name="deny_gid[]" value="" /><input id="contact_deny" type="hidden" name="deny_cid[]" value="" />';
+ }
+
+ $selname = (($datum) ? hex2bin($datum) : '');
+
+ $albums = ((array_key_exists('albums', \App::$data)) ? \App::$data['albums'] : photos_albums_list(\App::$data['channel'],\App::$data['observer']));
+
+ if(! $selname) {
+ $def_album = get_pconfig(\App::$data['channel']['channel_id'],'system','photo_path');
+ if($def_album) {
+ $selname = filepath_macro($def_album);
+ $albums['album'][] = array('text' => $selname);
+ }
+ }
+
+ $tpl = get_markup_template('photos_upload.tpl');
+ $upload_form = replace_macros($tpl,array(
+ '$pagename' => t('Upload Photos'),
+ '$sessid' => session_id(),
+ '$usage' => $usage_message,
+ '$nickname' => \App::$data['channel']['channel_address'],
+ '$newalbum_label' => t('Enter an album name'),
+ '$newalbum_placeholder' => t('or select an existing album (doubleclick)'),
+ '$visible' => array('visible', t('Create a status post for this upload'), 0,'', array(t('No'), t('Yes')), 'onclick="showHideBodyTextarea();"'),
+ '$caption' => array('description', t('Caption (optional):')),
+ '$body' => array('body', t('Description (optional):'),'', 'Description will only appear in the status post'),
+ '$albums' => $albums['albums'],
+ '$selname' => $selname,
+ '$permissions' => t('Permissions'),
+ '$aclselect' => $aclselect,
+ '$lockstate' => $lockstate,
+ '$uploader' => $ret['addon_text'],
+ '$default' => (($ret['default_upload']) ? true : false),
+ '$uploadurl' => $ret['post_url'],
+ '$submit' => t('Submit')
+
+ ));
+
+ }
+
+ //
+ // dispatch request
+ //
+
+ /*
+ * Display a single photo album
+ */
+
+ if($datatype === 'album') {
+
+ if(strlen($datum)) {
+ if((strlen($datum) & 1) || (! ctype_xdigit($datum))) {
+ notice( t('Album name could not be decoded') . EOL);
+ logger('mod_photos: illegal album encoding: ' . $datum);
+ $datum = '';
+ }
+ }
+
+ $album = (($datum) ? hex2bin($datum) : '');
+
+
+ \App::$page['htmlhead'] .= "\r\n" . '<link rel="alternate" type="application/json+oembed" href="' . z_root() . '/oep?f=&url=' . urlencode(z_root() . '/' . \App::$cmd) . '" title="oembed" />' . "\r\n";
+
+
+ $r = q("SELECT `resource_id`, max(`scale`) AS `scale` FROM `photo` WHERE `uid` = %d AND `album` = '%s'
+ AND `scale` <= 4 and photo_usage IN ( %d, %d ) and is_nsfw = %d $sql_extra GROUP BY `resource_id`",
+ intval($owner_uid),
+ dbesc($album),
+ intval(PHOTO_NORMAL),
+ intval(PHOTO_PROFILE),
+ intval($unsafe)
+ );
+ if(count($r)) {
+ \App::set_pager_total(count($r));
+ \App::set_pager_itemspage(60);
+ } else {
+ goaway(z_root() . '/photos/' . \App::$data['channel']['channel_address']);
+ }
+
+ if($_GET['order'] === 'posted')
+ $order = 'ASC';
+ else
+ $order = 'DESC';
+
+
+ $r = q("SELECT p.resource_id, p.id, p.filename, p.type, p.scale, p.description, p.created FROM photo p INNER JOIN
+ (SELECT resource_id, max(scale) scale FROM photo WHERE uid = %d AND album = '%s' AND scale <= 4 AND photo_usage IN ( %d, %d ) and is_nsfw = %d $sql_extra GROUP BY resource_id) ph
+ ON (p.resource_id = ph.resource_id AND p.scale = ph.scale)
+ ORDER BY created $order LIMIT %d OFFSET %d",
+ intval($owner_uid),
+ dbesc($album),
+ intval(PHOTO_NORMAL),
+ intval(PHOTO_PROFILE),
+ intval($unsafe),
+ intval(\App::$pager['itemspage']),
+ intval(\App::$pager['start'])
+ );
+
+ //edit album name
+ $album_edit = null;
+ if(($album !== t('Profile Photos')) && ($album !== 'Profile Photos') && ($album !== 'Contact Photos') && ($album !== t('Contact Photos'))) {
+ if($can_post) {
+ $album_e = $album;
+ $albums = ((array_key_exists('albums', \App::$data)) ? \App::$data['albums'] : photos_albums_list(\App::$data['channel'],\App::$data['observer']));
+
+ // @fixme - syncronise actions with DAV
+
+ // $edit_tpl = get_markup_template('album_edit.tpl');
+ // $album_edit = replace_macros($edit_tpl,array(
+ // '$nametext' => t('Enter a new album name'),
+ // '$name_placeholder' => t('or select an existing one (doubleclick)'),
+ // '$nickname' => \App::$data['channel']['channel_address'],
+ // '$album' => $album_e,
+ // '$albums' => $albums['albums'],
+ // '$hexalbum' => bin2hex($album),
+ // '$submit' => t('Submit'),
+ // '$dropsubmit' => t('Delete Album')
+ // ));
+
+ }
+ }
+
+ if($_GET['order'] === 'posted')
+ $order = array(t('Show Newest First'), z_root() . '/photos/' . \App::$data['channel']['channel_address'] . '/album/' . bin2hex($album));
+ else
+ $order = array(t('Show Oldest First'), z_root() . '/photos/' . \App::$data['channel']['channel_address'] . '/album/' . bin2hex($album) . '?f=&order=posted');
+
+ $photos = array();
+ if(count($r)) {
+ $twist = 'rotright';
+ foreach($r as $rr) {
+
+ if($twist == 'rotright')
+ $twist = 'rotleft';
+ else
+ $twist = 'rotright';
+
+ $ext = $phototypes[$rr['type']];
+
+ $imgalt_e = $rr['filename'];
+ $desc_e = $rr['description'];
+
+ $imagelink = (z_root() . '/photos/' . \App::$data['channel']['channel_address'] . '/image/' . $rr['resource_id']
+ . (($_GET['order'] === 'posted') ? '?f=&order=posted' : ''));
+
+ $photos[] = array(
+ 'id' => $rr['id'],
+ 'twist' => ' ' . $twist . rand(2,4),
+ 'link' => $imagelink,
+ 'title' => t('View Photo'),
+ 'src' => z_root() . '/photo/' . $rr['resource_id'] . '-' . $rr['scale'] . '.' .$ext,
+ 'alt' => $imgalt_e,
+ 'desc'=> $desc_e,
+ 'ext' => $ext,
+ 'hash'=> $rr['resource_id'],
+ 'unknown' => t('Unknown')
+ );
+ }
+ }
+
+ if($_REQUEST['aj']) {
+ if($photos) {
+ $o = replace_macros(get_markup_template('photosajax.tpl'),array(
+ '$photos' => $photos,
+ '$album_id' => bin2hex($album)
+ ));
+ }
+ else {
+ $o = '<div id="content-complete"></div>';
+ }
+ echo $o;
+ killme();
+ }
+ else {
+ $o .= "<script> var page_query = '" . $_GET['q'] . "'; var extra_args = '" . extra_query_args() . "' ; </script>";
+ $tpl = get_markup_template('photo_album.tpl');
+ $o .= replace_macros($tpl, array(
+ '$photos' => $photos,
+ '$album' => $album,
+ '$album_id' => bin2hex($album),
+ '$album_edit' => array(t('Edit Album'), $album_edit),
+ '$can_post' => $can_post,
+ '$upload' => array(t('Upload'), z_root() . '/photos/' . \App::$data['channel']['channel_address'] . '/upload/' . bin2hex($album)),
+ '$order' => $order,
+ '$upload_form' => $upload_form,
+ '$usage' => $usage_message
+ ));
+
+ }
+
+ if((! $photos) && ($_REQUEST['aj'])) {
+ $o .= '<div id="content-complete"></div>';
+ echo $o;
+ killme();
+ }
+
+ // $o .= paginate($a);
+
+ return $o;
+
+ }
+
+ /**
+ * Display one photo
+ */
+
+ if($datatype === 'image') {
+
+ \App::$page['htmlhead'] .= "\r\n" . '<link rel="alternate" type="application/json+oembed" href="' . z_root() . '/oep?f=&url=' . urlencode(z_root() . '/' . \App::$cmd) . '" title="oembed" />' . "\r\n";
+
+ // fetch image, item containing image, then comments
+
+ $ph = q("SELECT id,aid,uid,xchan,resource_id,created,edited,title,`description`,album,filename,`type`,height,width,`size`,scale,photo_usage,is_nsfw,allow_cid,allow_gid,deny_cid,deny_gid FROM `photo` WHERE `uid` = %d AND `resource_id` = '%s'
+ $sql_extra ORDER BY `scale` ASC ",
+ intval($owner_uid),
+ dbesc($datum)
+ );
+
+ if(! $ph) {
+
+ /* Check again - this time without specifying permissions */
+
+ $ph = q("SELECT id FROM photo WHERE uid = %d AND resource_id = '%s' LIMIT 1",
+ intval($owner_uid),
+ dbesc($datum)
+ );
+ if($ph)
+ notice( t('Permission denied. Access to this item may be restricted.') . EOL);
+ else
+ notice( t('Photo not available') . EOL );
+ return;
+ }
+
+
+
+ $prevlink = '';
+ $nextlink = '';
+
+ if($_GET['order'] === 'posted')
+ $order = 'ASC';
+ else
+ $order = 'DESC';
+
+
+ $prvnxt = q("SELECT `resource_id` FROM `photo` WHERE `album` = '%s' AND `uid` = %d AND `scale` = 0
+ $sql_extra ORDER BY `created` $order ",
+ dbesc($ph[0]['album']),
+ intval($owner_uid)
+ );
+
+ if(count($prvnxt)) {
+ for($z = 0; $z < count($prvnxt); $z++) {
+ if($prvnxt[$z]['resource_id'] == $ph[0]['resource_id']) {
+ $prv = $z - 1;
+ $nxt = $z + 1;
+ if($prv < 0)
+ $prv = count($prvnxt) - 1;
+ if($nxt >= count($prvnxt))
+ $nxt = 0;
+ break;
+ }
+ }
+
+ $prevlink = z_root() . '/photos/' . \App::$data['channel']['channel_address'] . '/image/' . $prvnxt[$prv]['resource_id'] . (($_GET['order'] === 'posted') ? '?f=&order=posted' : '');
+ $nextlink = z_root() . '/photos/' . \App::$data['channel']['channel_address'] . '/image/' . $prvnxt[$nxt]['resource_id'] . (($_GET['order'] === 'posted') ? '?f=&order=posted' : '');
+ }
+
+
+ if(count($ph) == 1)
+ $hires = $lores = $ph[0];
+ if(count($ph) > 1) {
+ if($ph[1]['scale'] == 2) {
+ // original is 640 or less, we can display it directly
+ $hires = $lores = $ph[0];
+ }
+ else {
+ $hires = $ph[0];
+ $lores = $ph[1];
+ }
+ }
+
+ $album_link = z_root() . '/photos/' . \App::$data['channel']['channel_address'] . '/album/' . bin2hex($ph[0]['album']);
+ $tools = Null;
+ $lock = Null;
+
+ if($can_post && ($ph[0]['uid'] == $owner_uid)) {
+ $tools = array(
+ 'profile'=>array(z_root() . '/profile_photo/use/'.$ph[0]['resource_id'], t('Use as profile photo')),
+ 'cover'=>array(z_root() . '/cover_photo/use/'.$ph[0]['resource_id'], t('Use as cover photo')),
+ );
+ }
+
+ // lockstate
+ $lockstate = ( ( (strlen($ph[0]['allow_cid']) || strlen($ph[0]['allow_gid'])
+ || strlen($ph[0]['deny_cid']) || strlen($ph[0]['deny_gid'])) )
+ ? array('lock', t('Private Photo'))
+ : array('unlock', Null));
+
+ \App::$page['htmlhead'] .= '<script>$(document).keydown(function(event) {' . "\n";
+ if($prevlink)
+ \App::$page['htmlhead'] .= 'if(event.ctrlKey && event.keyCode == 37) { event.preventDefault(); window.location.href = \'' . $prevlink . '\'; }' . "\n";
+ if($nextlink)
+ \App::$page['htmlhead'] .= 'if(event.ctrlKey && event.keyCode == 39) { event.preventDefault(); window.location.href = \'' . $nextlink . '\'; }' . "\n";
+ \App::$page['htmlhead'] .= '});</script>';
+
+ if($prevlink)
+ $prevlink = array($prevlink, t('Previous'));
+
+ $photo = array(
+ 'href' => z_root() . '/photo/' . $hires['resource_id'] . '-' . $hires['scale'] . '.' . $phototypes[$hires['type']],
+ 'title'=> t('View Full Size'),
+ 'src' => z_root() . '/photo/' . $lores['resource_id'] . '-' . $lores['scale'] . '.' . $phototypes[$lores['type']] . '?f=&_u=' . datetime_convert('','','','ymdhis')
+ );
+
+ if($nextlink)
+ $nextlink = array($nextlink, t('Next'));
+
+
+ // Do we have an item for this photo?
+
+ $linked_items = q("SELECT * FROM item WHERE resource_id = '%s' and resource_type = 'photo'
+ $sql_extra LIMIT 1",
+ dbesc($datum)
+ );
+
+ $map = null;
+
+ if($linked_items) {
+
+ xchan_query($linked_items);
+ $linked_items = fetch_post_tags($linked_items,true);
+
+ $link_item = $linked_items[0];
+ $item_normal = item_normal();
+
+ $r = q("select * from item where parent_mid = '%s'
+ $item_normal and uid = %d $sql_extra ",
+ dbesc($link_item['mid']),
+ intval($link_item['uid'])
+
+ );
+
+ if($r) {
+ xchan_query($r);
+ $r = fetch_post_tags($r,true);
+ $r = conv_sort($r,'commented');
+ }
+
+ $tags = array();
+ if($link_item['term']) {
+ $cnt = 0;
+ foreach($link_item['term'] as $t) {
+ $tags[$cnt] = array(0 => format_term_for_display($t));
+ if($can_post && ($ph[0]['uid'] == $owner_uid)) {
+ $tags[$cnt][1] = 'tagrm/drop/' . $link_item['id'] . '/' . bin2hex($t['term']); //?f=&item=' . $link_item['id'];
+ $tags[$cnt][2] = t('Remove');
+ }
+ $cnt ++;
+ }
+ }
+
+ if((local_channel()) && (local_channel() == $link_item['uid'])) {
+ q("UPDATE `item` SET item_unseen = 0 WHERE parent = %d and uid = %d and item_unseen = 1",
+ intval($link_item['parent']),
+ intval(local_channel())
+ );
+ }
+
+ if($link_item['coord']) {
+ $map = generate_map($link_item['coord']);
+ }
+ }
+
+ // logger('mod_photo: link_item' . print_r($link_item,true));
+
+ // FIXME - remove this when we move to conversation module
+
+ $r = $r[0]['children'];
+
+ $edit = null;
+ if($can_post) {
+ $album_e = $ph[0]['album'];
+ $caption_e = $ph[0]['description'];
+ $aclselect_e = (($_is_owner) ? populate_acl($ph[0]) : '');
+ $albums = ((array_key_exists('albums', \App::$data)) ? \App::$data['albums'] : photos_albums_list(\App::$data['channel'],\App::$data['observer']));
+
+ $_SESSION['album_return'] = bin2hex($ph[0]['album']);
+
+ $edit = array(
+ 'edit' => t('Edit photo'),
+ 'id' => $link_item['id'],
+ 'rotatecw' => t('Rotate CW (right)'),
+ 'rotateccw' => t('Rotate CCW (left)'),
+ 'albums' => $albums['albums'],
+ 'album' => $album_e,
+ 'newalbum_label' => t('Enter a new album name'),
+ 'newalbum_placeholder' => t('or select an existing one (doubleclick)'),
+ 'nickname' => \App::$data['channel']['channel_address'],
+ 'resource_id' => $ph[0]['resource_id'],
+ 'capt_label' => t('Caption'),
+ 'caption' => $caption_e,
+ 'tag_label' => t('Add a Tag'),
+ 'permissions' => t('Permissions'),
+ 'aclselect' => $aclselect_e,
+ 'lockstate' => $lockstate[0],
+ 'help_tags' => t('Example: @bob, @Barbara_Jensen, @jim@example.com'),
+ 'item_id' => ((count($linked_items)) ? $link_item['id'] : 0),
+ 'adult_enabled' => feature_enabled($owner_uid,'adult_photo_flagging'),
+ 'adult' => array('adult',t('Flag as adult in album view'), intval($ph[0]['is_nsfw']),''),
+ 'submit' => t('Submit'),
+ 'delete' => t('Delete Photo')
+ );
+ }
+
+ if(count($linked_items)) {
+
+ $cmnt_tpl = get_markup_template('comment_item.tpl');
+ $tpl = get_markup_template('photo_item.tpl');
+ $return_url = \App::$cmd;
+
+ $like_tpl = get_markup_template('like_noshare.tpl');
+
+ $likebuttons = '';
+
+ if($can_post || $can_comment) {
+ $likebuttons = array(
+ 'id' => $link_item['id'],
+ 'likethis' => t("I like this \x28toggle\x29"),
+ 'nolike' => t("I don't like this \x28toggle\x29"),
+ 'share' => t('Share'),
+ 'wait' => t('Please wait')
+ );
+ }
+
+ $comments = '';
+ if(! count($r)) {
+ if($can_post || $can_comment) {
+ $commentbox = replace_macros($cmnt_tpl,array(
+ '$return_path' => '',
+ '$mode' => 'photos',
+ '$jsreload' => $return_url,
+ '$type' => 'wall-comment',
+ '$id' => $link_item['id'],
+ '$parent' => $link_item['id'],
+ '$profile_uid' => $owner_uid,
+ '$mylink' => $observer['xchan_url'],
+ '$mytitle' => t('This is you'),
+ '$myphoto' => $observer['xchan_photo_s'],
+ '$comment' => t('Comment'),
+ '$submit' => t('Submit'),
+ '$preview' => t('Preview'),
+ '$ww' => '',
+ '$feature_encrypt' => false
+ ));
+ }
+ }
+
+ $alike = array();
+ $dlike = array();
+
+ $like = '';
+ $dislike = '';
+
+ $conv_responses = array(
+ 'like' => array('title' => t('Likes','title')),'dislike' => array('title' => t('Dislikes','title')),
+ 'agree' => array('title' => t('Agree','title')),'disagree' => array('title' => t('Disagree','title')), 'abstain' => array('title' => t('Abstain','title')),
+ 'attendyes' => array('title' => t('Attending','title')), 'attendno' => array('title' => t('Not attending','title')), 'attendmaybe' => array('title' => t('Might attend','title'))
+ );
+
+
+
+
+ if($r) {
+
+ foreach($r as $item) {
+ builtin_activity_puller($item, $conv_responses);
+ }
+
+
+ $like_count = ((x($alike,$link_item['mid'])) ? $alike[$link_item['mid']] : '');
+ $like_list = ((x($alike,$link_item['mid'])) ? $alike[$link_item['mid'] . '-l'] : '');
+ if (count($like_list) > MAX_LIKERS) {
+ $like_list_part = array_slice($like_list, 0, MAX_LIKERS);
+ array_push($like_list_part, '<a href="#" data-toggle="modal" data-target="#likeModal-' . $this->get_id() . '"><b>' . t('View all') . '</b></a>');
+ } else {
+ $like_list_part = '';
+ }
+ $like_button_label = tt('Like','Likes',$like_count,'noun');
+
+ //if (feature_enabled($conv->get_profile_owner(),'dislike')) {
+ $dislike_count = ((x($dlike,$link_item['mid'])) ? $dlike[$link_item['mid']] : '');
+ $dislike_list = ((x($dlike,$link_item['mid'])) ? $dlike[$link_item['mid'] . '-l'] : '');
+ $dislike_button_label = tt('Dislike','Dislikes',$dislike_count,'noun');
+ if (count($dislike_list) > MAX_LIKERS) {
+ $dislike_list_part = array_slice($dislike_list, 0, MAX_LIKERS);
+ array_push($dislike_list_part, '<a href="#" data-toggle="modal" data-target="#dislikeModal-' . $this->get_id() . '"><b>' . t('View all') . '</b></a>');
+ } else {
+ $dislike_list_part = '';
+ }
+ //}
+
+
+ $like = ((isset($alike[$link_item['mid']])) ? format_like($alike[$link_item['mid']],$alike[$link_item['mid'] . '-l'],'like',$link_item['mid']) : '');
+ $dislike = ((isset($dlike[$link_item['mid']])) ? format_like($dlike[$link_item['mid']],$dlike[$link_item['mid'] . '-l'],'dislike',$link_item['mid']) : '');
+
+ // display comments
+
+ foreach($r as $item) {
+ $comment = '';
+ $template = $tpl;
+ $sparkle = '';
+
+ if(((activity_match($item['verb'],ACTIVITY_LIKE)) || (activity_match($item['verb'],ACTIVITY_DISLIKE))) && ($item['id'] != $item['parent']))
+ continue;
+
+ $redirect_url = z_root() . '/redir/' . $item['cid'] ;
+
+
+ $profile_url = zid($item['author']['xchan_url']);
+ $sparkle = '';
+
+
+ $profile_name = $item['author']['xchan_name'];
+ $profile_avatar = $item['author']['xchan_photo_m'];
+
+ $profile_link = $profile_url;
+
+ $drop = '';
+
+ if($observer['xchan_hash'] === $item['author_xchan'] || $observer['xchan_hash'] === $item['owner_xchan'])
+ $drop = replace_macros(get_markup_template('photo_drop.tpl'), array('$id' => $item['id'], '$delete' => t('Delete')));
+
+
+ $name_e = $profile_name;
+ $title_e = $item['title'];
+ unobscure($item);
+ $body_e = prepare_text($item['body'],$item['mimetype']);
+
+ $comments .= replace_macros($template,array(
+ '$id' => $item['id'],
+ '$mode' => 'photos',
+ '$profile_url' => $profile_link,
+ '$name' => $name_e,
+ '$thumb' => $profile_avatar,
+ '$sparkle' => $sparkle,
+ '$title' => $title_e,
+ '$body' => $body_e,
+ '$ago' => relative_date($item['created']),
+ '$indent' => (($item['parent'] != $item['id']) ? ' comment' : ''),
+ '$drop' => $drop,
+ '$comment' => $comment
+ ));
+
+ }
+
+ if($can_post || $can_comment) {
+ $commentbox = replace_macros($cmnt_tpl,array(
+ '$return_path' => '',
+ '$jsreload' => $return_url,
+ '$type' => 'wall-comment',
+ '$id' => $link_item['id'],
+ '$parent' => $link_item['id'],
+ '$profile_uid' => $owner_uid,
+ '$mylink' => $observer['xchan_url'],
+ '$mytitle' => t('This is you'),
+ '$myphoto' => $observer['xchan_photo_s'],
+ '$comment' => t('Comment'),
+ '$submit' => t('Submit'),
+ '$ww' => ''
+ ));
+ }
+
+ }
+ $paginate = paginate($a);
+ }
+
+ $album_e = array($album_link,$ph[0]['album']);
+ $like_e = $like;
+ $dislike_e = $dislike;
+
+
+ $response_verbs = array('like');
+ if(feature_enabled($owner_uid,'dislike'))
+ $response_verbs[] = 'dislike';
+
+
+ $responses = get_responses($conv_responses,$response_verbs,'',$link_item);
+
+ $photo_tpl = get_markup_template('photo_view.tpl');
+ $o .= replace_macros($photo_tpl, array(
+ '$id' => $ph[0]['id'],
+ '$album' => $album_e,
+ '$tools_label' => t('Photo Tools'),
+ '$tools' => $tools,
+ '$lock' => $lockstate[1],
+ '$photo' => $photo,
+ '$prevlink' => $prevlink,
+ '$nextlink' => $nextlink,
+ '$desc' => $ph[0]['description'],
+ '$filename' => $ph[0]['filename'],
+ '$unknown' => t('Unknown'),
+ '$tag_hdr' => t('In This Photo:'),
+ '$tags' => $tags,
+ 'responses' => $responses,
+ '$edit' => $edit,
+ '$map' => $map,
+ '$map_text' => t('Map'),
+ '$likebuttons' => $likebuttons,
+ '$like' => $like_e,
+ '$dislike' => $dislike_e,
+ '$like_count' => $like_count,
+ '$like_list' => $like_list,
+ '$like_list_part' => $like_list_part,
+ '$like_button_label' => $like_button_label,
+ '$like_modal_title' => t('Likes','noun'),
+ '$dislike_modal_title' => t('Dislikes','noun'),
+ '$dislike_count' => $dislike_count, //((feature_enabled($conv->get_profile_owner(),'dislike')) ? $dislike_count : ''),
+ '$dislike_list' => $dislike_list, //((feature_enabled($conv->get_profile_owner(),'dislike')) ? $dislike_list : ''),
+ '$dislike_list_part' => $dislike_list_part, //((feature_enabled($conv->get_profile_owner(),'dislike')) ? $dislike_list_part : ''),
+ '$dislike_button_label' => $dislike_button_label, //((feature_enabled($conv->get_profile_owner(),'dislike')) ? $dislike_button_label : ''),
+ '$modal_dismiss' => t('Close'),
+ '$comments' => $comments,
+ '$commentbox' => $commentbox,
+ '$paginate' => $paginate,
+ ));
+
+ \App::$data['photo_html'] = $o;
+
+ return $o;
+ }
+
+ // Default - show recent photos with upload link (if applicable)
+ //$o = '';
+
+ \App::$page['htmlhead'] .= "\r\n" . '<link rel="alternate" type="application/json+oembed" href="' . z_root() . '/oep?f=&url=' . urlencode(z_root() . '/' . \App::$cmd) . '" title="oembed" />' . "\r\n";
+
+
+ $r = q("SELECT `resource_id`, max(`scale`) AS `scale` FROM `photo` WHERE `uid` = %d AND `album` != '%s' AND `album` != '%s'
+ and photo_usage in ( %d, %d ) and is_nsfw = %d $sql_extra GROUP BY `resource_id`",
+ intval(\App::$data['channel']['channel_id']),
+ dbesc('Contact Photos'),
+ dbesc( t('Contact Photos')),
+ intval(PHOTO_NORMAL),
+ intval(PHOTO_PROFILE),
+ intval($unsafe)
+ );
+ if(count($r)) {
+ \App::set_pager_total(count($r));
+ \App::set_pager_itemspage(60);
+ }
+
+ $r = q("SELECT p.resource_id, p.id, p.filename, p.type, p.album, p.scale, p.created FROM photo p INNER JOIN
+ (SELECT resource_id, max(scale) scale FROM photo
+ WHERE uid=%d AND album != '%s' AND album != '%s'
+ AND photo_usage IN ( %d, %d ) and is_nsfw = %d $sql_extra group by resource_id) ph
+ ON (p.resource_id = ph.resource_id and p.scale = ph.scale) ORDER by p.created DESC LIMIT %d OFFSET %d",
+ intval(\App::$data['channel']['channel_id']),
+ dbesc('Contact Photos'),
+ dbesc( t('Contact Photos')),
+ intval(PHOTO_NORMAL),
+ intval(PHOTO_PROFILE),
+ intval($unsafe),
+ intval(\App::$pager['itemspage']),
+ intval(\App::$pager['start'])
+ );
+
+
+
+ $photos = array();
+ if(count($r)) {
+ $twist = 'rotright';
+ foreach($r as $rr) {
+ if($twist == 'rotright')
+ $twist = 'rotleft';
+ else
+ $twist = 'rotright';
+ $ext = $phototypes[$rr['type']];
+
+ if(\App::get_template_engine() === 'internal') {
+ $alt_e = template_escape($rr['filename']);
+ $name_e = template_escape($rr['album']);
+ }
+ else {
+ $alt_e = $rr['filename'];
+ $name_e = $rr['album'];
+ }
+
+ $photos[] = array(
+ 'id' => $rr['id'],
+ 'twist' => ' ' . $twist . rand(2,4),
+ 'link' => z_root() . '/photos/' . \App::$data['channel']['channel_address'] . '/image/' . $rr['resource_id'],
+ 'title' => t('View Photo'),
+ 'src' => z_root() . '/photo/' . $rr['resource_id'] . '-' . ((($rr['scale']) == 6) ? 4 : $rr['scale']) . '.' . $ext,
+ 'alt' => $alt_e,
+ 'album' => array(
+ 'link' => z_root() . '/photos/' . \App::$data['channel']['channel_address'] . '/album/' . bin2hex($rr['album']),
+ 'name' => $name_e,
+ 'alt' => t('View Album'),
+ ),
+
+ );
+ }
+ }
+
+ if($_REQUEST['aj']) {
+ if($photos) {
+ $o = replace_macros(get_markup_template('photosajax.tpl'),array(
+ '$photos' => $photos,
+ '$album_id' => bin2hex(t('Recent Photos'))
+ ));
+ }
+ else {
+ $o = '<div id="content-complete"></div>';
+ }
+ echo $o;
+ killme();
+ }
+ else {
+ $o .= "<script> var page_query = '" . $_GET['q'] . "'; var extra_args = '" . extra_query_args() . "' ; </script>";
+ $tpl = get_markup_template('photos_recent.tpl');
+ $o .= replace_macros($tpl, array(
+ '$title' => t('Recent Photos'),
+ '$album_id' => bin2hex(t('Recent Photos')),
+ '$can_post' => $can_post,
+ '$upload' => array(t('Upload'), z_root().'/photos/'.\App::$data['channel']['channel_address'].'/upload'),
+ '$photos' => $photos,
+ '$upload_form' => $upload_form,
+ '$usage' => $usage_message
+ ));
+
+ }
+
+ if((! $photos) && ($_REQUEST['aj'])) {
+ $o .= '<div id="content-complete"></div>';
+ echo $o;
+ killme();
+ }
+
+ // paginate($a);
+ return $o;
+ }
+
+
+}
diff --git a/Zotlabs/Module/Ping.php b/Zotlabs/Module/Ping.php
new file mode 100644
index 000000000..bea4a08b7
--- /dev/null
+++ b/Zotlabs/Module/Ping.php
@@ -0,0 +1,497 @@
+<?php
+namespace Zotlabs\Module;
+/**
+ * @file mod/ping.php
+ *
+ */
+
+require_once('include/bbcode.php');
+require_once('include/notify.php');
+
+/**
+ * @brief do several updates when pinged.
+ *
+ * This function does several tasks. Whenever called it checks for new messages,
+ * introductions, notifications, etc. and returns a json with the results.
+ *
+ * @param App &$a
+ * @result JSON
+ */
+
+
+class Ping extends \Zotlabs\Web\Controller {
+
+ function init() {
+
+ $result = array();
+ $notifs = array();
+
+ $result['notify'] = 0;
+ $result['home'] = 0;
+ $result['network'] = 0;
+ $result['intros'] = 0;
+ $result['mail'] = 0;
+ $result['register'] = 0;
+ $result['events'] = 0;
+ $result['events_today'] = 0;
+ $result['birthdays'] = 0;
+ $result['birthdays_today'] = 0;
+ $result['all_events'] = 0;
+ $result['all_events_today'] = 0;
+ $result['notice'] = array();
+ $result['info'] = array();
+
+ $t0 = dba_timer();
+
+ header("content-type: application/json");
+
+ $vnotify = false;
+
+ $item_normal = item_normal();
+
+ if(local_channel()) {
+ $vnotify = get_pconfig(local_channel(),'system','vnotify');
+ $evdays = intval(get_pconfig(local_channel(),'system','evdays'));
+ $ob_hash = get_observer_hash();
+ }
+
+ // if unset show all visual notification types
+ if($vnotify === false)
+ $vnotify = (-1);
+ if($evdays < 1)
+ $evdays = 3;
+
+ /**
+ * If you have several windows open to this site and switch to a different channel
+ * in one of them, the others may get into a confused state showing you a page or options
+ * on that page which were only valid under the old identity. You session has changed.
+ * Therefore we send a notification of this fact back to the browser where it is picked up
+ * in javascript and which reloads the page it is on so that it is valid under the context
+ * of the now current channel.
+ */
+
+ $result['invalid'] = ((intval($_GET['uid'])) && (intval($_GET['uid']) != local_channel()) ? 1 : 0);
+
+ /**
+ * Send all system messages (alerts) to the browser.
+ * Some are marked as informational and some represent
+ * errors or serious notifications. These typically
+ * will popup on the current page (no matter what page it is)
+ */
+
+ if(x($_SESSION, 'sysmsg')){
+ foreach ($_SESSION['sysmsg'] as $m){
+ $result['notice'][] = array('message' => $m);
+ }
+ unset($_SESSION['sysmsg']);
+ }
+ if(x($_SESSION, 'sysmsg_info')){
+ foreach ($_SESSION['sysmsg_info'] as $m){
+ $result['info'][] = array('message' => $m);
+ }
+ unset($_SESSION['sysmsg_info']);
+ }
+ if(! ($vnotify & VNOTIFY_INFO))
+ $result['info'] = array();
+ if(! ($vnotify & VNOTIFY_ALERT))
+ $result['notice'] = array();
+
+
+ if(\App::$install) {
+ echo json_encode($result);
+ killme();
+ }
+
+ /**
+ * Update chat presence indication (if applicable)
+ */
+
+ if(get_observer_hash() && (! $result['invalid'])) {
+ $r = q("select cp_id, cp_room from chatpresence where cp_xchan = '%s' and cp_client = '%s' and cp_room = 0 limit 1",
+ dbesc(get_observer_hash()),
+ dbesc($_SERVER['REMOTE_ADDR'])
+ );
+ $basic_presence = false;
+ if($r) {
+ $basic_presence = true;
+ q("update chatpresence set cp_last = '%s' where cp_id = %d",
+ dbesc(datetime_convert()),
+ intval($r[0]['cp_id'])
+ );
+ }
+ if(! $basic_presence) {
+ q("insert into chatpresence ( cp_xchan, cp_last, cp_status, cp_client)
+ values( '%s', '%s', '%s', '%s' ) ",
+ dbesc(get_observer_hash()),
+ dbesc(datetime_convert()),
+ dbesc('online'),
+ dbesc($_SERVER['REMOTE_ADDR'])
+ );
+ }
+ }
+
+ /**
+ * Chatpresence continued... if somebody hasn't pinged recently, they've most likely left the page
+ * and shouldn't count as online anymore. We allow an expection for bots.
+ */
+
+ q("delete from chatpresence where cp_last < %s - INTERVAL %s and cp_client != 'auto' ",
+ db_utcnow(), db_quoteinterval('3 MINUTE')
+ );
+
+ if((! local_channel()) || ($result['invalid'])) {
+ echo json_encode($result);
+ killme();
+ }
+
+ /**
+ * Everything following is only permitted under the context of a locally authenticated site member.
+ */
+
+
+ /**
+ * Handle "mark all xyz notifications read" requests.
+ */
+
+ // mark all items read
+ if(x($_REQUEST, 'markRead') && local_channel()) {
+ switch($_REQUEST['markRead']) {
+ case 'network':
+ $r = q("update item set item_unseen = 0 where item_unseen = 1 and uid = %d",
+ intval(local_channel())
+ );
+ break;
+ case 'home':
+ $r = q("update item set item_unseen = 0 where item_unseen = 1 and item_wall = 1 and uid = %d",
+ intval(local_channel())
+ );
+ break;
+ case 'messages':
+ $r = q("update mail set mail_seen = 1 where mail_seen = 0 and channel_id = %d ",
+ intval(local_channel())
+ );
+ break;
+ case 'all_events':
+ $r = q("update event set `ignore` = 1 where `ignore` = 0 and uid = %d AND start < '%s' AND start > '%s' ",
+ intval(local_channel()),
+ dbesc(datetime_convert('UTC', date_default_timezone_get(), 'now + ' . intval($evdays) . ' days')),
+ dbesc(datetime_convert('UTC', date_default_timezone_get(), 'now - 1 days'))
+ );
+ break;
+ case 'notify':
+ $r = q("update notify set seen = 1 where uid = %d",
+ intval(local_channel())
+ );
+ break;
+ default:
+ break;
+ }
+ }
+
+ if(x($_REQUEST, 'markItemRead') && local_channel()) {
+ $r = q("update item set item_unseen = 0 where parent = %d and uid = %d",
+ intval($_REQUEST['markItemRead']),
+ intval(local_channel())
+ );
+ }
+
+
+
+ /**
+ * URL ping/something will return detail for "something", e.g. a json list with which to populate a notification
+ * dropdown menu.
+ */
+
+ if(argc() > 1 && argv(1) === 'notify') {
+ $t = q("select count(*) as total from notify where uid = %d and seen = 0",
+ intval(local_channel())
+ );
+ if($t && intval($t[0]['total']) > 49) {
+ $z = q("select * from notify where uid = %d
+ and seen = 0 order by date desc limit 50",
+ intval(local_channel())
+ );
+ }
+ else {
+ $z1 = q("select * from notify where uid = %d
+ and seen = 0 order by date desc limit 50",
+ intval(local_channel())
+ );
+ $z2 = q("select * from notify where uid = %d
+ and seen = 1 order by date desc limit %d",
+ intval(local_channel()),
+ intval(50 - intval($t[0]['total']))
+ );
+ $z = array_merge($z1,$z2);
+ }
+
+ if(count($z)) {
+ foreach($z as $zz) {
+ $notifs[] = array(
+ 'notify_link' => z_root() . '/notify/view/' . $zz['id'],
+ 'name' => $zz['name'],
+ 'url' => $zz['url'],
+ 'photo' => $zz['photo'],
+ 'when' => relative_date($zz['date']),
+ 'hclass' => (($zz['seen']) ? 'notify-seen' : 'notify-unseen'),
+ 'message' => strip_tags(bbcode($zz['msg']))
+ );
+ }
+ }
+
+ echo json_encode(array('notify' => $notifs));
+ killme();
+ }
+
+ if(argc() > 1 && argv(1) === 'messages') {
+ $channel = \App::get_channel();
+ $t = q("select mail.*, xchan.* from mail left join xchan on xchan_hash = from_xchan
+ where channel_id = %d and mail_seen = 0 and mail_deleted = 0
+ and from_xchan != '%s' order by created desc limit 50",
+ intval(local_channel()),
+ dbesc($channel['channel_hash'])
+ );
+
+ if($t) {
+ foreach($t as $zz) {
+ $notifs[] = array(
+ 'notify_link' => z_root() . '/mail/' . $zz['id'],
+ 'name' => $zz['xchan_name'],
+ 'url' => $zz['xchan_url'],
+ 'photo' => $zz['xchan_photo_s'],
+ 'when' => relative_date($zz['created']),
+ 'hclass' => (intval($zz['mail_seen']) ? 'notify-seen' : 'notify-unseen'),
+ 'message' => t('sent you a private message'),
+ );
+ }
+ }
+
+ echo json_encode(array('notify' => $notifs));
+ killme();
+ }
+
+ if(argc() > 1 && (argv(1) === 'network' || argv(1) === 'home')) {
+ $result = array();
+
+ $r = q("SELECT * FROM item
+ WHERE item_unseen = 1 and uid = %d $item_normal
+ and author_xchan != '%s' ORDER BY created DESC limit 300",
+ intval(local_channel()),
+ dbesc($ob_hash)
+ );
+
+ if($r) {
+ xchan_query($r);
+ foreach($r as $item) {
+ if((argv(1) === 'home') && (! intval($item['item_wall'])))
+ continue;
+ $result[] = format_notification($item);
+ }
+ }
+ // logger('ping (network||home): ' . print_r($result, true), LOGGER_DATA);
+ echo json_encode(array('notify' => $result));
+ killme();
+ }
+
+ if(argc() > 1 && (argv(1) === 'intros')) {
+ $result = array();
+
+ $r = q("SELECT * FROM abook left join xchan on abook.abook_xchan = xchan.xchan_hash where abook_channel = %d and abook_pending = 1 and abook_self = 0 and abook_ignored = 0 and xchan_deleted = 0 and xchan_orphan = 0 ORDER BY abook_created DESC LIMIT 50",
+ intval(local_channel())
+ );
+
+ if($r) {
+ foreach($r as $rr) {
+ $result[] = array(
+ 'notify_link' => z_root() . '/connections/ifpending',
+ 'name' => $rr['xchan_name'],
+ 'url' => $rr['xchan_url'],
+ 'photo' => $rr['xchan_photo_s'],
+ 'when' => relative_date($rr['abook_created']),
+ 'hclass' => ('notify-unseen'),
+ 'message' => t('added your channel')
+ );
+ }
+ }
+ logger('ping (intros): ' . print_r($result, true), LOGGER_DATA);
+ echo json_encode(array('notify' => $result));
+ killme();
+ }
+
+ if(argc() > 1 && (argv(1) === 'all_events')) {
+ $bd_format = t('g A l F d') ; // 8 AM Friday January 18
+
+ $result = array();
+
+ $r = q("SELECT * FROM event left join xchan on event_xchan = xchan_hash
+ WHERE `event`.`uid` = %d AND start < '%s' AND start > '%s' and `ignore` = 0
+ and type in ( 'event', 'birthday' )
+ ORDER BY `start` DESC LIMIT 1000",
+ intval(local_channel()),
+ dbesc(datetime_convert('UTC', date_default_timezone_get(), 'now + ' . intval($evdays) . ' days')),
+ dbesc(datetime_convert('UTC', date_default_timezone_get(), 'now - 1 days'))
+ );
+
+ if($r) {
+ foreach($r as $rr) {
+ if($rr['adjust'])
+ $md = datetime_convert('UTC', date_default_timezone_get(), $rr['start'], 'Y/m');
+ else
+ $md = datetime_convert('UTC', 'UTC', $rr['start'], 'Y/m');
+
+ $strt = datetime_convert('UTC', (($rr['adjust']) ? date_default_timezone_get() : 'UTC'), $rr['start']);
+ $today = ((substr($strt, 0, 10) === datetime_convert('UTC', date_default_timezone_get(), 'now', 'Y-m-d')) ? true : false);
+
+ $when = day_translate(datetime_convert('UTC', (($rr['adjust']) ? date_default_timezone_get() : 'UTC'), $rr['start'], $bd_format)) . (($today) ? ' ' . t('[today]') : '');
+
+ $result[] = array(
+ 'notify_link' => z_root() . '/events', // FIXME this takes you to an edit page and it may not be yours, we really want to just view the single event --> '/events/event/' . $rr['event_hash'],
+ 'name' => $rr['xchan_name'],
+ 'url' => $rr['xchan_url'],
+ 'photo' => $rr['xchan_photo_s'],
+ 'when' => $when,
+ 'hclass' => ('notify-unseen'),
+ 'message' => t('posted an event')
+ );
+ }
+ }
+ logger('ping (all_events): ' . print_r($result, true), LOGGER_DATA);
+ echo json_encode(array('notify' => $result));
+ killme();
+ }
+
+
+
+ /**
+ * Normal ping - just the counts, no detail
+ */
+
+ if($vnotify & VNOTIFY_SYSTEM) {
+ $t = q("select count(*) as total from notify where uid = %d and seen = 0",
+ intval(local_channel())
+ );
+ if($t)
+ $result['notify'] = intval($t[0]['total']);
+ }
+
+ $t1 = dba_timer();
+
+ if($vnotify & (VNOTIFY_NETWORK|VNOTIFY_CHANNEL)) {
+ $r = q("SELECT id, item_wall FROM item
+ WHERE item_unseen = 1 and uid = %d
+ $item_normal
+ and author_xchan != '%s'",
+ intval(local_channel()),
+ dbesc($ob_hash)
+ );
+
+ if($r) {
+ $arr = array('items' => $r);
+ call_hooks('network_ping', $arr);
+
+ foreach ($r as $it) {
+ if(intval($it['item_wall']))
+ $result['home'] ++;
+ else
+ $result['network'] ++;
+ }
+ }
+ }
+ if(! ($vnotify & VNOTIFY_NETWORK))
+ $result['network'] = 0;
+ if(! ($vnotify & VNOTIFY_CHANNEL))
+ $result['home'] = 0;
+
+
+ $t2 = dba_timer();
+
+ if($vnotify & VNOTIFY_INTRO) {
+ $intr = q("SELECT COUNT(abook.abook_id) AS total FROM abook left join xchan on abook.abook_xchan = xchan.xchan_hash where abook_channel = %d and abook_pending = 1 and abook_self = 0 and abook_ignored = 0 and xchan_deleted = 0 and xchan_orphan = 0 ",
+ intval(local_channel())
+ );
+
+ $t3 = dba_timer();
+
+ if($intr)
+ $result['intros'] = intval($intr[0]['total']);
+ }
+
+ $t4 = dba_timer();
+ $channel = \App::get_channel();
+
+ if($vnotify & VNOTIFY_MAIL) {
+ $mails = q("SELECT count(id) as total from mail
+ WHERE channel_id = %d AND mail_seen = 0 and from_xchan != '%s' ",
+ intval(local_channel()),
+ dbesc($channel['channel_hash'])
+ );
+ if($mails)
+ $result['mail'] = intval($mails[0]['total']);
+ }
+
+ if($vnotify & VNOTIFY_REGISTER) {
+ if (\App::$config['system']['register_policy'] == REGISTER_APPROVE && is_site_admin()) {
+ $regs = q("SELECT count(account_id) as total from account where (account_flags & %d) > 0",
+ intval(ACCOUNT_PENDING)
+ );
+ if($regs)
+ $result['register'] = intval($regs[0]['total']);
+ }
+ }
+
+ $t5 = dba_timer();
+
+ if($vnotify & (VNOTIFY_EVENT|VNOTIFY_EVENTTODAY|VNOTIFY_BIRTHDAY)) {
+ $events = q("SELECT type, start, adjust FROM `event`
+ WHERE `event`.`uid` = %d AND start < '%s' AND start > '%s' and `ignore` = 0
+ and type in ( 'event', 'birthday' )
+ ORDER BY `start` ASC ",
+ intval(local_channel()),
+ dbesc(datetime_convert('UTC', date_default_timezone_get(), 'now + ' . intval($evdays) . ' days')),
+ dbesc(datetime_convert('UTC', date_default_timezone_get(), 'now - 1 days'))
+ );
+
+ if($events) {
+ $result['all_events'] = count($events);
+
+ if($result['all_events']) {
+ $str_now = datetime_convert('UTC', date_default_timezone_get(), 'now', 'Y-m-d');
+ foreach($events as $x) {
+ $bd = false;
+ if($x['type'] === 'birthday') {
+ $result['birthdays'] ++;
+ $bd = true;
+ }
+ else {
+ $result['events'] ++;
+ }
+ if(datetime_convert('UTC', ((intval($x['adjust'])) ? date_default_timezone_get() : 'UTC'), $x['start'], 'Y-m-d') === $str_now) {
+ $result['all_events_today'] ++;
+ if($bd)
+ $result['birthdays_today'] ++;
+ else
+ $result['events_today'] ++;
+ }
+ }
+ }
+ }
+ }
+ if(! ($vnotify & VNOTIFY_EVENT))
+ $result['all_events'] = $result['events'] = 0;
+ if(! ($vnotify & VNOTIFY_EVENTTODAY))
+ $result['all_events_today'] = $result['events_today'] = 0;
+ if(! ($vnotify & VNOTIFY_BIRTHDAY))
+ $result['birthdays'] = 0;
+
+
+ $x = json_encode($result);
+
+ $t6 = dba_timer();
+
+ // logger('ping timer: ' . sprintf('%01.4f %01.4f %01.4f %01.4f %01.4f %01.4f',$t6 - $t5, $t5 - $t4, $t4 - $t3, $t3 - $t2, $t2 - $t1, $t1 - $t0));
+
+ echo $x;
+ killme();
+ }
+
+}
diff --git a/Zotlabs/Module/Poco.php b/Zotlabs/Module/Poco.php
new file mode 100644
index 000000000..85c9348c0
--- /dev/null
+++ b/Zotlabs/Module/Poco.php
@@ -0,0 +1,13 @@
+<?php
+namespace Zotlabs\Module;
+
+require_once('include/socgraph.php');
+
+
+class Poco extends \Zotlabs\Web\Controller {
+
+ function init() {
+ poco($a,false);
+ }
+
+}
diff --git a/Zotlabs/Module/Poke.php b/Zotlabs/Module/Poke.php
new file mode 100644
index 000000000..123ecbc7b
--- /dev/null
+++ b/Zotlabs/Module/Poke.php
@@ -0,0 +1,194 @@
+<?php
+namespace Zotlabs\Module; /** @file */
+
+/**
+ *
+ * Poke, prod, finger, or otherwise do unspeakable things to somebody - who must be a connection in your address book
+ * This function can be invoked with the required arguments (verb and cid and private and possibly parent) silently via ajax or
+ * other web request. You must be logged in and connected to a channel.
+ * If the required arguments aren't present, we'll display a simple form to choose a recipient and a verb.
+ * parent is a special argument which let's you attach this activity as a comment to an existing conversation, which
+ * may have started with somebody else poking (etc.) somebody, but this isn't necessary. This can be used in the adult
+ * plugin version to have entire conversations where Alice poked Bob, Bob fingered Alice, Alice hugged Bob, etc.
+ *
+ * private creates a private conversation with the recipient. Otherwise your channel's default post privacy is used.
+ *
+ */
+
+require_once('include/items.php');
+
+
+class Poke extends \Zotlabs\Web\Controller {
+
+ function init() {
+
+ if(! local_channel())
+ return;
+
+ $uid = local_channel();
+ $channel = \App::get_channel();
+
+ $verb = notags(trim($_REQUEST['verb']));
+
+ if(! $verb)
+ return;
+
+ $verbs = get_poke_verbs();
+
+ if(! array_key_exists($verb,$verbs))
+ return;
+
+ $activity = ACTIVITY_POKE . '#' . urlencode($verbs[$verb][0]);
+
+ $contact_id = intval($_REQUEST['cid']);
+ if(! $contact_id)
+ return;
+
+ $parent = ((x($_REQUEST,'parent')) ? intval($_REQUEST['parent']) : 0);
+
+ logger('poke: verb ' . $verb . ' contact ' . $contact_id, LOGGER_DEBUG);
+
+
+ $r = q("SELECT * FROM abook left join xchan on xchan_hash = abook_xchan where abook_id = %d and abook_channel = %d LIMIT 1",
+ intval($contact_id),
+ intval($uid)
+ );
+
+ if(! $r) {
+ logger('poke: no target ' . $contact_id);
+ return;
+ }
+
+ $target = $r[0];
+ $parent_item = null;
+
+ if($parent) {
+ $r = q("select mid, item_private, owner_xchan, allow_cid, allow_gid, deny_cid, deny_gid
+ from item where id = %d and parent = %d and uid = %d limit 1",
+ intval($parent),
+ intval($parent),
+ intval($uid)
+ );
+ if($r) {
+ $parent_item = $r[0];
+ $parent_mid = $r[0]['mid'];
+ $item_private = $r[0]['item_private'];
+ $allow_cid = $r[0]['allow_cid'];
+ $allow_gid = $r[0]['allow_gid'];
+ $deny_cid = $r[0]['deny_cid'];
+ $deny_gid = $r[0]['deny_gid'];
+ }
+ }
+ else {
+
+ $item_private = ((x($_GET,'private')) ? intval($_GET['private']) : 0);
+
+ $allow_cid = (($item_private) ? '<' . $target['abook_xchan']. '>' : $channel['channel_allow_cid']);
+ $allow_gid = (($item_private) ? '' : $channel['channel_allow_gid']);
+ $deny_cid = (($item_private) ? '' : $channel['channel_deny_cid']);
+ $deny_gid = (($item_private) ? '' : $channel['channel_deny_gid']);
+ }
+
+
+ $arr = array();
+
+ $arr['item_wall'] = 1;
+ $arr['owner_xchan'] = (($parent_item) ? $parent_item['owner_xchan'] : $channel['channel_hash']);
+ $arr['parent_mid'] = (($parent_mid) ? $parent_mid : $mid);
+ $arr['title'] = '';
+ $arr['allow_cid'] = $allow_cid;
+ $arr['allow_gid'] = $allow_gid;
+ $arr['deny_cid'] = $deny_cid;
+ $arr['deny_gid'] = $deny_gid;
+ $arr['verb'] = $activity;
+ $arr['item_private'] = $item_private;
+ $arr['obj_type'] = ACTIVITY_OBJ_PERSON;
+ $arr['body'] = '[zrl=' . $channel['xchan_url'] . ']' . $channel['xchan_name'] . '[/zrl]' . ' ' . t($verbs[$verb][0]) . ' ' . '[zrl=' . $target['xchan_url'] . ']' . $target['xchan_name'] . '[/zrl]';
+
+ $obj = array(
+ 'type' => ACTIVITY_OBJ_PERSON,
+ 'title' => $target['xchan_name'],
+ 'id' => $target['xchan_hash'],
+ 'link' => array(
+ array('rel' => 'alternate', 'type' => 'text/html', 'href' => $target['xchan_url']),
+ array('rel' => 'photo', 'type' => $target['xchan_photo_mimetype'], 'href' => $target['xchan_photo_l'])
+ ),
+ );
+
+ $arr['object'] = json_encode($obj);
+
+ $arr['item_origin'] = 1;
+ $arr['item_wall'] = 1;
+ $arr['item_unseen'] = 1;
+ if(! $parent_item)
+ $item['item_thread_top'] = 1;
+
+
+ post_activity_item($arr);
+
+ return;
+ }
+
+
+
+ function get() {
+
+ if(! local_channel()) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ $name = '';
+ $id = '';
+
+ if(intval($_REQUEST['c'])) {
+ $r = q("select abook_id, xchan_name from abook left join xchan on abook_xchan = xchan_hash
+ where abook_id = %d and abook_channel = %d limit 1",
+ intval($_REQUEST['c']),
+ intval(local_channel())
+ );
+ if($r) {
+ $name = $r[0]['xchan_name'];
+ $id = $r[0]['abook_id'];
+ }
+ }
+
+ $parent = ((x($_REQUEST,'parent')) ? intval($_REQUEST['parent']) : '0');
+
+ $verbs = get_poke_verbs();
+
+ $shortlist = array();
+ foreach($verbs as $k => $v)
+ if($v[1] !== 'NOTRANSLATION')
+ $shortlist[] = array($k,$v[1]);
+
+
+ $poke_basic = get_config('system','poke_basic');
+ if($poke_basic) {
+ $title = t('Poke');
+ $desc = t('Poke somebody');
+ }
+ else {
+ $title = t('Poke/Prod');
+ $desc = t('Poke, prod or do other things to somebody');
+ }
+
+ $o = replace_macros(get_markup_template('poke_content.tpl'),array(
+ '$title' => $title,
+ '$poke_basic' => $poke_basic,
+ '$desc' => $desc,
+ '$clabel' => t('Recipient'),
+ '$choice' => t('Choose what you wish to do to recipient'),
+ '$verbs' => $shortlist,
+ '$parent' => $parent,
+ '$prv_desc' => t('Make this post private'),
+ '$private' => array('private', t('Make this post private'), false, ''),
+ '$submit' => t('Submit'),
+ '$name' => $name,
+ '$id' => $id
+ ));
+
+ return $o;
+
+ }
+}
diff --git a/Zotlabs/Module/Post.php b/Zotlabs/Module/Post.php
new file mode 100644
index 000000000..af231ab50
--- /dev/null
+++ b/Zotlabs/Module/Post.php
@@ -0,0 +1,36 @@
+<?php
+namespace Zotlabs\Module;
+
+/**
+ * @file mod/post.php
+ *
+ * @brief Zot endpoint.
+ *
+ */
+
+require_once('include/zot.php');
+
+
+class Post extends \Zotlabs\Web\Controller {
+
+ function init() {
+
+ if (array_key_exists('auth', $_REQUEST)) {
+ $x = new \Zotlabs\Zot\Auth($_REQUEST);
+ exit;
+ }
+
+ }
+
+
+ function post() {
+
+ $z = new \Zotlabs\Zot\Receiver($_REQUEST['data'],get_config('system','prvkey'), new \Zotlabs\Zot\ZotHandler());
+
+ // notreached;
+
+ exit;
+
+ }
+
+}
diff --git a/Zotlabs/Module/Prate.php b/Zotlabs/Module/Prate.php
new file mode 100644
index 000000000..65bbcca9a
--- /dev/null
+++ b/Zotlabs/Module/Prate.php
@@ -0,0 +1,105 @@
+<?php
+namespace Zotlabs\Module;
+
+
+class Prate extends \Zotlabs\Web\Controller {
+
+ function init() {
+ if($_SERVER['REQUEST_METHOD'] === 'post')
+ return;
+
+ if(! local_channel())
+ return;
+
+ $channel = \App::get_channel();
+
+ $target = argv(1);
+ if(! $target)
+ return;
+
+ $r = q("select * from xlink where xlink_xchan = '%s' and xlink_link = '%s' and xlink_static = 1",
+ dbesc($channel['channel_hash']),
+ dbesc($target)
+ );
+ if($r)
+ json_return_and_die(array('rating' => $r[0]['xlink_rating'],'rating_text' => $r[0]['xlink_rating_text']));
+ killme();
+ }
+
+ function post() {
+
+ if(! local_channel())
+ return;
+
+ $channel = \App::get_channel();
+
+ $target = trim($_REQUEST['target']);
+ if(! $target)
+ return;
+
+ if($target === $channel['channel_hash'])
+ return;
+
+ $rating = intval($_POST['rating']);
+ if($rating < (-10))
+ $rating = (-10);
+ if($rating > 10)
+ $rating = 10;
+
+ $rating_text = trim(escape_tags($_REQUEST['rating_text']));
+
+ $signed = $target . '.' . $rating . '.' . $rating_text;
+
+ $sig = base64url_encode(rsa_sign($signed,$channel['channel_prvkey']));
+
+
+ $z = q("select * from xlink where xlink_xchan = '%s' and xlink_link = '%s' and xlink_static = 1 limit 1",
+ dbesc($channel['channel_hash']),
+ dbesc($target)
+ );
+ if($z) {
+ $record = $z[0]['xlink_id'];
+ $w = q("update xlink set xlink_rating = '%d', xlink_rating_text = '%s', xlink_sig = '%s', xlink_updated = '%s'
+ where xlink_id = %d",
+ intval($rating),
+ dbesc($rating_text),
+ dbesc($sig),
+ dbesc(datetime_convert()),
+ intval($record)
+ );
+ }
+ else {
+ $w = q("insert into xlink ( xlink_xchan, xlink_link, xlink_rating, xlink_rating_text, xlink_sig, xlink_updated, xlink_static ) values ( '%s', '%s', %d, '%s', '%s', '%s', 1 ) ",
+ dbesc($channel['channel_hash']),
+ dbesc($target),
+ intval($rating),
+ dbesc($rating_text),
+ dbesc($sig),
+ dbesc(datetime_convert())
+ );
+ $z = q("select * from xlink where xlink_xchan = '%s' and xlink_link = '%s' and xlink_static = 1 limit 1",
+ dbesc($channel['channel_hash']),
+ dbesc($orig_record[0]['abook_xchan'])
+ );
+ if($z)
+ $record = $z[0]['xlink_id'];
+ }
+ if($record) {
+ proc_run('php','include/ratenotif.php','rating',$record);
+ }
+
+ json_return_and_die(array('result' => true));;
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+}
diff --git a/Zotlabs/Module/Pretheme.php b/Zotlabs/Module/Pretheme.php
new file mode 100644
index 000000000..120fd5359
--- /dev/null
+++ b/Zotlabs/Module/Pretheme.php
@@ -0,0 +1,28 @@
+<?php
+namespace Zotlabs\Module;
+
+
+class Pretheme extends \Zotlabs\Web\Controller {
+
+ function init() {
+
+ if($_REQUEST['theme']) {
+ $theme = $_REQUEST['theme'];
+ $info = get_theme_info($theme);
+ if($info) {
+ // unfortunately there will be no translation for this string
+ $desc = $info['description'];
+ $version = $info['version'];
+ $credits = $info['credits'];
+ }
+ else {
+ $desc = '';
+ $version = '';
+ $credits = '';
+ }
+ echo json_encode(array('img' => get_theme_screenshot($theme), 'desc' => $desc, 'version' => $version, 'credits' => $credits));
+ }
+ killme();
+ }
+
+}
diff --git a/Zotlabs/Module/Probe.php b/Zotlabs/Module/Probe.php
new file mode 100644
index 000000000..79abe9819
--- /dev/null
+++ b/Zotlabs/Module/Probe.php
@@ -0,0 +1,47 @@
+<?php
+namespace Zotlabs\Module;
+
+require_once('include/zot.php');
+
+
+class Probe extends \Zotlabs\Web\Controller {
+
+ function get() {
+
+ $o .= '<h3>Probe Diagnostic</h3>';
+
+ $o .= '<form action="probe" method="get">';
+ $o .= 'Lookup address: <input type="text" style="width: 250px;" name="addr" value="' . $_GET['addr'] .'" />';
+ $o .= '<input type="submit" name="submit" value="Submit" /></form>';
+
+ $o .= '<br /><br />';
+
+ if(x($_GET,'addr')) {
+ $channel = \App::get_channel();
+ $addr = trim($_GET['addr']);
+ $do_import = ((intval($_GET['import']) && is_site_admin()) ? true : false);
+ $res = zot_finger($addr,$channel,false);
+ $o .= '<pre>';
+ if($res['success'])
+ $j = json_decode($res['body'],true);
+ else {
+ $o .= sprintf( t('Fetching URL returns error: %1$s'),$res['error'] . "\r\n\r\n");
+ $o .= "<strong>https connection failed. Trying again with auto failover to http.</strong>\r\n\r\n";
+ $res = zot_finger($addr,$channel,true);
+ if($res['success'])
+ $j = json_decode($res['body'],true);
+ else
+ $o .= sprintf( t('Fetching URL returns error: %1$s'),$res['error'] . "\r\n\r\n");
+
+ }
+ if($do_import && $j)
+ $x = import_xchan($j);
+ if($j && $j['permissions'] && $j['permissions']['iv'])
+ $j['permissions'] = json_decode(crypto_unencapsulate($j['permissions'],$channel['channel_prvkey']),true);
+ $o .= str_replace("\n",'<br />',print_r($j,true));
+ $o .= '</pre>';
+ }
+ return $o;
+ }
+
+}
diff --git a/Zotlabs/Module/Profile.php b/Zotlabs/Module/Profile.php
new file mode 100644
index 000000000..04a64fe76
--- /dev/null
+++ b/Zotlabs/Module/Profile.php
@@ -0,0 +1,90 @@
+<?php
+namespace Zotlabs\Module; /** @file */
+
+require_once('include/contact_widgets.php');
+require_once('include/items.php');
+require_once("include/bbcode.php");
+require_once('include/security.php');
+require_once('include/conversation.php');
+require_once('include/acl_selectors.php');
+
+
+
+class Profile extends \Zotlabs\Web\Controller {
+
+ function init() {
+
+ if(argc() > 1)
+ $which = argv(1);
+ else {
+ notice( t('Requested profile is not available.') . EOL );
+ \App::$error = 404;
+ return;
+ }
+
+ $profile = '';
+ $channel = \App::get_channel();
+
+ if((local_channel()) && (argc() > 2) && (argv(2) === 'view')) {
+ $which = $channel['channel_address'];
+ $profile = argv(1);
+ $r = q("select profile_guid from profile where id = %d and uid = %d limit 1",
+ intval($profile),
+ intval(local_channel())
+ );
+ if(! $r)
+ $profile = '';
+ $profile = $r[0]['profile_guid'];
+ }
+
+ \App::$page['htmlhead'] .= '<link rel="alternate" type="application/atom+xml" href="' . z_root() . '/feed/' . $which .'" />' . "\r\n" ;
+
+ if(! $profile) {
+ $x = q("select channel_id as profile_uid from channel where channel_address = '%s' limit 1",
+ dbesc(argv(1))
+ );
+ if($x) {
+ \App::$profile = $x[0];
+ }
+ }
+
+ profile_load($a,$which,$profile);
+
+
+ }
+
+ function get() {
+
+ if(get_config('system','block_public') && (! get_account_id()) && (! remote_channel())) {
+ return login();
+ }
+
+ $groups = array();
+
+ $tab = 'profile';
+ $o = '';
+
+ if(! (perm_is_allowed(\App::$profile['profile_uid'],get_observer_hash(), 'view_profile'))) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+
+ $is_owner = ((local_channel()) && (local_channel() == \App::$profile['profile_uid']) ? true : false);
+
+ if(\App::$profile['hidewall'] && (! $is_owner) && (! remote_channel())) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ $o .= profile_tabs($a, $is_owner, \App::$profile['channel_address']);
+
+ \App::$page['htmlhead'] .= "\r\n" . '<link rel="alternate" type="application/json+oembed" href="' . z_root() . '/oep?f=&url=' . urlencode(z_root() . '/' . \App::$query_string) . '" title="oembed" />' . "\r\n";
+
+ $o .= advanced_profile($a);
+ call_hooks('profile_advanced',$o);
+ return $o;
+
+ }
+
+}
diff --git a/Zotlabs/Module/Profile_photo.php b/Zotlabs/Module/Profile_photo.php
new file mode 100644
index 000000000..8f879503c
--- /dev/null
+++ b/Zotlabs/Module/Profile_photo.php
@@ -0,0 +1,436 @@
+<?php
+namespace Zotlabs\Module;
+
+/* @file profile_photo.php
+ @brief Module-file with functions for handling of profile-photos
+
+*/
+
+
+require_once('include/photo/photo_driver.php');
+require_once('include/photos.php');
+require_once('include/identity.php');
+
+/* @brief Function for sync'ing permissions of profile-photos and their profile
+*
+* @param $profileid The id number of the profile to sync
+* @return void
+*/
+
+
+class Profile_photo extends \Zotlabs\Web\Controller {
+
+
+ /* @brief Initalize the profile-photo edit view
+ *
+ * @param $a Current application
+ * @return void
+ *
+ */
+
+ function init() {
+
+ if(! local_channel()) {
+ return;
+ }
+
+ $channel = \App::get_channel();
+ profile_load($a,$channel['channel_address']);
+
+ }
+
+ /* @brief Evaluate posted values
+ *
+ * @param $a Current application
+ * @return void
+ *
+ */
+
+ function post() {
+
+ if(! local_channel()) {
+ return;
+ }
+
+ check_form_security_token_redirectOnErr('/profile_photo', 'profile_photo');
+
+ if((x($_POST,'cropfinal')) && ($_POST['cropfinal'] == 1)) {
+
+ // unless proven otherwise
+ $is_default_profile = 1;
+
+ if($_REQUEST['profile']) {
+ $r = q("select id, profile_guid, is_default, gender from profile where id = %d and uid = %d limit 1",
+ intval($_REQUEST['profile']),
+ intval(local_channel())
+ );
+ if($r) {
+ $profile = $r[0];
+ if(! intval($profile['is_default']))
+ $is_default_profile = 0;
+ }
+ }
+
+
+
+ // phase 2 - we have finished cropping
+
+ if(argc() != 2) {
+ notice( t('Image uploaded but image cropping failed.') . EOL );
+ return;
+ }
+
+ $image_id = argv(1);
+
+ if(substr($image_id,-2,1) == '-') {
+ $scale = substr($image_id,-1,1);
+ $image_id = substr($image_id,0,-2);
+ }
+
+
+ $srcX = $_POST['xstart'];
+ $srcY = $_POST['ystart'];
+ $srcW = $_POST['xfinal'] - $srcX;
+ $srcH = $_POST['yfinal'] - $srcY;
+
+ $r = q("SELECT * FROM photo WHERE resource_id = '%s' AND uid = %d AND scale = %d LIMIT 1",
+ dbesc($image_id),
+ dbesc(local_channel()),
+ intval($scale));
+
+ if($r) {
+
+ $base_image = $r[0];
+ $base_image['data'] = (($r[0]['os_storage']) ? @file_get_contents($base_image['data']) : dbunescbin($base_image['data']));
+
+ $im = photo_factory($base_image['data'], $base_image['type']);
+ if($im->is_valid()) {
+
+ $im->cropImage(300,$srcX,$srcY,$srcW,$srcH);
+
+ $aid = get_account_id();
+
+ $p = array('aid' => $aid, 'uid' => local_channel(), 'resource_id' => $base_image['resource_id'],
+ 'filename' => $base_image['filename'], 'album' => t('Profile Photos'));
+
+ $p['scale'] = 4;
+ $p['photo_usage'] = (($is_default_profile) ? PHOTO_PROFILE : PHOTO_NORMAL);
+
+ $r1 = $im->save($p);
+
+ $im->scaleImage(80);
+ $p['scale'] = 5;
+
+ $r2 = $im->save($p);
+
+ $im->scaleImage(48);
+ $p['scale'] = 6;
+
+ $r3 = $im->save($p);
+
+ if($r1 === false || $r2 === false || $r3 === false) {
+ // if one failed, delete them all so we can start over.
+ notice( t('Image resize failed.') . EOL );
+ $x = q("delete from photo where resource_id = '%s' and uid = %d and scale >= 4 ",
+ dbesc($base_image['resource_id']),
+ local_channel()
+ );
+ return;
+ }
+
+ $channel = \App::get_channel();
+
+ // If setting for the default profile, unset the profile photo flag from any other photos I own
+
+ if($is_default_profile) {
+ $r = q("UPDATE photo SET photo_usage = %d WHERE photo_usage = %d
+ AND resource_id != '%s' AND `uid` = %d",
+ intval(PHOTO_NORMAL),
+ intval(PHOTO_PROFILE),
+ dbesc($base_image['resource_id']),
+ intval(local_channel())
+ );
+
+ send_profile_photo_activity($channel,$base_image,$profile);
+
+ }
+ else {
+ $r = q("update profile set photo = '%s', thumb = '%s' where id = %d and uid = %d",
+ dbesc(z_root() . '/photo/' . $base_image['resource_id'] . '-4'),
+ dbesc(z_root() . '/photo/' . $base_image['resource_id'] . '-5'),
+ intval($_REQUEST['profile']),
+ intval(local_channel())
+ );
+ }
+
+ profiles_build_sync(local_channel());
+
+ // We'll set the updated profile-photo timestamp even if it isn't the default profile,
+ // so that browsers will do a cache update unconditionally
+
+
+ $r = q("UPDATE xchan set xchan_photo_mimetype = '%s', xchan_photo_date = '%s'
+ where xchan_hash = '%s'",
+ dbesc($im->getType()),
+ dbesc(datetime_convert()),
+ dbesc($channel['xchan_hash'])
+ );
+
+ info( t('Shift-reload the page or clear browser cache if the new photo does not display immediately.') . EOL);
+
+ // Update directory in background
+ proc_run('php',"include/directory.php",$channel['channel_id']);
+
+ // Now copy profile-permissions to pictures, to prevent privacyleaks by automatically created folder 'Profile Pictures'
+
+ profile_photo_set_profile_perms($_REQUEST['profile']);
+
+
+
+ }
+ else
+ notice( t('Unable to process image') . EOL);
+ }
+
+ goaway(z_root() . '/profiles');
+ return; // NOTREACHED
+ }
+
+
+
+ $hash = photo_new_resource();
+ $smallest = 0;
+
+ require_once('include/attach.php');
+
+ $res = attach_store(\App::get_channel(), get_observer_hash(), '', array('album' => t('Profile Photos'), 'hash' => $hash));
+
+ logger('attach_store: ' . print_r($res,true));
+
+ if($res && intval($res['data']['is_photo'])) {
+ $i = q("select * from photo where resource_id = '%s' and uid = %d order by scale",
+ dbesc($hash),
+ intval(local_channel())
+ );
+
+ if(! $i) {
+ notice( t('Image upload failed.') . EOL );
+ return;
+ }
+ $os_storage = false;
+
+ foreach($i as $ii) {
+ if(intval($ii['scale']) < 2) {
+ $smallest = intval($ii['scale']);
+ $os_storage = intval($ii['os_storage']);
+ $imagedata = $ii['data'];
+ $filetype = $ii['type'];
+ }
+ }
+ }
+
+ $imagedata = (($os_storage) ? @file_get_contents($imagedata) : $imagedata);
+ $ph = photo_factory($imagedata, $filetype);
+
+ if(! $ph->is_valid()) {
+ notice( t('Unable to process image.') . EOL );
+ return;
+ }
+
+ return $this->profile_photo_crop_ui_head($a, $ph, $hash, $smallest);
+
+ }
+
+
+ /* @brief Generate content of profile-photo view
+ *
+ * @param $a Current application
+ * @return void
+ *
+ */
+
+
+ function get() {
+
+ if(! local_channel()) {
+ notice( t('Permission denied.') . EOL );
+ return;
+ }
+
+ $channel = \App::get_channel();
+
+ $newuser = false;
+
+ if(argc() == 2 && argv(1) === 'new')
+ $newuser = true;
+
+ if(argv(1) === 'use') {
+ if (argc() < 3) {
+ notice( t('Permission denied.') . EOL );
+ return;
+ };
+
+ // check_form_security_token_redirectOnErr('/profile_photo', 'profile_photo');
+
+ $resource_id = argv(2);
+
+
+ $r = q("SELECT id, album, scale FROM photo WHERE uid = %d AND resource_id = '%s' ORDER BY scale ASC",
+ intval(local_channel()),
+ dbesc($resource_id)
+ );
+ if(! $r) {
+ notice( t('Photo not available.') . EOL );
+ return;
+ }
+ $havescale = false;
+ foreach($r as $rr) {
+ if($rr['scale'] == 5)
+ $havescale = true;
+ }
+
+ // set an already loaded photo as profile photo
+
+ if(($r[0]['album'] == t('Profile Photos')) && ($havescale)) {
+ // unset any existing profile photos
+ $r = q("UPDATE photo SET photo_usage = %d WHERE photo_usage = %d AND uid = %d",
+ intval(PHOTO_NORMAL),
+ intval(PHOTO_PROFILE),
+ intval(local_channel()));
+
+ $r = q("UPDATE photo SET photo_usage = %d WHERE uid = %d AND resource_id = '%s'",
+ intval(PHOTO_PROFILE),
+ intval(local_channel()),
+ dbesc($resource_id)
+ );
+
+ $r = q("UPDATE xchan set xchan_photo_date = '%s'
+ where xchan_hash = '%s'",
+ dbesc(datetime_convert()),
+ dbesc($channel['xchan_hash'])
+ );
+
+ profile_photo_set_profile_perms(); //Reset default photo permissions to public
+ proc_run('php','include/directory.php',local_channel());
+ goaway(z_root() . '/profiles');
+ }
+
+ $r = q("SELECT `data`, `type`, resource_id, os_storage FROM photo WHERE id = %d and uid = %d limit 1",
+ intval($r[0]['id']),
+ intval(local_channel())
+
+ );
+ if(! $r) {
+ notice( t('Photo not available.') . EOL );
+ return;
+ }
+
+ if(intval($r[0]['os_storage']))
+ $data = @file_get_contents($r[0]['data']);
+ else
+ $data = dbunescbin($r[0]['data']);
+
+ $ph = photo_factory($data, $r[0]['type']);
+ $smallest = 0;
+ if($ph->is_valid()) {
+ // go ahead as if we have just uploaded a new photo to crop
+ $i = q("select resource_id, scale from photo where resource_id = '%s' and uid = %d order by scale",
+ dbesc($r[0]['resource_id']),
+ intval(local_channel())
+ );
+
+ if($i) {
+ $hash = $i[0]['resource_id'];
+ foreach($i as $ii) {
+ if(intval($ii['scale']) < 2) {
+ $smallest = intval($ii['scale']);
+ }
+ }
+ }
+ }
+
+ profile_photo_crop_ui_head($a, $ph, $hash, $smallest);
+ }
+
+ $profiles = q("select id, profile_name as name, is_default from profile where uid = %d",
+ intval(local_channel())
+ );
+
+ if(! x(\App::$data,'imagecrop')) {
+
+ $tpl = get_markup_template('profile_photo.tpl');
+
+ $o .= replace_macros($tpl,array(
+ '$user' => \App::$channel['channel_address'],
+ '$lbl_upfile' => t('Upload File:'),
+ '$lbl_profiles' => t('Select a profile:'),
+ '$title' => t('Upload Profile Photo'),
+ '$submit' => t('Upload'),
+ '$profiles' => $profiles,
+ '$single' => ((count($profiles) == 1) ? true : false),
+ '$profile0' => $profiles[0],
+ '$form_security_token' => get_form_security_token("profile_photo"),
+ // FIXME - yuk
+ '$select' => sprintf('%s %s', t('or'), ($newuser) ? '<a href="' . z_root() . '">' . t('skip this step') . '</a>' : '<a href="'. z_root() . '/photos/' . \App::$channel['channel_address'] . '">' . t('select a photo from your photo albums') . '</a>')
+ ));
+
+ call_hooks('profile_photo_content_end', $o);
+
+ return $o;
+ }
+ else {
+ $filename = \App::$data['imagecrop'] . '-' . \App::$data['imagecrop_resolution'];
+ $resolution = \App::$data['imagecrop_resolution'];
+ $tpl = get_markup_template("cropbody.tpl");
+ $o .= replace_macros($tpl,array(
+ '$filename' => $filename,
+ '$profile' => intval($_REQUEST['profile']),
+ '$resource' => \App::$data['imagecrop'] . '-' . \App::$data['imagecrop_resolution'],
+ '$image_url' => z_root() . '/photo/' . $filename,
+ '$title' => t('Crop Image'),
+ '$desc' => t('Please adjust the image cropping for optimum viewing.'),
+ '$form_security_token' => get_form_security_token("profile_photo"),
+ '$done' => t('Done Editing')
+ ));
+ return $o;
+ }
+
+ return; // NOTREACHED
+ }
+
+ /* @brief Generate the UI for photo-cropping
+ *
+ * @param $a Current application
+ * @param $ph Photo-Factory
+ * @return void
+ *
+ */
+
+
+
+ function profile_photo_crop_ui_head(&$a, $ph, $hash, $smallest){
+
+ $max_length = get_config('system','max_image_length');
+ if(! $max_length)
+ $max_length = MAX_IMAGE_LENGTH;
+ if($max_length > 0)
+ $ph->scaleImage($max_length);
+
+ $width = $ph->getWidth();
+ $height = $ph->getHeight();
+
+ if($width < 500 || $height < 500) {
+ $ph->scaleImageUp(400);
+ $width = $ph->getWidth();
+ $height = $ph->getHeight();
+ }
+
+
+ \App::$data['imagecrop'] = $hash;
+ \App::$data['imagecrop_resolution'] = $smallest;
+ \App::$page['htmlhead'] .= replace_macros(get_markup_template("crophead.tpl"), array());
+ return;
+ }
+
+
+}
diff --git a/Zotlabs/Module/Profiles.php b/Zotlabs/Module/Profiles.php
new file mode 100644
index 000000000..72edf396f
--- /dev/null
+++ b/Zotlabs/Module/Profiles.php
@@ -0,0 +1,796 @@
+<?php
+namespace Zotlabs\Module;
+
+require_once('include/identity.php');
+
+
+class Profiles extends \Zotlabs\Web\Controller {
+
+ function init() {
+
+ nav_set_selected('profiles');
+
+ if(! local_channel()) {
+ return;
+ }
+
+ if((argc() > 2) && (argv(1) === "drop") && intval(argv(2))) {
+ $r = q("SELECT * FROM `profile` WHERE `id` = %d AND `uid` = %d AND `is_default` = 0 LIMIT 1",
+ intval(argv(2)),
+ intval(local_channel())
+ );
+ if(! count($r)) {
+ notice( t('Profile not found.') . EOL);
+ goaway(z_root() . '/profiles');
+ return; // NOTREACHED
+ }
+ $profile_guid = $r['profile_guid'];
+
+ check_form_security_token_redirectOnErr('/profiles', 'profile_drop', 't');
+
+ // move every contact using this profile as their default to the user default
+
+ $r = q("UPDATE abook SET abook_profile = (SELECT profile_guid AS FROM profile WHERE is_default = 1 AND uid = %d LIMIT 1) WHERE abook_profile = '%s' AND abook_channel = %d ",
+ intval(local_channel()),
+ dbesc($profile_guid),
+ intval(local_channel())
+ );
+ $r = q("DELETE FROM `profile` WHERE `id` = %d AND `uid` = %d",
+ intval(argv(2)),
+ intval(local_channel())
+ );
+ if($r)
+ info( t('Profile deleted.') . EOL);
+
+ // @fixme this is a much more complicated sync - add any changed abook entries and
+ // also add deleted flag to profile structure
+ // profiles_build_sync is just here as a placeholder - it doesn't work at all here
+
+ // profiles_build_sync(local_channel());
+
+ goaway(z_root() . '/profiles');
+ return; // NOTREACHED
+ }
+
+
+
+
+
+ if((argc() > 1) && (argv(1) === 'new')) {
+
+ // check_form_security_token_redirectOnErr('/profiles', 'profile_new', 't');
+
+ $r0 = q("SELECT `id` FROM `profile` WHERE `uid` = %d",
+ intval(local_channel()));
+ $num_profiles = count($r0);
+
+ $name = t('Profile-') . ($num_profiles + 1);
+
+ $r1 = q("SELECT `name`, `photo`, `thumb` FROM `profile` WHERE `uid` = %d AND `is_default` = 1 LIMIT 1",
+ intval(local_channel()));
+
+ $r2 = q("INSERT INTO `profile` (`aid`, `uid` , `profile_guid`, `profile_name` , `name`, `photo`, `thumb`)
+ VALUES ( %d, '%s', '%s', '%s', '%s', '%s', '%s' )",
+ intval(get_account_id()),
+ intval(local_channel()),
+ dbesc(random_string()),
+ dbesc($name),
+ dbesc($r1[0]['name']),
+ dbesc($r1[0]['photo']),
+ dbesc($r1[0]['thumb'])
+ );
+
+ $r3 = q("SELECT `id` FROM `profile` WHERE `uid` = %d AND `profile_name` = '%s' LIMIT 1",
+ intval(local_channel()),
+ dbesc($name)
+ );
+
+ info( t('New profile created.') . EOL);
+ if(count($r3) == 1)
+ goaway(z_root() . '/profiles/' . $r3[0]['id']);
+
+ goaway(z_root() . '/profiles');
+ }
+
+ if((argc() > 2) && (argv(1) === 'clone')) {
+
+ check_form_security_token_redirectOnErr('/profiles', 'profile_clone', 't');
+
+ $r0 = q("SELECT `id` FROM `profile` WHERE `uid` = %d",
+ intval(local_channel()));
+ $num_profiles = count($r0);
+
+ $name = t('Profile-') . ($num_profiles + 1);
+ $r1 = q("SELECT * FROM `profile` WHERE `uid` = %d AND `id` = %d LIMIT 1",
+ intval(local_channel()),
+ intval(\App::$argv[2])
+ );
+ if(! count($r1)) {
+ notice( t('Profile unavailable to clone.') . EOL);
+ \App::$error = 404;
+ return;
+ }
+ unset($r1[0]['id']);
+ $r1[0]['is_default'] = 0;
+ $r1[0]['publish'] = 0;
+ $r1[0]['profile_name'] = dbesc($name);
+ $r1[0]['profile_guid'] = dbesc(random_string());
+
+ dbesc_array($r1[0]);
+
+ $r2 = dbq("INSERT INTO `profile` (`"
+ . implode("`, `", array_keys($r1[0]))
+ . "`) VALUES ('"
+ . implode("', '", array_values($r1[0]))
+ . "')" );
+
+ $r3 = q("SELECT `id` FROM `profile` WHERE `uid` = %d AND `profile_name` = '%s' LIMIT 1",
+ intval(local_channel()),
+ dbesc($name)
+ );
+ info( t('New profile created.') . EOL);
+
+ profiles_build_sync(local_channel());
+
+ if(($r3) && (count($r3) == 1))
+ goaway(z_root() . '/profiles/' . $r3[0]['id']);
+
+ goaway(z_root() . '/profiles');
+
+ return; // NOTREACHED
+ }
+
+ if((argc() > 2) && (argv(1) === 'export')) {
+
+ $r1 = q("SELECT * FROM `profile` WHERE `uid` = %d AND `id` = %d LIMIT 1",
+ intval(local_channel()),
+ intval(argv(2))
+ );
+ if(! $r1) {
+ notice( t('Profile unavailable to export.') . EOL);
+ \App::$error = 404;
+ return;
+ }
+ header('content-type: application/octet_stream');
+ header('content-disposition: attachment; filename="' . $r1[0]['profile_name'] . '.json"' );
+
+ unset($r1[0]['id']);
+ unset($r1[0]['aid']);
+ unset($r1[0]['uid']);
+ unset($r1[0]['is_default']);
+ unset($r1[0]['publish']);
+ unset($r1[0]['profile_name']);
+ unset($r1[0]['profile_guid']);
+ echo json_encode($r1[0]);
+ killme();
+ }
+
+
+
+
+ // Run profile_load() here to make sure the theme is set before
+ // we start loading content
+ if(((argc() > 1) && (intval(argv(1)))) || !feature_enabled(local_channel(),'multi_profiles')) {
+ if(feature_enabled(local_channel(),'multi_profiles'))
+ $id = \App::$argv[1];
+ else {
+ $x = q("select id from profile where uid = %d and is_default = 1",
+ intval(local_channel())
+ );
+ if($x)
+ $id = $x[0]['id'];
+ }
+ $r = q("SELECT * FROM `profile` WHERE `id` = %d AND `uid` = %d LIMIT 1",
+ intval($id),
+ intval(local_channel())
+ );
+ if(! count($r)) {
+ notice( t('Profile not found.') . EOL);
+ \App::$error = 404;
+ return;
+ }
+
+ $chan = \App::get_channel();
+
+ profile_load($a,$chan['channel_address'],$r[0]['id']);
+ }
+ }
+
+ function post() {
+
+ if(! local_channel()) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ require_once('include/activities.php');
+
+ $namechanged = false;
+
+
+ // import from json export file.
+ // Only import fields that are allowed on this hub
+
+ if(x($_FILES,'userfile')) {
+ $src = $_FILES['userfile']['tmp_name'];
+ $filesize = intval($_FILES['userfile']['size']);
+ if($filesize) {
+ $j = @json_decode(@file_get_contents($src),true);
+ @unlink($src);
+ if($j) {
+ $fields = get_profile_fields_advanced();
+ if($fields) {
+ foreach($j as $jj => $v) {
+ foreach($fields as $f => $n) {
+ if($jj == $f) {
+ $_POST[$f] = $v;
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ call_hooks('profile_post', $_POST);
+
+
+ if((argc() > 1) && (argv(1) !== "new") && intval(argv(1))) {
+ $orig = q("SELECT * FROM `profile` WHERE `id` = %d AND `uid` = %d LIMIT 1",
+ intval(\App::$argv[1]),
+ intval(local_channel())
+ );
+ if(! count($orig)) {
+ notice( t('Profile not found.') . EOL);
+ return;
+ }
+
+ check_form_security_token_redirectOnErr('/profiles', 'profile_edit');
+
+ $is_default = (($orig[0]['is_default']) ? 1 : 0);
+
+ $profile_name = notags(trim($_POST['profile_name']));
+ if(! strlen($profile_name)) {
+ notice( t('Profile Name is required.') . EOL);
+ return;
+ }
+
+ $dob = $_POST['dob'] ? escape_tags(trim($_POST['dob'])) : '0000-00-00'; // FIXME: Needs to be validated?
+
+ $y = substr($dob,0,4);
+ if((! ctype_digit($y)) || ($y < 1900))
+ $ignore_year = true;
+ else
+ $ignore_year = false;
+
+ if($dob != '0000-00-00') {
+ if(strpos($dob,'0000-') === 0) {
+ $ignore_year = true;
+ $dob = substr($dob,5);
+ }
+ $dob = datetime_convert('UTC','UTC',(($ignore_year) ? '1900-' . $dob : $dob),(($ignore_year) ? 'm-d' : 'Y-m-d'));
+ if($ignore_year)
+ $dob = '0000-' . $dob;
+ }
+
+ $name = escape_tags(trim($_POST['name']));
+
+ if($orig[0]['name'] != $name) {
+ $namechanged = true;
+
+ $v = validate_channelname($name);
+ if($v) {
+ notice($v);
+ $namechanged = false;
+ $name = $orig[0]['name'];
+ }
+ }
+
+ $pdesc = escape_tags(trim($_POST['pdesc']));
+ $gender = escape_tags(trim($_POST['gender']));
+ $address = escape_tags(trim($_POST['address']));
+ $locality = escape_tags(trim($_POST['locality']));
+ $region = escape_tags(trim($_POST['region']));
+ $postal_code = escape_tags(trim($_POST['postal_code']));
+ $country_name = escape_tags(trim($_POST['country_name']));
+ $keywords = escape_tags(trim($_POST['keywords']));
+ $marital = escape_tags(trim($_POST['marital']));
+ $howlong = escape_tags(trim($_POST['howlong']));
+ $sexual = escape_tags(trim($_POST['sexual']));
+ $homepage = escape_tags(trim($_POST['homepage']));
+ $hometown = escape_tags(trim($_POST['hometown']));
+ $politic = escape_tags(trim($_POST['politic']));
+ $religion = escape_tags(trim($_POST['religion']));
+
+ $likes = fix_mce_lf(escape_tags(trim($_POST['likes'])));
+ $dislikes = fix_mce_lf(escape_tags(trim($_POST['dislikes'])));
+
+ $about = fix_mce_lf(escape_tags(trim($_POST['about'])));
+ $interest = fix_mce_lf(escape_tags(trim($_POST['interest'])));
+ $contact = fix_mce_lf(escape_tags(trim($_POST['contact'])));
+ $channels = fix_mce_lf(escape_tags(trim($_POST['channels'])));
+ $music = fix_mce_lf(escape_tags(trim($_POST['music'])));
+ $book = fix_mce_lf(escape_tags(trim($_POST['book'])));
+ $tv = fix_mce_lf(escape_tags(trim($_POST['tv'])));
+ $film = fix_mce_lf(escape_tags(trim($_POST['film'])));
+ $romance = fix_mce_lf(escape_tags(trim($_POST['romance'])));
+ $work = fix_mce_lf(escape_tags(trim($_POST['work'])));
+ $education = fix_mce_lf(escape_tags(trim($_POST['education'])));
+
+ $hide_friends = ((intval($_POST['hide_friends'])) ? 1: 0);
+
+ require_once('include/text.php');
+ linkify_tags($a, $likes, local_channel());
+ linkify_tags($a, $dislikes, local_channel());
+ linkify_tags($a, $about, local_channel());
+ linkify_tags($a, $interest, local_channel());
+ linkify_tags($a, $interest, local_channel());
+ linkify_tags($a, $contact, local_channel());
+ linkify_tags($a, $channels, local_channel());
+ linkify_tags($a, $music, local_channel());
+ linkify_tags($a, $book, local_channel());
+ linkify_tags($a, $tv, local_channel());
+ linkify_tags($a, $film, local_channel());
+ linkify_tags($a, $romance, local_channel());
+ linkify_tags($a, $work, local_channel());
+ linkify_tags($a, $education, local_channel());
+
+
+ $with = ((x($_POST,'with')) ? escape_tags(trim($_POST['with'])) : '');
+
+ if(! strlen($howlong))
+ $howlong = NULL_DATE;
+ else
+ $howlong = datetime_convert(date_default_timezone_get(),'UTC',$howlong);
+
+ // linkify the relationship target if applicable
+
+ $withchanged = false;
+
+ if(strlen($with)) {
+ if($with != strip_tags($orig[0]['with'])) {
+ $withchanged = true;
+ $prf = '';
+ $lookup = $with;
+ if(strpos($lookup,'@') === 0)
+ $lookup = substr($lookup,1);
+ $lookup = str_replace('_',' ', $lookup);
+ $newname = $lookup;
+
+ $r = q("SELECT * FROM abook left join xchan on abook_xchan = xchan_hash WHERE xchan_name = '%s' AND abook_channel = %d LIMIT 1",
+ dbesc($newname),
+ intval(local_channel())
+ );
+ if(! $r) {
+ $r = q("SELECT * FROM abook left join xchan on abook_xchan = xchan_hash WHERE xchan_addr = '%s' AND abook_channel = %d LIMIT 1",
+ dbesc($lookup . '@%'),
+ intval(local_channel())
+ );
+ }
+ if($r) {
+ $prf = $r[0]['xchan_url'];
+ $newname = $r[0]['xchan_name'];
+ }
+
+
+ if($prf) {
+ $with = str_replace($lookup,'<a href="' . $prf . '">' . $newname . '</a>', $with);
+ if(strpos($with,'@') === 0)
+ $with = substr($with,1);
+ }
+ }
+ else
+ $with = $orig[0]['with'];
+ }
+
+ $profile_fields_basic = get_profile_fields_basic();
+ $profile_fields_advanced = get_profile_fields_advanced();
+ $advanced = ((feature_enabled(local_channel(),'advanced_profiles')) ? true : false);
+ if($advanced)
+ $fields = $profile_fields_advanced;
+ else
+ $fields = $profile_fields_basic;
+
+ $z = q("select * from profdef where true");
+ if($z) {
+ foreach($z as $zz) {
+ if(array_key_exists($zz['field_name'],$fields)) {
+ $w = q("select * from profext where channel_id = %d and hash = '%s' and k = '%s' limit 1",
+ intval(local_channel()),
+ dbesc($orig[0]['profile_guid']),
+ dbesc($zz['field_name'])
+ );
+ if($w) {
+ q("update profext set v = '%s' where id = %d",
+ dbesc(escape_tags(trim($_POST[$zz['field_name']]))),
+ intval($w[0]['id'])
+ );
+ }
+ else {
+ q("insert into profext ( channel_id, hash, k, v ) values ( %d, '%s', '%s', '%s') ",
+ intval(local_channel()),
+ dbesc($orig[0]['profile_guid']),
+ dbesc($zz['field_name']),
+ dbesc(escape_tags(trim($_POST[$zz['field_name']])))
+ );
+ }
+ }
+ }
+ }
+
+ $changes = array();
+ $value = '';
+ if($is_default) {
+ if($marital != $orig[0]['marital']) {
+ $changes[] = '[color=#ff0000]&hearts;[/color] ' . t('Marital Status');
+ $value = $marital;
+ }
+ if($withchanged) {
+ $changes[] = '[color=#ff0000]&hearts;[/color] ' . t('Romantic Partner');
+ $value = strip_tags($with);
+ }
+ if($likes != $orig[0]['likes']) {
+ $changes[] = t('Likes');
+ $value = $likes;
+ }
+ if($dislikes != $orig[0]['dislikes']) {
+ $changes[] = t('Dislikes');
+ $value = $dislikes;
+ }
+ if($work != $orig[0]['work']) {
+ $changes[] = t('Work/Employment');
+ }
+ if($religion != $orig[0]['religion']) {
+ $changes[] = t('Religion');
+ $value = $religion;
+ }
+ if($politic != $orig[0]['politic']) {
+ $changes[] = t('Political Views');
+ $value = $politic;
+ }
+ if($gender != $orig[0]['gender']) {
+ $changes[] = t('Gender');
+ $value = $gender;
+ }
+ if($sexual != $orig[0]['sexual']) {
+ $changes[] = t('Sexual Preference');
+ $value = $sexual;
+ }
+ if($homepage != $orig[0]['homepage']) {
+ $changes[] = t('Homepage');
+ $value = $homepage;
+ }
+ if($interest != $orig[0]['interest']) {
+ $changes[] = t('Interests');
+ $value = $interest;
+ }
+ if($address != $orig[0]['address']) {
+ $changes[] = t('Address');
+ // New address not sent in notifications, potential privacy issues
+ // in case this leaks to unintended recipients. Yes, it's in the public
+ // profile but that doesn't mean we have to broadcast it to everybody.
+ }
+ if($locality != $orig[0]['locality'] || $region != $orig[0]['region']
+ || $country_name != $orig[0]['country_name']) {
+ $changes[] = t('Location');
+ $comma1 = ((($locality) && ($region || $country_name)) ? ', ' : ' ');
+ $comma2 = (($region && $country_name) ? ', ' : '');
+ $value = $locality . $comma1 . $region . $comma2 . $country_name;
+ }
+
+ profile_activity($changes,$value);
+
+ }
+
+ $r = q("UPDATE `profile`
+ SET `profile_name` = '%s',
+ `name` = '%s',
+ `pdesc` = '%s',
+ `gender` = '%s',
+ `dob` = '%s',
+ `address` = '%s',
+ `locality` = '%s',
+ `region` = '%s',
+ `postal_code` = '%s',
+ `country_name` = '%s',
+ `marital` = '%s',
+ `with` = '%s',
+ `howlong` = '%s',
+ `sexual` = '%s',
+ `homepage` = '%s',
+ `hometown` = '%s',
+ `politic` = '%s',
+ `religion` = '%s',
+ `keywords` = '%s',
+ `likes` = '%s',
+ `dislikes` = '%s',
+ `about` = '%s',
+ `interest` = '%s',
+ `contact` = '%s',
+ `channels` = '%s',
+ `music` = '%s',
+ `book` = '%s',
+ `tv` = '%s',
+ `film` = '%s',
+ `romance` = '%s',
+ `work` = '%s',
+ `education` = '%s',
+ `hide_friends` = %d
+ WHERE `id` = %d AND `uid` = %d",
+ dbesc($profile_name),
+ dbesc($name),
+ dbesc($pdesc),
+ dbesc($gender),
+ dbesc($dob),
+ dbesc($address),
+ dbesc($locality),
+ dbesc($region),
+ dbesc($postal_code),
+ dbesc($country_name),
+ dbesc($marital),
+ dbesc($with),
+ dbesc($howlong),
+ dbesc($sexual),
+ dbesc($homepage),
+ dbesc($hometown),
+ dbesc($politic),
+ dbesc($religion),
+ dbesc($keywords),
+ dbesc($likes),
+ dbesc($dislikes),
+ dbesc($about),
+ dbesc($interest),
+ dbesc($contact),
+ dbesc($channels),
+ dbesc($music),
+ dbesc($book),
+ dbesc($tv),
+ dbesc($film),
+ dbesc($romance),
+ dbesc($work),
+ dbesc($education),
+ intval($hide_friends),
+ intval(argv(1)),
+ intval(local_channel())
+ );
+
+ if($r)
+ info( t('Profile updated.') . EOL);
+
+ $r = q("select * from profile where id = %d and uid = %d limit 1",
+ intval(argv(1)),
+ intval(local_channel())
+ );
+ if($r) {
+ require_once('include/zot.php');
+ build_sync_packet(local_channel(),array('profile' => $r));
+ }
+
+ $channel = \App::get_channel();
+
+ if($namechanged && $is_default) {
+ $r = q("UPDATE xchan SET xchan_name = '%s', xchan_name_date = '%s' WHERE xchan_hash = '%s'",
+ dbesc($name),
+ dbesc(datetime_convert()),
+ dbesc($channel['xchan_hash'])
+ );
+ $r = q("UPDATE channel SET channel_name = '%s' WHERE channel_hash = '%s'",
+ dbesc($name),
+ dbesc($channel['xchan_hash'])
+ );
+ }
+
+ if($is_default) {
+ // reload the info for the sidebar widget - why does this not work?
+ profile_load($a,$channel['channel_address']);
+ proc_run('php','include/directory.php',local_channel());
+ }
+ }
+ }
+
+
+ function get() {
+
+ $o = '';
+
+ $channel = \App::get_channel();
+
+ if(! local_channel()) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ require_once('include/identity.php');
+
+ $profile_fields_basic = get_profile_fields_basic();
+ $profile_fields_advanced = get_profile_fields_advanced();
+
+ if(((argc() > 1) && (intval(argv(1)))) || !feature_enabled(local_channel(),'multi_profiles')) {
+ if(feature_enabled(local_channel(),'multi_profiles'))
+ $id = \App::$argv[1];
+ else {
+ $x = q("select id from profile where uid = %d and is_default = 1",
+ intval(local_channel())
+ );
+ if($x)
+ $id = $x[0]['id'];
+ }
+ $r = q("SELECT * FROM `profile` WHERE `id` = %d AND `uid` = %d LIMIT 1",
+ intval($id),
+ intval(local_channel())
+ );
+ if(! count($r)) {
+ notice( t('Profile not found.') . EOL);
+ return;
+ }
+
+ require_once('include/profile_selectors.php');
+
+
+ $editselect = 'none';
+ // if(feature_enabled(local_channel(),'richtext'))
+ // $editselect = 'textareas';
+
+ \App::$page['htmlhead'] .= replace_macros(get_markup_template('profed_head.tpl'), array(
+ '$baseurl' => z_root(),
+ '$editselect' => $editselect,
+ ));
+
+ $advanced = ((feature_enabled(local_channel(),'advanced_profiles')) ? true : false);
+ if($advanced)
+ $fields = $profile_fields_advanced;
+ else
+ $fields = $profile_fields_basic;
+
+ $hide_friends = array(
+ 'hide_friends',
+ t('Hide your connections list from viewers of this profile'),
+ $r[0]['hide_friends'],
+ '',
+ array(t('No'),t('Yes'))
+ );
+
+ $q = q("select * from profdef where true");
+ if($q) {
+ $extra_fields = array();
+
+ foreach($q as $qq) {
+ $mine = q("select v from profext where k = '%s' and hash = '%s' and channel_id = %d limit 1",
+ dbesc($qq['field_name']),
+ dbesc($r[0]['profile_guid']),
+ intval(local_channel())
+ );
+
+ if(array_key_exists($qq['field_name'],$fields)) {
+ $extra_fields[] = array($qq['field_name'],$qq['field_desc'],(($mine) ? $mine[0]['v'] : ''), $qq['field_help']);
+ }
+ }
+ }
+
+ //logger('extra_fields: ' . print_r($extra_fields,true));
+
+ $f = get_config('system','birthday_input_format');
+ if(! $f)
+ $f = 'ymd';
+
+ $is_default = (($r[0]['is_default']) ? 1 : 0);
+
+ $tpl = get_markup_template("profile_edit.tpl");
+ $o .= replace_macros($tpl,array(
+
+ '$form_security_token' => get_form_security_token("profile_edit"),
+ '$profile_clone_link' => ((feature_enabled(local_channel(),'multi_profiles')) ? 'profiles/clone/' . $r[0]['id'] . '?t='
+ . get_form_security_token("profile_clone") : ''),
+ '$profile_drop_link' => 'profiles/drop/' . $r[0]['id'] . '?t='
+ . get_form_security_token("profile_drop"),
+
+ '$fields' => $fields,
+ '$guid' => $r[0]['profile_guid'],
+ '$banner' => t('Edit Profile Details'),
+ '$submit' => t('Submit'),
+ '$viewprof' => t('View this profile'),
+ '$editvis' => t('Edit visibility'),
+ '$tools_label' => t('Profile Tools'),
+ '$coverpic' => t('Change cover photo'),
+ '$profpic' => t('Change profile photo'),
+ '$cr_prof' => t('Create a new profile using these settings'),
+ '$cl_prof' => t('Clone this profile'),
+ '$del_prof' => t('Delete this profile'),
+ '$addthing' => t('Add profile things'),
+ '$personal' => t('Personal'),
+ '$location' => t('Location'),
+ '$relation' => t('Relation'),
+ '$miscellaneous'=> t('Miscellaneous'),
+ '$exportable' => feature_enabled(local_channel(),'profile_export'),
+ '$lbl_import' => t('Import profile from file'),
+ '$lbl_export' => t('Export profile to file'),
+ '$lbl_gender' => t('Your gender'),
+ '$lbl_marital' => t('Marital status'),
+ '$lbl_sexual' => t('Sexual preference'),
+ '$baseurl' => z_root(),
+ '$profile_id' => $r[0]['id'],
+ '$profile_name' => array('profile_name', t('Profile name'), $r[0]['profile_name'], t('Required'), '*'),
+ '$is_default' => $is_default,
+ '$default' => t('This is your default profile.') . EOL . translate_scope(map_scope($channel['channel_r_profile'])),
+ '$advanced' => $advanced,
+ '$name' => array('name', t('Your full name'), $r[0]['name'], t('Required'), '*'),
+ '$pdesc' => array('pdesc', t('Title/Description'), $r[0]['pdesc']),
+ '$dob' => dob($r[0]['dob']),
+ '$hide_friends' => $hide_friends,
+ '$address' => array('address', t('Street address'), $r[0]['address']),
+ '$locality' => array('locality', t('Locality/City'), $r[0]['locality']),
+ '$region' => array('region', t('Region/State'), $r[0]['region']),
+ '$postal_code' => array('postal_code', t('Postal/Zip code'), $r[0]['postal_code']),
+ '$country_name' => array('country_name', t('Country'), $r[0]['country_name']),
+ '$gender' => gender_selector($r[0]['gender']),
+ '$gender_min' => gender_selector_min($r[0]['gender']),
+ '$marital' => marital_selector($r[0]['marital']),
+ '$marital_min' => marital_selector_min($r[0]['marital']),
+ '$with' => array('with', t("Who (if applicable)"), $r[0]['with'], t('Examples: cathy123, Cathy Williams, cathy@example.com')),
+ '$howlong' => array('howlong', t('Since (date)'), ($r[0]['howlong'] === NULL_DATE ? '' : datetime_convert('UTC',date_default_timezone_get(),$r[0]['howlong']))),
+ '$sexual' => sexpref_selector($r[0]['sexual']),
+ '$sexual_min' => sexpref_selector_min($r[0]['sexual']),
+ '$about' => array('about', t('Tell us about yourself'), $r[0]['about']),
+ '$homepage' => array('homepage', t('Homepage URL'), $r[0]['homepage']),
+ '$hometown' => array('hometown', t('Hometown'), $r[0]['hometown']),
+ '$politic' => array('politic', t('Political views'), $r[0]['politic']),
+ '$religion' => array('religion', t('Religious views'), $r[0]['religion']),
+ '$keywords' => array('keywords', t('Keywords used in directory listings'), $r[0]['keywords'], t('Example: fishing photography software')),
+ '$likes' => array('likes', t('Likes'), $r[0]['likes']),
+ '$dislikes' => array('dislikes', t('Dislikes'), $r[0]['dislikes']),
+ '$music' => array('music', t('Musical interests'), $r[0]['music']),
+ '$book' => array('book', t('Books, literature'), $r[0]['book']),
+ '$tv' => array('tv', t('Television'), $r[0]['tv']),
+ '$film' => array('film', t('Film/Dance/Culture/Entertainment'), $r[0]['film']),
+ '$interest' => array('interest', t('Hobbies/Interests'), $r[0]['interest']),
+ '$romance' => array('romance',t('Love/Romance'), $r[0]['romance']),
+ '$work' => array('work', t('Work/Employment'), $r[0]['work']),
+ '$education' => array('education', t('School/Education'), $r[0]['education']),
+ '$contact' => array('contact', t('Contact information and social networks'), $r[0]['contact']),
+ '$channels' => array('channels', t('My other channels'), $r[0]['channels']),
+ '$extra_fields' => $extra_fields,
+ ));
+
+ $arr = array('profile' => $r[0], 'entry' => $o);
+ call_hooks('profile_edit', $arr);
+
+ return $o;
+ }
+ else {
+
+ $r = q("SELECT * FROM `profile` WHERE `uid` = %d",
+ local_channel());
+ if(count($r)) {
+
+ $tpl = get_markup_template('profile_entry.tpl');
+ foreach($r as $rr) {
+ $profiles .= replace_macros($tpl, array(
+ '$photo' => $rr['thumb'],
+ '$id' => $rr['id'],
+ '$alt' => t('Profile Image'),
+ '$profile_name' => $rr['profile_name'],
+ '$visible' => (($rr['is_default'])
+ ? '<strong>' . translate_scope(map_scope($channel['channel_r_profile'])) . '</strong>'
+ : '<a href="' . z_root() . '/profperm/' . $rr['id'] . '" />' . t('Edit visibility') . '</a>')
+ ));
+ }
+
+ $tpl_header = get_markup_template('profile_listing_header.tpl');
+ $o .= replace_macros($tpl_header,array(
+ '$header' => t('Edit Profiles'),
+ '$cr_new' => t('Create New'),
+ '$cr_new_link' => 'profiles/new?t=' . get_form_security_token("profile_new"),
+ '$profiles' => $profiles
+ ));
+
+
+
+
+ }
+ return $o;
+ }
+
+ }
+
+}
diff --git a/Zotlabs/Module/Profperm.php b/Zotlabs/Module/Profperm.php
new file mode 100644
index 000000000..94267aaac
--- /dev/null
+++ b/Zotlabs/Module/Profperm.php
@@ -0,0 +1,172 @@
+<?php
+namespace Zotlabs\Module;
+
+require_once('include/Contact.php');
+require_once('include/photos.php');
+
+
+class Profperm extends \Zotlabs\Web\Controller {
+
+ function init() {
+
+ if(! local_channel())
+ return;
+
+ $channel = \App::get_channel();
+ $which = $channel['channel_address'];
+
+ $profile = \App::$argv[1];
+
+ profile_load($a,$which,$profile);
+
+ }
+
+
+ function get() {
+
+ if(! local_channel()) {
+ notice( t('Permission denied') . EOL);
+ return;
+ }
+
+
+ if(argc() < 2) {
+ notice( t('Invalid profile identifier.') . EOL );
+ return;
+ }
+
+ // Switch to text mod interface if we have more than 'n' contacts or group members
+
+ $switchtotext = get_pconfig(local_channel(),'system','groupedit_image_limit');
+ if($switchtotext === false)
+ $switchtotext = get_config('system','groupedit_image_limit');
+ if($switchtotext === false)
+ $switchtotext = 400;
+
+
+ if((argc() > 2) && intval(argv(1)) && intval(argv(2))) {
+ $r = q("SELECT abook_id FROM abook WHERE abook_id = %d and abook_channel = %d limit 1",
+ intval(argv(2)),
+ intval(local_channel())
+ );
+ if($r)
+ $change = intval(argv(2));
+ }
+
+
+ if((argc() > 1) && (intval(argv(1)))) {
+ $r = q("SELECT * FROM `profile` WHERE `id` = %d AND `uid` = %d AND `is_default` = 0 LIMIT 1",
+ intval(argv(1)),
+ intval(local_channel())
+ );
+ if(! $r) {
+ notice( t('Invalid profile identifier.') . EOL );
+ return;
+ }
+
+ $profile = $r[0];
+
+ $r = q("SELECT * FROM abook left join xchan on abook_xchan = xchan_hash WHERE abook_channel = %d AND abook_profile = '%s'",
+ intval(local_channel()),
+ dbesc($profile['profile_guid'])
+ );
+
+ $ingroup = array();
+ if($r)
+ foreach($r as $member)
+ $ingroup[] = $member['abook_id'];
+
+ $members = $r;
+
+ if($change) {
+ if(in_array($change,$ingroup)) {
+ q("UPDATE abook SET abook_profile = '' WHERE abook_id = %d AND abook_channel = %d",
+ intval($change),
+ intval(local_channel())
+ );
+ }
+ else {
+ q("UPDATE abook SET abook_profile = '%s' WHERE abook_id = %d AND abook_channel = %d",
+ dbesc($profile['profile_guid']),
+ intval($change),
+ intval(local_channel())
+ );
+
+ }
+
+
+ //Time to update the permissions on the profile-pictures as well
+
+ profile_photo_set_profile_perms($profile['id']);
+
+ $r = q("SELECT * FROM abook left join xchan on abook_xchan = xchan_hash WHERE abook_channel = %d AND abook_profile = '%s'",
+ intval(local_channel()),
+ dbesc($profile['profile_guid'])
+ );
+
+ $members = $r;
+
+ $ingroup = array();
+ if(count($r))
+ foreach($r as $member)
+ $ingroup[] = $member['abook_id'];
+ }
+
+ $o .= '<h2>' . t('Profile Visibility Editor') . '</h2>';
+
+ $o .= '<h3>' . t('Profile') . ' \'' . $profile['profile_name'] . '\'</h3>';
+
+ $o .= '<div id="prof-edit-desc">' . t('Click on a contact to add or remove.') . '</div>';
+
+ }
+
+ $o .= '<div id="prof-update-wrapper">';
+ if($change)
+ $o = '';
+
+ $o .= '<div id="prof-members-title">';
+ $o .= '<h3>' . t('Visible To') . '</h3>';
+ $o .= '</div>';
+ $o .= '<div id="prof-members">';
+
+ $textmode = (($switchtotext && (count($members) > $switchtotext)) ? true : false);
+
+ foreach($members as $member) {
+ if($member['xchan_url']) {
+ $member['click'] = 'profChangeMember(' . $profile['id'] . ',' . $member['abook_id'] . '); return false;';
+ $o .= micropro($member,true,'mpprof', $textmode);
+ }
+ }
+ $o .= '</div><div id="prof-members-end"></div>';
+ $o .= '<hr id="prof-separator" />';
+
+ $o .= '<div id="prof-all-contcts-title">';
+ $o .= '<h3>' . t("All Connections") . '</h3>';
+ $o .= '</div>';
+ $o .= '<div id="prof-all-contacts">';
+
+ $r = abook_connections(local_channel());
+
+ if($r) {
+ $textmode = (($switchtotext && (count($r) > $switchtotext)) ? true : false);
+ foreach($r as $member) {
+ if(! in_array($member['abook_id'],$ingroup)) {
+ $member['click'] = 'profChangeMember(' . $profile['id'] . ',' . $member['abook_id'] . '); return false;';
+ $o .= micropro($member,true,'mpprof',$textmode);
+ }
+ }
+ }
+
+ $o .= '</div><div id="prof-all-contacts-end"></div>';
+
+ if($change) {
+ echo $o;
+ killme();
+ }
+ $o .= '</div>';
+ return $o;
+
+ }
+
+
+}
diff --git a/Zotlabs/Module/Pubsites.php b/Zotlabs/Module/Pubsites.php
new file mode 100644
index 000000000..559c8f2f1
--- /dev/null
+++ b/Zotlabs/Module/Pubsites.php
@@ -0,0 +1,59 @@
+<?php
+namespace Zotlabs\Module;
+
+
+class Pubsites extends \Zotlabs\Web\Controller {
+
+ function get() {
+ require_once('include/dir_fns.php');
+ $dirmode = intval(get_config('system','directory_mode'));
+
+ if(($dirmode == DIRECTORY_MODE_PRIMARY) || ($dirmode == DIRECTORY_MODE_STANDALONE)) {
+ $url = z_root() . '/dirsearch';
+ }
+ if(! $url) {
+ $directory = find_upstream_directory($dirmode);
+ $url = $directory['url'] . '/dirsearch';
+ }
+ $url .= '/sites';
+
+ $o .= '<div class="generic-content-wrapper">';
+
+ $o .= '<div class="section-title-wrapper"><h2>' . t('Public Hubs') . '</h2></div>';
+
+ $o .= '<div class="section-content-tools-wrapper"><div class="descriptive-text">' .
+ t('The listed hubs allow public registration for the $Projectname network. All hubs in the network are interlinked so membership on any of them conveys membership in the network as a whole. Some hubs may require subscription or provide tiered service plans. The hub itself <strong>may</strong> provide additional details.') . '</div>' . EOL;
+
+ $ret = z_fetch_url($url);
+ if($ret['success']) {
+ $j = json_decode($ret['body'],true);
+ if($j) {
+ $o .= '<table class="table table-striped table-hover"><tr><td>' . t('Hub URL') . '</td><td>' . t('Access Type') . '</td><td>' . t('Registration Policy') . '</td><td colspan="2">' . t('Ratings') . '</td></tr>';
+ if($j['sites']) {
+ foreach($j['sites'] as $jj) {
+ if($jj['project'] !== \Zotlabs\Project\System::get_platform_name())
+ continue;
+ $host = strtolower(substr($jj['url'],strpos($jj['url'],'://')+3));
+ $rate_links = ((local_channel()) ? '<td><a href="rate?f=&target=' . $host . '" class="btn-btn-default"><i class="icon-check"></i> ' . t('Rate') . '</a></td>' : '');
+ $location = '';
+ if(!empty($jj['location'])) {
+ $location = '<p title="' . t('Location') . '" style="margin: 5px 5px 0 0; text-align: right"><i class="icon-globe"></i> ' . $jj['location'] . '</p>';
+ }
+ else {
+ $location = '<br />&nbsp;';
+ }
+ $urltext = str_replace(array('https://'), '', $jj['url']);
+ $o .= '<tr><td><a href="'. (($jj['sellpage']) ? $jj['sellpage'] : $jj['url'] . '/register' ) . '" ><i class="icon-link"></i> ' . $urltext . '</a>' . $location . '</td><td>' . $jj['access'] . '</td><td>' . $jj['register'] . '</td><td><a href="ratings/' . $host . '" class="btn-btn-default"><i class="icon-eye-open"></i> ' . t('View') . '</a></td>' . $rate_links . '</tr>';
+ }
+ }
+
+ $o .= '</table>';
+
+ $o .= '</div></div>';
+
+ }
+ }
+ return $o;
+ }
+
+}
diff --git a/Zotlabs/Module/Pubstream.php b/Zotlabs/Module/Pubstream.php
new file mode 100644
index 000000000..d6cfe6e92
--- /dev/null
+++ b/Zotlabs/Module/Pubstream.php
@@ -0,0 +1,168 @@
+<?php
+namespace Zotlabs\Module;
+
+require_once('include/conversation.php');
+
+
+class Pubstream extends \Zotlabs\Web\Controller {
+
+ function get($update = 0, $load = false) {
+
+ if($load)
+ $_SESSION['loadtime'] = datetime_convert();
+
+
+ if(get_config('system','block_public') && (! get_account_id()) && (! remote_channel())) {
+ return login();
+ }
+
+
+ if(get_config('system','disable_discover_tab'))
+ return;
+
+ $item_normal = item_normal();
+
+ if(! $update) {
+
+ $maxheight = get_config('system','home_divmore_height');
+ if(! $maxheight)
+ $maxheight = 400;
+
+ $o .= '<div id="live-public"></div>' . "\r\n";
+ $o .= "<script> var profile_uid = " . ((intval(local_channel())) ? local_channel() : (-1))
+ . "; var profile_page = " . \App::$pager['page']
+ . "; divmore_height = " . intval($maxheight) . "; </script>\r\n";
+
+ \App::$page['htmlhead'] .= replace_macros(get_markup_template("build_query.tpl"),array(
+ '$baseurl' => z_root(),
+ '$pgtype' => 'public',
+ '$uid' => ((local_channel()) ? local_channel() : '0'),
+ '$gid' => '0',
+ '$cid' => '0',
+ '$cmin' => '0',
+ '$cmax' => '99',
+ '$star' => '0',
+ '$liked' => '0',
+ '$conv' => '0',
+ '$spam' => '0',
+ '$fh' => '1',
+ '$nouveau' => '0',
+ '$wall' => '0',
+ '$list' => '0',
+ '$page' => ((\App::$pager['page'] != 1) ? \App::$pager['page'] : 1),
+ '$search' => '',
+ '$order' => 'comment',
+ '$file' => '',
+ '$cats' => '',
+ '$tags' => '',
+ '$dend' => '',
+ '$mid' => '',
+ '$verb' => '',
+ '$dbegin' => ''
+ ));
+ }
+
+ if($update && ! $load) {
+ // only setup pagination on initial page view
+ $pager_sql = '';
+ }
+ else {
+ \App::set_pager_itemspage(20);
+ $pager_sql = sprintf(" LIMIT %d OFFSET %d ", intval(\App::$pager['itemspage']), intval(\App::$pager['start']));
+ }
+
+ require_once('include/identity.php');
+ require_once('include/security.php');
+
+ if(get_config('system','site_firehose')) {
+ $uids = " and item.uid in ( " . stream_perms_api_uids(PERMS_PUBLIC) . " ) and item_private = 0 and item_wall = 1 ";
+ }
+ else {
+ $sys = get_sys_channel();
+ $uids = " and item.uid = " . intval($sys['channel_id']) . " ";
+ $sql_extra = item_permissions_sql($sys['channel_id']);
+ \App::$data['firehose'] = intval($sys['channel_id']);
+ }
+
+ if(get_config('system','public_list_mode'))
+ $page_mode = 'list';
+ else
+ $page_mode = 'client';
+
+
+ $simple_update = (($update) ? " and item.item_unseen = 1 " : '');
+
+ if($update && $_SESSION['loadtime'])
+ $simple_update = " AND (( item_unseen = 1 AND item.changed > '" . datetime_convert('UTC','UTC',$_SESSION['loadtime']) . "' ) OR item.changed > '" . datetime_convert('UTC','UTC',$_SESSION['loadtime']) . "' ) ";
+ if($load)
+ $simple_update = '';
+
+ //logger('update: ' . $update . ' load: ' . $load);
+
+ if($update) {
+
+ $ordering = "commented";
+
+ if($load) {
+
+ // Fetch a page full of parent items for this page
+
+ $r = q("SELECT distinct item.id AS item_id, $ordering FROM item
+ left join abook on item.author_xchan = abook.abook_xchan
+ WHERE true $uids $item_normal
+ AND item.parent = item.id
+ and (abook.abook_blocked = 0 or abook.abook_flags is null)
+ $sql_extra3 $sql_extra $sql_nets
+ ORDER BY $ordering DESC $pager_sql "
+ );
+
+
+ }
+ elseif($update) {
+
+ $r = q("SELECT distinct item.id AS item_id, $ordering FROM item
+ left join abook on item.author_xchan = abook.abook_xchan
+ WHERE true $uids $item_normal
+ AND item.parent = item.id $simple_update
+ and (abook.abook_blocked = 0 or abook.abook_flags is null)
+ $sql_extra3 $sql_extra $sql_nets"
+ );
+ $_SESSION['loadtime'] = datetime_convert();
+ }
+ // Then fetch all the children of the parents that are on this page
+ $parents_str = '';
+ $update_unseen = '';
+
+ if($r) {
+
+ $parents_str = ids_to_querystr($r,'item_id');
+
+ $items = q("SELECT item.*, item.id AS item_id FROM item
+ WHERE true $uids $item_normal
+ AND item.parent IN ( %s )
+ $sql_extra ",
+ dbesc($parents_str)
+ );
+
+ xchan_query($items,true,(-1));
+ $items = fetch_post_tags($items,true);
+ $items = conv_sort($items,$ordering);
+ }
+ else {
+ $items = array();
+ }
+
+ }
+
+ // fake it
+ $mode = ('network');
+
+ $o .= conversation($a,$items,$mode,$update,$page_mode);
+
+ if(($items) && (! $update))
+ $o .= alt_pager($a,count($items));
+
+ return $o;
+
+ }
+}
diff --git a/Zotlabs/Module/Randprof.php b/Zotlabs/Module/Randprof.php
new file mode 100644
index 000000000..86b25c22a
--- /dev/null
+++ b/Zotlabs/Module/Randprof.php
@@ -0,0 +1,18 @@
+<?php
+namespace Zotlabs\Module;
+
+
+
+class Randprof extends \Zotlabs\Web\Controller {
+
+ function init() {
+ require_once('include/Contact.php');
+ $x = random_profile();
+ if($x)
+ goaway(chanlink_url($x));
+
+ /** FIXME this doesn't work at the moment as a fallback */
+ goaway(z_root() . '/profile');
+ }
+
+}
diff --git a/Zotlabs/Module/Rate.php b/Zotlabs/Module/Rate.php
new file mode 100644
index 000000000..e2c05b6d4
--- /dev/null
+++ b/Zotlabs/Module/Rate.php
@@ -0,0 +1,178 @@
+<?php
+namespace Zotlabs\Module;
+
+
+
+class Rate extends \Zotlabs\Web\Controller {
+
+ function init() {
+
+ if(! local_channel())
+ return;
+
+ $channel = \App::get_channel();
+
+ $target = $_REQUEST['target'];
+ if(! $target)
+ return;
+
+ \App::$data['target'] = $target;
+
+ if($target) {
+ $r = q("SELECT * FROM xchan where xchan_hash like '%s' LIMIT 1",
+ dbesc($target)
+ );
+ if($r) {
+ \App::$poi = $r[0];
+ }
+ else {
+ $r = q("select * from site where site_url like '%s' and site_type = %d",
+ dbesc('%' . $target),
+ intval(SITE_TYPE_ZOT)
+ );
+ if($r) {
+ \App::$data['site'] = $r[0];
+ \App::$data['site']['site_url'] = strtolower($r[0]['site_url']);
+ }
+ }
+ }
+
+
+ return;
+
+ }
+
+
+ function post() {
+
+ if(! local_channel())
+ return;
+
+ if(! \App::$data['target'])
+ return;
+
+ if(! $_REQUEST['execute'])
+ return;
+
+ $channel = \App::get_channel();
+
+ $rating = intval($_POST['rating']);
+ if($rating < (-10))
+ $rating = (-10);
+ if($rating > 10)
+ $rating = 10;
+
+ $rating_text = trim(escape_tags($_REQUEST['rating_text']));
+
+ $signed = \App::$data['target'] . '.' . $rating . '.' . $rating_text;
+
+ $sig = base64url_encode(rsa_sign($signed,$channel['channel_prvkey']));
+
+ $z = q("select * from xlink where xlink_xchan = '%s' and xlink_link = '%s' and xlink_static = 1 limit 1",
+ dbesc($channel['channel_hash']),
+ dbesc(\App::$data['target'])
+ );
+
+ if($z) {
+ $record = $z[0]['xlink_id'];
+ $w = q("update xlink set xlink_rating = '%d', xlink_rating_text = '%s', xlink_sig = '%s', xlink_updated = '%s'
+ where xlink_id = %d",
+ intval($rating),
+ dbesc($rating_text),
+ dbesc($sig),
+ dbesc(datetime_convert()),
+ intval($record)
+ );
+ }
+ else {
+ $w = q("insert into xlink ( xlink_xchan, xlink_link, xlink_rating, xlink_rating_text, xlink_sig, xlink_updated, xlink_static ) values ( '%s', '%s', %d, '%s', '%s', '%s', 1 ) ",
+ dbesc($channel['channel_hash']),
+ dbesc(\App::$data['target']),
+ intval($rating),
+ dbesc($rating_text),
+ dbesc($sig),
+ dbesc(datetime_convert())
+ );
+ $z = q("select * from xlink where xlink_xchan = '%s' and xlink_link = '%s' and xlink_static = 1 limit 1",
+ dbesc($channel['channel_hash']),
+ dbesc(\App::$data['target'])
+ );
+ if($z)
+ $record = $z[0]['xlink_id'];
+ }
+
+ if($record) {
+ proc_run('php','include/ratenotif.php','rating',$record);
+ }
+
+ }
+
+
+
+ function get() {
+
+ if(! local_channel()) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ // if(! \App::$data['target']) {
+ // notice( t('No recipients.') . EOL);
+ // return;
+ // }
+
+ $poco_rating = get_config('system','poco_rating_enable');
+ if((! $poco_rating) && ($poco_rating !== false)) {
+ notice('Ratings are disabled on this site.');
+ return;
+ }
+
+ $channel = \App::get_channel();
+
+ $r = q("select * from xlink where xlink_xchan = '%s' and xlink_link = '%s' and xlink_static = 1",
+ dbesc($channel['channel_hash']),
+ dbesc(\App::$data['target'])
+ );
+ if($r) {
+ \App::$data['xlink'] = $r[0];
+ $rating_val = $r[0]['xlink_rating'];
+ $rating_text = $r[0]['xlink_rating_text'];
+ }
+ else {
+ $rating_val = 0;
+ $rating_text = '';
+ }
+
+ // if unset default to enabled
+ if($poco_rating === false)
+ $poco_rating = true;
+
+ if($poco_rating) {
+ $rating = replace_macros(get_markup_template('rating_slider.tpl'),array(
+ '$min' => -10,
+ '$val' => $rating_val
+ ));
+ }
+ else {
+ $rating = false;
+ }
+
+ $o = replace_macros(get_markup_template('rating_form.tpl'),array(
+ '$header' => t('Rating'),
+ '$website' => t('Website:'),
+ '$site' => ((\App::$data['site']) ? '<a href="' . \App::$data['site']['site_url'] . '" >' . \App::$data['site']['site_url'] . '</a>' : ''),
+ 'target' => \App::$data['target'],
+ '$tgt_name' => ((\App::$poi && \App::$poi['xchan_name']) ? \App::$poi['xchan_name'] : sprintf( t('Remote Channel [%s] (not yet known on this site)'), substr(\App::$data['target'],0,16))),
+ '$lbl_rating' => t('Rating (this information is public)'),
+ '$lbl_rating_txt' => t('Optionally explain your rating (this information is public)'),
+ '$rating_txt' => $rating_text,
+ '$rating' => $rating,
+ '$rating_val' => $rating_val,
+ '$slide' => $slide,
+ '$submit' => t('Submit')
+ ));
+
+ return $o;
+
+ }
+}
diff --git a/Zotlabs/Module/Ratings.php b/Zotlabs/Module/Ratings.php
new file mode 100644
index 000000000..802bbfec2
--- /dev/null
+++ b/Zotlabs/Module/Ratings.php
@@ -0,0 +1,115 @@
+<?php
+namespace Zotlabs\Module;
+
+require_once('include/dir_fns.php');
+
+
+class Ratings extends \Zotlabs\Web\Controller {
+
+ function init() {
+
+ if((get_config('system','block_public')) && (! local_channel()) && (! remote_channel())) {
+ return;
+ }
+
+ if(local_channel())
+ load_contact_links(local_channel());
+
+ $dirmode = intval(get_config('system','directory_mode'));
+
+ $x = find_upstream_directory($dirmode);
+ if($x)
+ $url = $x['url'];
+
+ $poco_rating = get_config('system','poco_rating_enable');
+ // if unset default to enabled
+ if($poco_rating === false)
+ $poco_rating = true;
+
+ if(! $poco_rating)
+ return;
+
+ if(argc() > 1)
+ $hash = argv(1);
+
+ if(! $hash) {
+ notice('Must supply a channel identififier.');
+ return;
+ }
+
+ $results = false;
+
+ $x = z_fetch_url($url . '/ratingsearch/' . urlencode($hash));
+
+
+ if($x['success'])
+ $results = json_decode($x['body'],true);
+
+
+ if((! $results) || (! $results['success'])) {
+
+ notice('No results.');
+ return;
+ }
+
+ if(array_key_exists('xchan_hash',$results['target']))
+ \App::$poi = $results['target'];
+
+ $friends = array();
+ $others = array();
+
+ if($results['ratings']) {
+ foreach($results['ratings'] as $n) {
+ if(is_array(\App::$contacts) && array_key_exists($n['xchan_hash'],\App::$contacts))
+ $friends[] = $n;
+ else
+ $others[] = $n;
+ }
+ }
+
+ \App::$data = array('target' => $results['target'], 'results' => array_merge($friends,$others));
+
+ if(! \App::$data['results']) {
+ notice( t('No ratings') . EOL);
+ }
+
+ return;
+ }
+
+
+
+
+
+ function get() {
+
+ if((get_config('system','block_public')) && (! local_channel()) && (! remote_channel())) {
+ notice( t('Public access denied.') . EOL);
+ return;
+ }
+
+ $poco_rating = get_config('system','poco_rating_enable');
+ // if unset default to enabled
+ if($poco_rating === false)
+ $poco_rating = true;
+
+ if(! $poco_rating)
+ return;
+
+ $site_target = ((array_key_exists('target',\App::$data) && array_key_exists('site_url',\App::$data['target'])) ?
+ '<a href="' . \App::$data['target']['site_url'] . '" >' . \App::$data['target']['site_url'] . '</a>' : '');
+
+
+ $o = replace_macros(get_markup_template('prep.tpl'),array(
+ '$header' => t('Ratings'),
+ '$rating_lbl' => t('Rating: ' ),
+ '$website' => t('Website: '),
+ '$site' => $site_target,
+ '$rating_text_lbl' => t('Description: '),
+ '$raters' => \App::$data['results']
+ ));
+
+ return $o;
+ }
+
+
+}
diff --git a/Zotlabs/Module/Ratingsearch.php b/Zotlabs/Module/Ratingsearch.php
new file mode 100644
index 000000000..5f463b378
--- /dev/null
+++ b/Zotlabs/Module/Ratingsearch.php
@@ -0,0 +1,76 @@
+<?php
+namespace Zotlabs\Module;
+
+
+
+class Ratingsearch extends \Zotlabs\Web\Controller {
+
+ function init() {
+
+ $ret = array('success' => false);
+
+ $dirmode = intval(get_config('system','directory_mode'));
+
+ if($dirmode == DIRECTORY_MODE_NORMAL) {
+ $ret['message'] = 'This site is not a directory server.';
+ json_return_and_die($ret);
+ }
+
+ if(argc() > 1)
+ $hash = argv(1);
+
+ if(! $hash) {
+ $ret['message'] = 'No channel identifier';
+ json_return_and_die($ret);
+ }
+
+ if(strpos($hash,'@')) {
+ $r = q("select * from hubloc where hubloc_addr = '%s' limit 1",
+ dbesc($hash)
+ );
+ if($r)
+ $hash = $r[0]['hubloc_hash'];
+ }
+
+ $p = q("select * from xchan where xchan_hash like '%s'",
+ dbesc($hash . '%')
+ );
+
+ if($p)
+ $target = $p[0]['xchan_hash'];
+ else {
+ $p = q("select * from site where site_url like '%s' and site_type = %d ",
+ dbesc('%' . $hash),
+ intval(SITE_TYPE_ZOT)
+ );
+ if($p) {
+ $target = strtolower($hash);
+ }
+ else {
+ $ret['message'] = 'Rating target not found';
+ json_return_and_die($ret);
+ }
+ }
+
+ if($p)
+ $ret['target'] = $p[0];
+
+ $ret['success'] = true;
+
+ $r = q("select * from xlink left join xchan on xlink_xchan = xchan_hash
+ where xlink_link = '%s' and xlink_rating != 0 and xlink_static = 1 order by xchan_name asc",
+ dbesc($target)
+ );
+
+ if($r) {
+ $ret['ratings'] = $r;
+ }
+ else
+ $ret['ratings'] = array();
+
+ json_return_and_die($ret);
+
+ }
+
+
+}
diff --git a/Zotlabs/Module/Rbmark.php b/Zotlabs/Module/Rbmark.php
new file mode 100644
index 000000000..226cef69e
--- /dev/null
+++ b/Zotlabs/Module/Rbmark.php
@@ -0,0 +1,121 @@
+<?php
+namespace Zotlabs\Module; /** @file */
+
+require_once('include/acl_selectors.php');
+require_once('include/crypto.php');
+require_once('include/items.php');
+require_once('include/taxonomy.php');
+require_once('include/conversation.php');
+require_once('include/zot.php');
+require_once('include/bookmarks.php');
+
+/**
+ * remote bookmark
+ *
+ * https://yoursite/rbmark?f=&title=&url=&private=&remote_return=
+ *
+ * This can be called via either GET or POST, use POST for long body content as suhosin often limits GET parameter length
+ *
+ * f= placeholder, often required
+ * title= link text
+ * url= URL to bookmark
+ * ischat=1 if this bookmark is a chatroom
+ * private= Don't share this link
+ * remote_return= absolute URL to return after posting is finished
+ *
+ */
+
+
+class Rbmark extends \Zotlabs\Web\Controller {
+
+ function post() {
+ if($_POST['submit'] !== t('Save'))
+ return;
+
+ logger('rbmark_post: ' . print_r($_REQUEST,true));
+
+ $channel = \App::get_channel();
+
+ $t = array('url' => escape_tags($_REQUEST['url']),'term' => escape_tags($_REQUEST['title']));
+ bookmark_add($channel,$channel,$t,((x($_REQUEST,'private')) ? intval($_REQUEST['private']) : 0),
+ array('menu_id' => ((x($_REQUEST,'menu_id')) ? intval($_REQUEST['menu_id']) : 0),
+ 'menu_name' => ((x($_REQUEST,'menu_name')) ? escape_tags($_REQUEST['menu_name']) : ''),
+ 'ischat' => ((x($_REQUEST['ischat'])) ? intval($_REQUEST['ischat']) : 0)
+ ));
+
+ goaway(z_root() . '/bookmarks');
+
+ }
+
+
+ function get() {
+
+ $o = '';
+
+ if(! local_channel()) {
+
+ // The login procedure is going to bugger our $_REQUEST variables
+ // so save them in the session.
+
+ if(array_key_exists('url',$_REQUEST)) {
+ $_SESSION['bookmark'] = $_REQUEST;
+ }
+ return login();
+ }
+
+ // If we have saved rbmark session variables, but nothing in the current $_REQUEST, recover the saved variables
+
+ if((! array_key_exists('url',$_REQUEST)) && (array_key_exists('bookmark',$_SESSION))) {
+ $_REQUEST = $_SESSION['bookmark'];
+ unset($_SESSION['bookmark']);
+ }
+
+ if($_REQUEST['remote_return']) {
+ $_SESSION['remote_return'] = $_REQUEST['remote_return'];
+ }
+ if(argc() > 1 && argv(1) === 'return') {
+ if($_SESSION['remote_return'])
+ goaway($_SESSION['remote_return']);
+ goaway(z_root() . '/bookmarks');
+ }
+
+ $channel = \App::get_channel();
+
+
+ $m = menu_list($channel['channel_id'],'',MENU_BOOKMARK);
+
+ $menus = array();
+ if($m) {
+ $menus = array(0 => '');
+ foreach($m as $n) {
+ $menus[$n['menu_id']] = $n['menu_name'];
+ }
+ }
+ $menu_select = array('menu_id',t('Select a bookmark folder'),false,'',$menus);
+
+
+ $o .= replace_macros(get_markup_template('rbmark.tpl'), array(
+
+ '$header' => t('Save Bookmark'),
+ '$url' => array('url',t('URL of bookmark'),escape_tags($_REQUEST['url'])),
+ '$title' => array('title',t('Description'),escape_tags($_REQUEST['title'])),
+ '$ischat' => ((x($_REQUEST,'ischat')) ? intval($_REQUEST['ischat']) : 0),
+ '$private' => ((x($_REQUEST,'private')) ? intval($_REQUEST['private']) : 0),
+ '$submit' => t('Save'),
+ '$menu_name' => array('menu_name',t('Or enter new bookmark folder name'),'',''),
+ '$menus' => $menu_select
+
+ ));
+
+
+
+
+
+
+ return $o;
+
+ }
+
+
+
+}
diff --git a/Zotlabs/Module/Regdir.php b/Zotlabs/Module/Regdir.php
new file mode 100644
index 000000000..65f8daf67
--- /dev/null
+++ b/Zotlabs/Module/Regdir.php
@@ -0,0 +1,109 @@
+<?php
+namespace Zotlabs\Module;
+
+/**
+ * With args, register a directory server for this realm.
+ * With no args, return a JSON array of directory servers for this realm.
+ *
+ * @FIXME Not yet implemented: Some realms may require authentication to join their realm.
+ * The RED_GLOBAL realm does not require authentication.
+ * We would then need a flag in the site table to indicate that they've been
+ * validated by the PRIMARY directory for that realm. Sites claiming to be PRIMARY
+ * but are not the realm PRIMARY will be marked invalid.
+ *
+ * @param App &$a
+ */
+
+class Regdir extends \Zotlabs\Web\Controller {
+
+ function init() {
+
+ $result = array('success' => false);
+
+ $url = $_REQUEST['url'];
+ $access_token = $_REQUEST['t'];
+ $valid = 0;
+
+ // we probably don't need the realm as we will find out in the probe.
+ // What we may want to die is throw an error if you're trying to register in a different realm
+ // so this configuration issue can be discovered.
+
+ $realm = $_REQUEST['realm'];
+ if(! $realm)
+ $realm = DIRECTORY_REALM;
+
+ if($realm === DIRECTORY_REALM) {
+ $valid = 1;
+ } else {
+ $token = get_config('system','realm_token');
+ if($token && $access_token != $token) {
+ $result['message'] = 'This realm requires an access token';
+ return;
+ }
+ $valid = 1;
+ }
+
+ $dirmode = intval(get_config('system','directory_mode'));
+
+ if ($dirmode == DIRECTORY_MODE_NORMAL) {
+ $ret['message'] = t('This site is not a directory server');
+ json_return_and_die($ret);
+ }
+
+ $m = null;
+ if ($url) {
+ $m = parse_url($url);
+
+ if ((! $m) || ((! @dns_get_record($m['host'], DNS_A + DNS_CNAME + DNS_PTR)) && (! filter_var($m['host'], FILTER_VALIDATE_IP) ))) {
+
+ $result['message'] = 'unparseable url';
+ json_return_and_die($result);
+ }
+
+ $f = zot_finger('[system]@' . $m['host']);
+ if($f['success']) {
+ $j = json_decode($f['body'],true);
+ if($j['success'] && $j['guid']) {
+ $x = import_xchan($j);
+ if($x['success']) {
+ $result['success'] = true;
+ }
+ }
+ }
+
+ if(! $result['success'])
+ $valid = 0;
+
+ q("update site set site_valid = %d where site_url = '%s' limit 1",
+ intval($valid),
+ strtolower($url)
+ );
+
+ json_return_and_die($result);
+ } else {
+
+ // We can put this in the sql without the condition after 31 august 2015 assuming
+ // most directory servers will have updated by then
+ // This just makes sure it happens if I forget
+
+ $sql_extra = ((datetime_convert() > datetime_convert('UTC','UTC','2015-08-31')) ? ' and site_valid = 1 ' : '' );
+ if ($dirmode == DIRECTORY_MODE_STANDALONE) {
+ $r = array(array('site_url' => z_root()));
+ } else {
+ $r = q("select site_url from site where site_flags in ( 1, 2 ) and site_realm = '%s' and site_type = %d $sql_extra ",
+ dbesc(get_directory_realm()),
+ intval(SITE_TYPE_ZOT)
+ );
+ }
+ if ($r) {
+ $result['success'] = true;
+ $result['directories'] = array();
+ foreach ($r as $rr)
+ $result['directories'][] = $rr['site_url'];
+
+ json_return_and_die($result);
+ }
+ }
+ json_return_and_die($result);
+ }
+}
diff --git a/Zotlabs/Module/Register.php b/Zotlabs/Module/Register.php
new file mode 100644
index 000000000..ca3f33238
--- /dev/null
+++ b/Zotlabs/Module/Register.php
@@ -0,0 +1,270 @@
+<?php
+namespace Zotlabs\Module;
+
+require_once('include/identity.php');
+
+
+class Register extends \Zotlabs\Web\Controller {
+
+ function init() {
+
+ $result = null;
+ $cmd = ((argc() > 1) ? argv(1) : '');
+
+ // Provide a stored request for somebody desiring a connection
+ // when they first need to register someplace. Once they've
+ // created a channel, we'll try to revive the connection request
+ // and process it.
+
+ if($_REQUEST['connect'])
+ $_SESSION['connect'] = $_REQUEST['connect'];
+
+ switch($cmd) {
+ case 'invite_check.json':
+ $result = check_account_invite($_REQUEST['invite_code']);
+ break;
+ case 'email_check.json':
+ $result = check_account_email($_REQUEST['email']);
+ break;
+ case 'password_check.json':
+ $result = check_account_password($_REQUEST['password']);
+ break;
+ default:
+ break;
+ }
+ if($result) {
+ json_return_and_die($result);
+ }
+ }
+
+
+ function post() {
+
+ $max_dailies = intval(get_config('system','max_daily_registrations'));
+ if($max_dailies) {
+ $r = q("select count(account_id) as total from account where account_created > %s - INTERVAL %s",
+ db_utcnow(), db_quoteinterval('1 day')
+ );
+ if($r && $r[0]['total'] >= $max_dailies) {
+ notice( t('Maximum daily site registrations exceeded. Please try again tomorrow.') . EOL);
+ return;
+ }
+ }
+
+ if(! x($_POST,'tos')) {
+ notice( t('Please indicate acceptance of the Terms of Service. Registration failed.') . EOL);
+ return;
+ }
+
+ $policy = get_config('system','register_policy');
+
+ $email_verify = get_config('system','verify_email');
+
+
+ switch($policy) {
+
+ case REGISTER_OPEN:
+ $flags = ACCOUNT_OK;
+ break;
+
+ case REGISTER_APPROVE:
+ $flags = ACCOUNT_BLOCKED | ACCOUNT_PENDING;
+ break;
+
+ default:
+ case REGISTER_CLOSED:
+ if(! is_site_admin()) {
+ notice( t('Permission denied.') . EOL );
+ return;
+ }
+ $flags = ACCOUNT_BLOCKED;
+ break;
+ }
+
+ if($email_verify && $policy == REGISTER_OPEN)
+ $flags = $flags | ACCOUNT_UNVERIFIED;
+
+
+ if((! $_POST['password']) || ($_POST['password'] !== $_POST['password2'])) {
+ notice( t('Passwords do not match.') . EOL);
+ return;
+ }
+
+ $arr = $_POST;
+ $arr['account_flags'] = $flags;
+
+ $result = create_account($arr);
+
+ if(! $result['success']) {
+ notice($result['message']);
+ return;
+ }
+ require_once('include/security.php');
+
+
+ if($_REQUEST['name'])
+ set_aconfig($result['account']['account_id'],'register','channel_name',$_REQUEST['name']);
+ if($_REQUEST['nickname'])
+ set_aconfig($result['account']['account_id'],'register','channel_address',$_REQUEST['nickname']);
+ if($_REQUEST['permissions_role'])
+ set_aconfig($result['account']['account_id'],'register','permissions_role',$_REQUEST['permissions_role']);
+
+
+ $using_invites = intval(get_config('system','invitation_only'));
+ $num_invites = intval(get_config('system','number_invites'));
+ $invite_code = ((x($_POST,'invite_code')) ? notags(trim($_POST['invite_code'])) : '');
+
+ if($using_invites && $invite_code) {
+ q("delete * from register where hash = '%s'", dbesc($invite_code));
+ // @FIXME - this also needs to be considered when using 'invites_remaining' in mod/invite.php
+ set_aconfig($result['account']['account_id'],'system','invites_remaining',$num_invites);
+ }
+
+ if($policy == REGISTER_OPEN ) {
+ if($email_verify) {
+ $res = verify_email_address($result);
+ }
+ else {
+ $res = send_register_success_email($result['email'],$result['password']);
+ }
+ if($res) {
+ info( t('Registration successful. Please check your email for validation instructions.') . EOL ) ;
+ }
+ }
+ elseif($policy == REGISTER_APPROVE) {
+ $res = send_reg_approval_email($result);
+ if($res) {
+ info( t('Your registration is pending approval by the site owner.') . EOL ) ;
+ }
+ else {
+ notice( t('Your registration can not be processed.') . EOL);
+ }
+ goaway(z_root());
+ }
+
+ if($email_verify) {
+ goaway(z_root());
+ }
+
+ authenticate_success($result['account'],true,false,true);
+
+ $new_channel = false;
+ $next_page = 'new_channel';
+
+ if(get_config('system','auto_channel_create') || UNO) {
+ $new_channel = auto_channel_create($result['account']['account_id']);
+ if($new_channel['success']) {
+ $channel_id = $new_channel['channel']['channel_id'];
+ change_channel($channel_id);
+ $next_page = '~';
+ }
+ else
+ $new_channel = false;
+ }
+
+ $x = get_config('system','workflow_register_next');
+ if($x) {
+ $next_page = $x;
+ $_SESSION['workflow'] = true;
+ }
+
+ goaway(z_root() . '/' . $next_page);
+
+ }
+
+
+
+ function get() {
+
+ $registration_is = '';
+ $other_sites = '';
+
+ if(get_config('system','register_policy') == REGISTER_CLOSED) {
+ if(get_config('system','directory_mode') == DIRECTORY_MODE_STANDALONE) {
+ notice( t('Registration on this hub is disabled.') . EOL);
+ return;
+ }
+
+ $mod = new Pubsites();
+ return $mod->get();
+ }
+
+ if(get_config('system','register_policy') == REGISTER_APPROVE) {
+ $registration_is = t('Registration on this hub is by approval only.');
+ $other_sites = t('<a href="pubsites">Register at another affiliated hub.</a>');
+ }
+
+ $max_dailies = intval(get_config('system','max_daily_registrations'));
+ if($max_dailies) {
+ $r = q("select count(account_id) as total from account where account_created > %s - INTERVAL %s",
+ db_utcnow(), db_quoteinterval('1 day')
+ );
+ if($r && $r[0]['total'] >= $max_dailies) {
+ logger('max daily registrations exceeded.');
+ notice( t('This site has exceeded the number of allowed daily account registrations. Please try again tomorrow.') . EOL);
+ return;
+ }
+ }
+
+ // Configurable terms of service link
+
+ $tosurl = get_config('system','tos_url');
+ if(! $tosurl)
+ $tosurl = z_root() . '/help/TermsOfService';
+
+ $toslink = '<a href="' . $tosurl . '" target="_blank">' . t('Terms of Service') . '</a>';
+
+ // Configurable whether to restrict age or not - default is based on international legal requirements
+ // This can be relaxed if you are on a restricted server that does not share with public servers
+
+ if(get_config('system','no_age_restriction'))
+ $label_tos = sprintf( t('I accept the %s for this website'), $toslink);
+ else
+ $label_tos = sprintf( t('I am over 13 years of age and accept the %s for this website'), $toslink);
+
+ $enable_tos = 1 - intval(get_config('system','no_termsofservice'));
+
+ $email = array('email', t('Your email address'), ((x($_REQUEST,'email')) ? strip_tags(trim($_REQUEST['email'])) : ""));
+ $password = array('password', t('Choose a password'), ((x($_REQUEST,'password')) ? trim($_REQUEST['password']) : ""));
+ $password2 = array('password2', t('Please re-enter your password'), ((x($_REQUEST,'password2')) ? trim($_REQUEST['password2']) : ""));
+ $invite_code = array('invite_code', t('Please enter your invitation code'), ((x($_REQUEST,'invite_code')) ? strip_tags(trim($_REQUEST['invite_code'])) : ""));
+ $name = array('name', t('Name or caption'), ((x($_REQUEST,'name')) ? $_REQUEST['name'] : ''), t('Examples: "Bob Jameson", "Lisa and her Horses", "Soccer", "Aviation Group"'));
+ $nickhub = '@' . str_replace(array('http://','https://','/'), '', get_config('system','baseurl'));
+ $nickname = array('nickname', t('Choose a short nickname'), ((x($_REQUEST,'nickname')) ? $_REQUEST['nickname'] : ''), sprintf( t('Your nickname will be used to create an easy to remember channel address e.g. nickname%s'), $nickhub));
+ $privacy_role = ((x($_REQUEST,'permissions_role')) ? $_REQUEST['permissions_role'] : "");
+ $role = array('permissions_role' , t('Channel role and privacy'), ($privacy_role) ? $privacy_role : 'social', t('Select a channel role with your privacy requirements.') . ' <a href="help/roles" target="_blank">' . t('Read more about roles') . '</a>',get_roles());
+ $tos = array('tos', $label_tos, '', '', array(t('no'),t('yes')));
+
+ $auto_create = ((UNO) || (get_config('system','auto_channel_create')) ? true : false);
+ $default_role = ((UNO) ? 'social' : get_config('system','default_permissions_role'));
+
+ require_once('include/bbcode.php');
+
+ $o = replace_macros(get_markup_template('register.tpl'), array(
+
+ '$title' => t('Registration'),
+ '$reg_is' => $registration_is,
+ '$registertext' => bbcode(get_config('system','register_text')),
+ '$other_sites' => $other_sites,
+ '$invitations' => get_config('system','invitation_only'),
+ '$invite_desc' => t('Membership on this site is by invitation only.'),
+ '$invite_code' => $invite_code,
+ '$auto_create' => $auto_create,
+ '$name' => $name,
+ '$role' => $role,
+ '$default_role' => $default_role,
+ '$nickname' => $nickname,
+ '$enable_tos' => $enable_tos,
+ '$tos' => $tos,
+ '$email' => $email,
+ '$pass1' => $password,
+ '$pass2' => $password2,
+ '$submit' => ((UNO || $auto_create || $registration_is) ? t('Register') : t('Proceed to create your first channel'))
+ ));
+
+ return $o;
+
+ }
+
+
+}
diff --git a/Zotlabs/Module/Regmod.php b/Zotlabs/Module/Regmod.php
new file mode 100644
index 000000000..c7e5c44aa
--- /dev/null
+++ b/Zotlabs/Module/Regmod.php
@@ -0,0 +1,40 @@
+<?php
+namespace Zotlabs\Module;
+
+
+
+class Regmod extends \Zotlabs\Web\Controller {
+
+ function get() {
+
+ global $lang;
+
+ $_SESSION['return_url'] = \App::$cmd;
+
+ if(! local_channel()) {
+ info( t('Please login.') . EOL);
+ $o .= '<br /><br />' . login((\App::$config['system']['register_policy'] == REGISTER_CLOSED) ? 0 : 1);
+ return $o;
+ }
+
+ if(! is_site_admin()) {
+ notice( t('Permission denied.') . EOL);
+ return '';
+ }
+
+ if(argc() != 3)
+ killme();
+
+ $cmd = argv(1);
+ $hash = argv(2);
+
+ if($cmd === 'deny') {
+ if (! account_deny($hash)) killme();
+ }
+
+ if($cmd === 'allow') {
+ if (! account_allow($hash)) killme();
+ }
+ }
+
+}
diff --git a/Zotlabs/Module/Regver.php b/Zotlabs/Module/Regver.php
new file mode 100644
index 000000000..82b162f56
--- /dev/null
+++ b/Zotlabs/Module/Regver.php
@@ -0,0 +1,28 @@
+<?php
+namespace Zotlabs\Module;
+
+
+class Regver extends \Zotlabs\Web\Controller {
+
+ function get() {
+
+ global $lang;
+
+ $_SESSION['return_url'] = \App::$cmd;
+
+ if(argc() != 3)
+ killme();
+
+ $cmd = argv(1);
+ $hash = argv(2);
+
+ if($cmd === 'deny') {
+ if (! account_deny($hash)) killme();
+ }
+
+ if($cmd === 'allow') {
+ if (! account_approve($hash)) killme();
+ }
+ }
+
+}
diff --git a/Zotlabs/Module/Removeaccount.php b/Zotlabs/Module/Removeaccount.php
new file mode 100644
index 000000000..da496dfad
--- /dev/null
+++ b/Zotlabs/Module/Removeaccount.php
@@ -0,0 +1,72 @@
+<?php
+namespace Zotlabs\Module;
+
+
+class Removeaccount extends \Zotlabs\Web\Controller {
+
+ function post() {
+
+ if(! local_channel())
+ return;
+
+ if($_SESSION['delegate'])
+ return;
+
+ if((! x($_POST,'qxz_password')) || (! strlen(trim($_POST['qxz_password']))))
+ return;
+
+ if((! x($_POST,'verify')) || (! strlen(trim($_POST['verify']))))
+ return;
+
+ if($_POST['verify'] !== $_SESSION['remove_account_verify'])
+ return;
+
+
+ $account = \App::get_account();
+ $account_id = get_account_id();
+
+ if(! account_verify_password($account['account_email'],$_POST['qxz_password']))
+ return;
+
+ if($account['account_password_changed'] != NULL_DATE) {
+ $d1 = datetime_convert('UTC','UTC','now - 48 hours');
+ if($account['account_password_changed'] > d1) {
+ notice( t('Account removals are not allowed within 48 hours of changing the account password.') . EOL);
+ return;
+ }
+ }
+
+ require_once('include/Contact.php');
+
+ $global_remove = intval($_POST['global']);
+
+ account_remove($account_id,true);
+
+ }
+
+
+
+ function get() {
+
+ if(! local_channel())
+ goaway(z_root());
+
+ $hash = random_string();
+
+ $_SESSION['remove_account_verify'] = $hash;
+ $tpl = get_markup_template('removeaccount.tpl');
+ $o .= replace_macros($tpl, array(
+ '$basedir' => z_root(),
+ '$hash' => $hash,
+ '$title' => t('Remove This Account'),
+ '$desc' => array(t('WARNING: '), t('This account and all its channels will be completely removed from the network. '), t('This action is permanent and can not be undone!')),
+ '$passwd' => t('Please enter your password for verification:'),
+ '$global' => array('global', t('Remove this account, all its channels and all its channel clones from the network'), false, t('By default only the instances of the channels located on this hub will be removed from the network')),
+ '$submit' => t('Remove Account')
+ ));
+
+ return $o;
+
+ }
+
+}
diff --git a/Zotlabs/Module/Removeme.php b/Zotlabs/Module/Removeme.php
new file mode 100644
index 000000000..9b634672a
--- /dev/null
+++ b/Zotlabs/Module/Removeme.php
@@ -0,0 +1,72 @@
+<?php
+namespace Zotlabs\Module;
+
+
+class Removeme extends \Zotlabs\Web\Controller {
+
+ function post() {
+
+ if(! local_channel())
+ return;
+
+ if($_SESSION['delegate'])
+ return;
+
+ if((! x($_POST,'qxz_password')) || (! strlen(trim($_POST['qxz_password']))))
+ return;
+
+ if((! x($_POST,'verify')) || (! strlen(trim($_POST['verify']))))
+ return;
+
+ if($_POST['verify'] !== $_SESSION['remove_account_verify'])
+ return;
+
+
+ $account = \App::get_account();
+
+ if(! account_verify_password($account['account_email'],$_POST['qxz_password']))
+ return;
+
+ if($account['account_password_changed'] != NULL_DATE) {
+ $d1 = datetime_convert('UTC','UTC','now - 48 hours');
+ if($account['account_password_changed'] > d1) {
+ notice( t('Channel removals are not allowed within 48 hours of changing the account password.') . EOL);
+ return;
+ }
+ }
+
+ require_once('include/Contact.php');
+
+ $global_remove = intval($_POST['global']);
+
+ channel_remove(local_channel(),1 - $global_remove,true);
+
+ }
+
+
+
+ function get() {
+
+ if(! local_channel())
+ goaway(z_root());
+
+ $hash = random_string();
+
+ $_SESSION['remove_account_verify'] = $hash;
+
+ $tpl = get_markup_template('removeme.tpl');
+ $o .= replace_macros($tpl, array(
+ '$basedir' => z_root(),
+ '$hash' => $hash,
+ '$title' => t('Remove This Channel'),
+ '$desc' => array(t('WARNING: '), t('This channel will be completely removed from the network. '), t('This action is permanent and can not be undone!')),
+ '$passwd' => t('Please enter your password for verification:'),
+ '$global' => array('global', t('Remove this channel and all its clones from the network'), false, t('By default only the instance of the channel located on this hub will be removed from the network'), array(t('No'),t('Yes'))),
+ '$submit' => t('Remove Channel')
+ ));
+
+ return $o;
+
+ }
+
+}
diff --git a/Zotlabs/Module/Rmagic.php b/Zotlabs/Module/Rmagic.php
new file mode 100644
index 000000000..bcdbf6c90
--- /dev/null
+++ b/Zotlabs/Module/Rmagic.php
@@ -0,0 +1,95 @@
+<?php
+namespace Zotlabs\Module;
+
+
+
+class Rmagic extends \Zotlabs\Web\Controller {
+
+ function init() {
+
+ if(local_channel())
+ goaway(z_root());
+
+ $me = get_my_address();
+ if($me) {
+ $r = q("select hubloc_url from hubloc where hubloc_addr = '%s' limit 1",
+ dbesc($me)
+ );
+ if($r) {
+ if($r[0]['hubloc_url'] === z_root())
+ goaway(z_root() . '/login');
+ $dest = z_root() . '/' . str_replace('zid=','zid_=',\App::$query_string);
+ goaway($r[0]['hubloc_url'] . '/magic' . '?f=&dest=' . $dest);
+ }
+ }
+ }
+
+ function post() {
+
+ $address = trim($_REQUEST['address']);
+
+ if(strpos($address,'@') === false) {
+ $arr = array('address' => $address);
+ call_hooks('reverse_magic_auth', $arr);
+
+ try {
+ require_once('library/openid/openid.php');
+ $openid = new LightOpenID(z_root());
+ $openid->identity = $address;
+ $openid->returnUrl = z_root() . '/openid';
+ $openid->required = array('namePerson/friendly', 'namePerson');
+ $openid->optional = array('namePerson/first','media/image/aspect11','media/image/default');
+ goaway($openid->authUrl());
+ } catch (Exception $e) {
+ notice( t('We encountered a problem while logging in with the OpenID you provided. Please check the correct spelling of the ID.').'<br /><br >'. t('The error message was:').' '.$e->getMessage());
+ }
+
+ // if they're still here...
+ notice( t('Authentication failed.') . EOL);
+ return;
+ }
+ else {
+
+ // Presumed Red identity. Perform reverse magic auth
+
+ if(strpos($address,'@') === false) {
+ notice('Invalid address.');
+ return;
+ }
+
+ $r = null;
+ if($address) {
+ $r = q("select hubloc_url from hubloc where hubloc_addr = '%s' limit 1",
+ dbesc($address)
+ );
+ }
+ if($r) {
+ $url = $r[0]['hubloc_url'];
+ }
+ else {
+ $url = 'https://' . substr($address,strpos($address,'@')+1);
+ }
+
+ if($url) {
+ if($_SESSION['return_url'])
+ $dest = urlencode(z_root() . '/' . str_replace('zid=','zid_=',$_SESSION['return_url']));
+ else
+ $dest = urlencode(z_root() . '/' . str_replace('zid=','zid_=',\App::$query_string));
+
+ goaway($url . '/magic' . '?f=&dest=' . $dest);
+ }
+ }
+ }
+
+
+ function get() {
+
+ $o = replace_macros(get_markup_template('rmagic.tpl'),array(
+ '$title' => t('Remote Authentication'),
+ '$desc' => t('Enter your channel address (e.g. channel@example.com)'),
+ '$submit' => t('Authenticate')
+ ));
+ return $o;
+
+ }
+}
diff --git a/Zotlabs/Module/Rpost.php b/Zotlabs/Module/Rpost.php
new file mode 100644
index 000000000..195949e1c
--- /dev/null
+++ b/Zotlabs/Module/Rpost.php
@@ -0,0 +1,144 @@
+<?php
+namespace Zotlabs\Module; /** @file */
+
+require_once('include/acl_selectors.php');
+require_once('include/crypto.php');
+require_once('include/items.php');
+require_once('include/taxonomy.php');
+require_once('include/conversation.php');
+require_once('include/zot.php');
+
+/**
+ * remote post
+ *
+ * https://yoursite/rpost?f=&title=&body=&remote_return=
+ *
+ * This can be called via either GET or POST, use POST for long body content as suhosin often limits GET parameter length
+ *
+ * f= placeholder, often required
+ * title= Title of post
+ * body= Body of post
+ * url= URL which will be parsed and the results appended to the body
+ * source= Source application
+ * remote_return= absolute URL to return after posting is finished
+ * type= choices are 'html' or 'bbcode', default is 'bbcode'
+ *
+ */
+
+
+
+
+class Rpost extends \Zotlabs\Web\Controller {
+
+ function get() {
+
+ $o = '';
+
+ if(! local_channel()) {
+ if(remote_channel()) {
+ // redirect to your own site.
+ // We can only do this with a GET request so you'll need to keep the text short or risk getting truncated
+ // by the wretched beast called 'suhosin'. All the browsers now allow long GET requests, but suhosin
+ // blocks them.
+
+ $url = get_rpost_path(\App::get_observer());
+ // make sure we're not looping to our own hub
+ if(($url) && (! stristr($url, \App::get_hostname()))) {
+ foreach($_REQUEST as $key => $arg) {
+ $url .= '&' . $key . '=' . $arg;
+ }
+ goaway($url);
+ }
+ }
+
+ // The login procedure is going to bugger our $_REQUEST variables
+ // so save them in the session.
+
+ if(array_key_exists('body',$_REQUEST)) {
+ $_SESSION['rpost'] = $_REQUEST;
+ }
+ return login();
+ }
+
+ // If we have saved rpost session variables, but nothing in the current $_REQUEST, recover the saved variables
+
+ if((! array_key_exists('body',$_REQUEST)) && (array_key_exists('rpost',$_SESSION))) {
+ $_REQUEST = $_SESSION['rpost'];
+ unset($_SESSION['rpost']);
+ }
+
+ if(array_key_exists('channel',$_REQUEST)) {
+ $r = q("select channel_id from channel where channel_account_id = %d and channel_address = '%s' limit 1",
+ intval(get_account_id()),
+ dbesc($_REQUEST['channel'])
+ );
+ if($r) {
+ require_once('include/security.php');
+ $change = change_channel($r[0]['channel_id']);
+ }
+ }
+
+ if($_REQUEST['remote_return']) {
+ $_SESSION['remote_return'] = $_REQUEST['remote_return'];
+ }
+ if(argc() > 1 && argv(1) === 'return') {
+ if($_SESSION['remote_return'])
+ goaway($_SESSION['remote_return']);
+ goaway(z_root() . '/network');
+ }
+
+ $plaintext = true;
+ // if(feature_enabled(local_channel(),'richtext'))
+ // $plaintext = false;
+
+ if(array_key_exists('type', $_REQUEST) && $_REQUEST['type'] === 'html') {
+ require_once('include/html2bbcode.php');
+ $_REQUEST['body'] = html2bbcode($_REQUEST['body']);
+ }
+
+ $channel = \App::get_channel();
+
+
+ $acl = new \Zotlabs\Access\AccessList($channel);
+
+ $channel_acl = $acl->get();
+
+ if($_REQUEST['url']) {
+ $x = z_fetch_url(z_root() . '/linkinfo?f=&url=' . urlencode($_REQUEST['url']));
+ if($x['success'])
+ $_REQUEST['body'] = $_REQUEST['body'] . $x['body'];
+ }
+
+ $x = array(
+ 'is_owner' => true,
+ 'allow_location' => ((intval(get_pconfig($channel['channel_id'],'system','use_browser_location'))) ? '1' : ''),
+ 'default_location' => $channel['channel_location'],
+ 'nickname' => $channel['channel_address'],
+ 'lockstate' => (($acl->is_private()) ? 'lock' : 'unlock'),
+ 'acl' => populate_acl($channel_acl,true,(($channel['channel_r_stream'] & PERMS_PUBLIC) ? t('Public') : '')),
+ 'bang' => '',
+ 'visitor' => true,
+ 'profile_uid' => local_channel(),
+ 'title' => $_REQUEST['title'],
+ 'body' => $_REQUEST['body'],
+ 'attachment' => $_REQUEST['attachment'],
+ 'source' => ((x($_REQUEST,'source')) ? strip_tags($_REQUEST['source']) : ''),
+ 'return_path' => 'rpost/return',
+ 'bbco_autocomplete' => 'bbcode',
+ 'bbcode' => true
+ );
+
+ $editor = status_editor($a,$x);
+
+ $o .= replace_macros(get_markup_template('edpost_head.tpl'), array(
+ '$title' => t('Edit post'),
+ '$editor' => $editor
+ ));
+
+ return $o;
+
+ }
+
+
+
+}
diff --git a/Zotlabs/Module/Rsd_xml.php b/Zotlabs/Module/Rsd_xml.php
new file mode 100644
index 000000000..06af39ad1
--- /dev/null
+++ b/Zotlabs/Module/Rsd_xml.php
@@ -0,0 +1,17 @@
+<?php
+namespace Zotlabs\Module;
+
+class Rsd_xml extends \Zotlabs\Web\Controller {
+
+ function init() {
+ header ("Content-Type: text/xml");
+ echo replace_macros(get_markup_template('rsd.tpl'),array(
+ '$project' => \Zotlabs\Project\System::get_platform_name(),
+ '$baseurl' => z_root(),
+ '$apipath' => z_root() . '/api/'
+ ));
+ killme();
+ }
+
+}
+
diff --git a/Zotlabs/Module/Search.php b/Zotlabs/Module/Search.php
new file mode 100644
index 000000000..9941ebbd2
--- /dev/null
+++ b/Zotlabs/Module/Search.php
@@ -0,0 +1,228 @@
+<?php
+namespace Zotlabs\Module;
+
+
+class Search extends \Zotlabs\Web\Controller {
+
+ function init() {
+ if(x($_REQUEST,'search'))
+ \App::$data['search'] = $_REQUEST['search'];
+ }
+
+
+ function get($update = 0, $load = false) {
+
+ if((get_config('system','block_public')) || (get_config('system','block_public_search'))) {
+ if ((! local_channel()) && (! remote_channel())) {
+ notice( t('Public access denied.') . EOL);
+ return;
+ }
+ }
+
+ if($load)
+ $_SESSION['loadtime'] = datetime_convert();
+
+ nav_set_selected('search');
+
+ require_once("include/bbcode.php");
+ require_once('include/security.php');
+ require_once('include/conversation.php');
+ require_once('include/items.php');
+
+ $format = (($_REQUEST['format']) ? $_REQUEST['format'] : '');
+ if($format !== '') {
+ $update = $load = 1;
+ }
+
+ $observer = \App::get_observer();
+ $observer_hash = (($observer) ? $observer['xchan_hash'] : '');
+
+ $o = '<div id="live-search"></div>' . "\r\n";
+
+ $o = '<div class="generic-content-wrapper-styled">' . "\r\n";
+
+ $o .= '<h3>' . t('Search') . '</h3>';
+
+ if(x(\App::$data,'search'))
+ $search = trim(\App::$data['search']);
+ else
+ $search = ((x($_GET,'search')) ? trim(rawurldecode($_GET['search'])) : '');
+
+ $tag = false;
+ if(x($_GET,'tag')) {
+ $tag = true;
+ $search = ((x($_GET,'tag')) ? trim(rawurldecode($_GET['tag'])) : '');
+ }
+
+ if((! local_channel()) || (! feature_enabled(local_channel(),'savedsearch')))
+ $o .= search($search,'search-box','/search',((local_channel()) ? true : false));
+
+ if(strpos($search,'#') === 0) {
+ $tag = true;
+ $search = substr($search,1);
+ }
+ if(strpos($search,'@') === 0) {
+ $search = substr($search,1);
+ goaway(z_root() . '/directory' . '?f=1&navsearch=1&search=' . $search);
+ }
+ if(strpos($search,'?') === 0) {
+ $search = substr($search,1);
+ goaway(z_root() . '/help' . '?f=1&navsearch=1&search=' . $search);
+ }
+
+ // look for a naked webbie
+ if(strpos($search,'@') !== false) {
+ goaway(z_root() . '/directory' . '?f=1&navsearch=1&search=' . $search);
+ }
+
+ if(! $search)
+ return $o;
+
+ if($tag) {
+ $sql_extra = sprintf(" AND `item`.`id` IN (select `oid` from term where otype = %d and type in ( %d , %d) and term = '%s') ",
+ intval(TERM_OBJ_POST),
+ intval(TERM_HASHTAG),
+ intval(TERM_COMMUNITYTAG),
+ dbesc(protect_sprintf($search))
+ );
+ }
+ else {
+ $regstr = db_getfunc('REGEXP');
+ $sql_extra = sprintf(" AND `item`.`body` $regstr '%s' ", dbesc(protect_sprintf(preg_quote($search))));
+ }
+
+ // Here is the way permissions work in the search module...
+ // Only public posts can be shown
+ // OR your own posts if you are a logged in member
+ // No items will be shown if the member has a blocked profile wall.
+
+ if((! $update) && (! $load)) {
+
+ // This is ugly, but we can't pass the profile_uid through the session to the ajax updater,
+ // because browser prefetching might change it on us. We have to deliver it with the page.
+
+ $o .= '<div id="live-search"></div>' . "\r\n";
+ $o .= "<script> var profile_uid = " . ((intval(local_channel())) ? local_channel() : (-1))
+ . "; var netargs = '?f='; var profile_page = " . \App::$pager['page'] . "; </script>\r\n";
+
+ \App::$page['htmlhead'] .= replace_macros(get_markup_template("build_query.tpl"),array(
+ '$baseurl' => z_root(),
+ '$pgtype' => 'search',
+ '$uid' => ((\App::$profile['profile_uid']) ? \App::$profile['profile_uid'] : '0'),
+ '$gid' => '0',
+ '$cid' => '0',
+ '$cmin' => '0',
+ '$cmax' => '0',
+ '$star' => '0',
+ '$liked' => '0',
+ '$conv' => '0',
+ '$spam' => '0',
+ '$fh' => '0',
+ '$nouveau' => '0',
+ '$wall' => '0',
+ '$list' => ((x($_REQUEST,'list')) ? intval($_REQUEST['list']) : 0),
+ '$page' => ((\App::$pager['page'] != 1) ? \App::$pager['page'] : 1),
+ '$search' => (($tag) ? urlencode('#') : '') . $search,
+ '$order' => '',
+ '$file' => '',
+ '$cats' => '',
+ '$tags' => '',
+ '$mid' => '',
+ '$verb' => '',
+ '$dend' => '',
+ '$dbegin' => ''
+ ));
+
+
+ }
+
+ $item_normal = item_normal();
+ $pub_sql = public_permissions_sql($observer_hash);
+
+ require_once('include/identity.php');
+
+ $sys = get_sys_channel();
+
+ if(($update) && ($load)) {
+ $itemspage = get_pconfig(local_channel(),'system','itemspage');
+ \App::set_pager_itemspage(((intval($itemspage)) ? $itemspage : 20));
+ $pager_sql = sprintf(" LIMIT %d OFFSET %d ", intval(\App::$pager['itemspage']), intval(\App::$pager['start']));
+
+ // in case somebody turned off public access to sys channel content with permissions
+
+ if(! perm_is_allowed($sys['channel_id'],$observer_hash,'view_stream'))
+ $sys['xchan_hash'] .= 'disabled';
+
+ if($load) {
+ $r = null;
+
+ if(ACTIVE_DBTYPE == DBTYPE_POSTGRES) {
+ $prefix = 'distinct on (created, mid)';
+ $suffix = 'ORDER BY created DESC, mid';
+ } else {
+ $prefix = 'distinct';
+ $suffix = 'group by mid ORDER BY created DESC';
+ }
+ if(local_channel()) {
+ $r = q("SELECT $prefix mid, item.id as item_id, item.* from item
+ WHERE ((( `item`.`allow_cid` = '' AND `item`.`allow_gid` = '' AND `item`.`deny_cid` = '' AND `item`.`deny_gid` = '' AND item_private = 0 )
+ OR ( `item`.`uid` = %d )) OR item.owner_xchan = '%s' )
+ $item_normal
+ $sql_extra
+ $suffix $pager_sql ",
+ intval(local_channel()),
+ dbesc($sys['xchan_hash'])
+ );
+ }
+ if($r === null) {
+ $r = q("SELECT $prefix mid, item.id as item_id, item.* from item
+ WHERE (((( `item`.`allow_cid` = '' AND `item`.`allow_gid` = '' AND `item`.`deny_cid` = ''
+ AND `item`.`deny_gid` = '' AND item_private = 0 )
+ and owner_xchan in ( " . stream_perms_xchans(($observer) ? (PERMS_NETWORK|PERMS_PUBLIC) : PERMS_PUBLIC) . " ))
+ $pub_sql ) OR owner_xchan = '%s')
+ $item_normal
+ $sql_extra
+ $suffix $pager_sql",
+ dbesc($sys['xchan_hash'])
+ );
+ }
+ }
+ else {
+ $r = array();
+ }
+ }
+
+ if($r) {
+ xchan_query($r);
+ $items = fetch_post_tags($r,true);
+ } else {
+ $items = array();
+ }
+
+
+ if($format == 'json') {
+ $result = array();
+ require_once('include/conversation.php');
+ foreach($items as $item) {
+ $item['html'] = bbcode($item['body']);
+ $x = encode_item($item);
+ $x['html'] = prepare_text($item['body'],$item['mimetype']);
+ $result[] = $x;
+ }
+ json_return_and_die(array('success' => true,'messages' => $result));
+ }
+
+ if($tag)
+ $o .= '<h2>' . sprintf( t('Items tagged with: %s'),htmlspecialchars($search, ENT_COMPAT,'UTF-8')) . '</h2>';
+ else
+ $o .= '<h2>' . sprintf( t('Search results for: %s'),htmlspecialchars($search, ENT_COMPAT,'UTF-8')) . '</h2>';
+
+ $o .= conversation($a,$items,'search',$update,'client');
+
+ $o .= '</div>';
+
+ return $o;
+ }
+
+
+}
diff --git a/Zotlabs/Module/Search_ac.php b/Zotlabs/Module/Search_ac.php
new file mode 100644
index 000000000..78bcf374d
--- /dev/null
+++ b/Zotlabs/Module/Search_ac.php
@@ -0,0 +1,82 @@
+<?php
+namespace Zotlabs\Module;
+
+// Autocomplete for saved searches. Should probably be put in the same place as the other autocompletes
+
+class Search_ac extends \Zotlabs\Web\Controller {
+
+ function init(){
+ if(!local_channel())
+ killme();
+
+
+ $start = (x($_REQUEST,'start')?$_REQUEST['start']:0);
+ $count = (x($_REQUEST,'count')?$_REQUEST['count']:100);
+ $search = (x($_REQUEST,'search')?$_REQUEST['search']:"");
+
+ if(x($_REQUEST,'query') && strlen($_REQUEST['query'])) {
+ $search = $_REQUEST['query'];
+ }
+
+ // Priority to people searches
+
+ if ($search) {
+ $people_sql_extra = protect_sprintf(" AND `xchan_name` LIKE '%". dbesc($search) . "%' ");
+ $tag_sql_extra = protect_sprintf(" AND term LIKE '%". dbesc($search) . "%' ");
+ }
+
+
+ $r = q("SELECT `abook_id`, `xchan_name`, `xchan_photo_s`, `xchan_url`, `xchan_addr` FROM `abook` left join xchan on abook_xchan = xchan_hash WHERE abook_channel = %d
+ $people_sql_extra
+ ORDER BY `xchan_name` ASC ",
+ intval(local_channel())
+ );
+
+ $results = array();
+ if($r) {
+ foreach($r as $g) {
+ $results[] = array(
+ "photo" => $g['xchan_photo_s'],
+ "name" => '@'.$g['xchan_name'],
+ "id" => $g['abook_id'],
+ "link" => $g['xchan_url'],
+ "label" => '',
+ "nick" => '',
+ );
+ }
+ }
+
+ $r = q("select distinct term, tid, url from term where type in ( %d, %d ) $tag_sql_extra group by term order by term asc",
+ intval(TERM_HASHTAG),
+ intval(TERM_COMMUNITYTAG)
+ );
+
+ if(count($r)) {
+ foreach($r as $g) {
+ $results[] = array(
+ "photo" => z_root() . '/images/hashtag.png',
+ "name" => '#'.$g['term'],
+ "id" => $g['tid'],
+ "link" => $g['url'],
+ "label" => '',
+ "nick" => '',
+ );
+ }
+ }
+
+ header("content-type: application/json");
+ $o = array(
+ 'start' => $start,
+ 'count' => $count,
+ 'items' => $results,
+ );
+ echo json_encode($o);
+
+ logger('search_ac: ' . print_r($x,true));
+
+ killme();
+ }
+
+
+
+}
diff --git a/Zotlabs/Module/Service_limits.php b/Zotlabs/Module/Service_limits.php
new file mode 100644
index 000000000..2a1f78054
--- /dev/null
+++ b/Zotlabs/Module/Service_limits.php
@@ -0,0 +1,28 @@
+<?php
+namespace Zotlabs\Module; /** @file */
+
+
+
+class Service_limits extends \Zotlabs\Web\Controller {
+
+ function get() {
+
+ if(! local_channel()) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ $account = \App::get_account();
+ if($account['account_service_class']) {
+ $x = get_config('service_class',$account['account_service_class']);
+ if($x) {
+ $o = print_r($x,true);
+ return $o;
+ }
+ }
+ return t('No service class restrictions found.');
+ }
+
+
+
+}
diff --git a/Zotlabs/Module/Settings.php b/Zotlabs/Module/Settings.php
new file mode 100644
index 000000000..413648c4d
--- /dev/null
+++ b/Zotlabs/Module/Settings.php
@@ -0,0 +1,1150 @@
+<?php
+namespace Zotlabs\Module; /** @file */
+
+require_once('include/zot.php');
+
+
+class Settings extends \Zotlabs\Web\Controller {
+
+ function init() {
+ if(! local_channel())
+ return;
+
+ if($_SESSION['delegate'])
+ return;
+
+ \App::$profile_uid = local_channel();
+
+ // default is channel settings in the absence of other arguments
+
+ if(argc() == 1) {
+ // We are setting these values - don't use the argc(), argv() functions here
+ \App::$argc = 2;
+ \App::$argv[] = 'channel';
+ }
+
+
+
+ }
+
+
+ function post() {
+
+ if(! local_channel())
+ return;
+
+ if($_SESSION['delegate'])
+ return;
+
+ $channel = \App::get_channel();
+
+ logger('mod_settings: ' . print_r($_REQUEST,true));
+
+
+ if((argc() > 1) && (argv(1) === 'oauth') && x($_POST,'remove')){
+ check_form_security_token_redirectOnErr('/settings/oauth', 'settings_oauth');
+
+ $key = $_POST['remove'];
+ q("DELETE FROM tokens WHERE id='%s' AND uid=%d",
+ dbesc($key),
+ local_channel());
+ goaway(z_root()."/settings/oauth/");
+ return;
+ }
+
+ if((argc() > 2) && (argv(1) === 'oauth') && (argv(2) === 'edit'||(argv(2) === 'add')) && x($_POST,'submit')) {
+
+ check_form_security_token_redirectOnErr('/settings/oauth', 'settings_oauth');
+
+ $name = ((x($_POST,'name')) ? $_POST['name'] : '');
+ $key = ((x($_POST,'key')) ? $_POST['key'] : '');
+ $secret = ((x($_POST,'secret')) ? $_POST['secret'] : '');
+ $redirect = ((x($_POST,'redirect')) ? $_POST['redirect'] : '');
+ $icon = ((x($_POST,'icon')) ? $_POST['icon'] : '');
+ $ok = true;
+ if($name == '') {
+ $ok = false;
+ notice( t('Name is required') . EOL);
+ }
+ if($key == '' || $secret == '') {
+ $ok = false;
+ notice( t('Key and Secret are required') . EOL);
+ }
+
+ if($ok) {
+ if ($_POST['submit']==t("Update")){
+ $r = q("UPDATE clients SET
+ client_id='%s',
+ pw='%s',
+ name='%s',
+ redirect_uri='%s',
+ icon='%s',
+ uid=%d
+ WHERE client_id='%s'",
+ dbesc($key),
+ dbesc($secret),
+ dbesc($name),
+ dbesc($redirect),
+ dbesc($icon),
+ intval(local_channel()),
+ dbesc($key));
+ } else {
+ $r = q("INSERT INTO clients (client_id, pw, name, redirect_uri, icon, uid)
+ VALUES ('%s','%s','%s','%s','%s',%d)",
+ dbesc($key),
+ dbesc($secret),
+ dbesc($name),
+ dbesc($redirect),
+ dbesc($icon),
+ intval(local_channel())
+ );
+ $r = q("INSERT INTO xperm (xp_client, xp_channel, xp_perm) VALUES ('%s', %d, '%s') ",
+ dbesc($key),
+ intval(local_channel()),
+ dbesc('all')
+ );
+ }
+ }
+ goaway(z_root()."/settings/oauth/");
+ return;
+ }
+
+ if((argc() > 1) && (argv(1) == 'featured')) {
+ check_form_security_token_redirectOnErr('/settings/featured', 'settings_featured');
+
+ call_hooks('feature_settings_post', $_POST);
+
+ build_sync_packet();
+ return;
+ }
+
+
+
+ if((argc() > 1) && (argv(1) === 'features')) {
+ check_form_security_token_redirectOnErr('/settings/features', 'settings_features');
+
+ // Build list of features and check which are set
+ $features = get_features();
+ $all_features = array();
+ foreach($features as $k => $v) {
+ foreach($v as $f)
+ $all_features[] = $f[0];
+ }
+ foreach($all_features as $k) {
+ if(x($_POST,"feature_$k"))
+ set_pconfig(local_channel(),'feature',$k, 1);
+ else
+ set_pconfig(local_channel(),'feature',$k, 0);
+ }
+ build_sync_packet();
+ return;
+ }
+
+ if((argc() > 1) && (argv(1) == 'display')) {
+
+ check_form_security_token_redirectOnErr('/settings/display', 'settings_display');
+
+ $theme = ((x($_POST,'theme')) ? notags(trim($_POST['theme'])) : \App::$channel['channel_theme']);
+ $mobile_theme = ((x($_POST,'mobile_theme')) ? notags(trim($_POST['mobile_theme'])) : '');
+ $preload_images = ((x($_POST,'preload_images')) ? intval($_POST['preload_images']) : 0);
+ $user_scalable = ((x($_POST,'user_scalable')) ? intval($_POST['user_scalable']) : 0);
+ $nosmile = ((x($_POST,'nosmile')) ? intval($_POST['nosmile']) : 0);
+ $title_tosource = ((x($_POST,'title_tosource')) ? intval($_POST['title_tosource']) : 0);
+ $channel_list_mode = ((x($_POST,'channel_list_mode')) ? intval($_POST['channel_list_mode']) : 0);
+ $network_list_mode = ((x($_POST,'network_list_mode')) ? intval($_POST['network_list_mode']) : 0);
+
+ $channel_divmore_height = ((x($_POST,'channel_divmore_height')) ? intval($_POST['channel_divmore_height']) : 400);
+ if($channel_divmore_height < 50)
+ $channel_divmore_height = 50;
+ $network_divmore_height = ((x($_POST,'network_divmore_height')) ? intval($_POST['network_divmore_height']) : 400);
+ if($network_divmore_height < 50)
+ $network_divmore_height = 50;
+
+ $browser_update = ((x($_POST,'browser_update')) ? intval($_POST['browser_update']) : 0);
+ $browser_update = $browser_update * 1000;
+ if($browser_update < 10000)
+ $browser_update = 10000;
+
+ $itemspage = ((x($_POST,'itemspage')) ? intval($_POST['itemspage']) : 20);
+ if($itemspage > 100)
+ $itemspage = 100;
+
+
+ if ($mobile_theme == "---")
+ del_pconfig(local_channel(),'system','mobile_theme');
+ else {
+ set_pconfig(local_channel(),'system','mobile_theme',$mobile_theme);
+ }
+
+ set_pconfig(local_channel(),'system','preload_images',$preload_images);
+ set_pconfig(local_channel(),'system','user_scalable',$user_scalable);
+ set_pconfig(local_channel(),'system','update_interval', $browser_update);
+ set_pconfig(local_channel(),'system','itemspage', $itemspage);
+ set_pconfig(local_channel(),'system','no_smilies',1-intval($nosmile));
+ set_pconfig(local_channel(),'system','title_tosource',$title_tosource);
+ set_pconfig(local_channel(),'system','channel_list_mode', $channel_list_mode);
+ set_pconfig(local_channel(),'system','network_list_mode', $network_list_mode);
+ set_pconfig(local_channel(),'system','channel_divmore_height', $channel_divmore_height);
+ set_pconfig(local_channel(),'system','network_divmore_height', $network_divmore_height);
+
+ if ($theme == \App::$channel['channel_theme']){
+ // call theme_post only if theme has not been changed
+ if( ($themeconfigfile = $this->get_theme_config_file($theme)) != null){
+ require_once($themeconfigfile);
+ theme_post($a);
+ }
+ }
+
+ $r = q("UPDATE channel SET channel_theme = '%s' WHERE channel_id = %d",
+ dbesc($theme),
+ intval(local_channel())
+ );
+
+ call_hooks('display_settings_post', $_POST);
+ build_sync_packet();
+ goaway(z_root() . '/settings/display' );
+ return; // NOTREACHED
+ }
+
+
+ if(argc() > 1 && argv(1) === 'account') {
+
+ check_form_security_token_redirectOnErr('/settings/account', 'settings_account');
+
+ call_hooks('account_settings_post', $_POST);
+ // call_hooks('settings_account', $_POST);
+
+ $errs = array();
+
+ $email = ((x($_POST,'email')) ? trim(notags($_POST['email'])) : '');
+ $account = \App::get_account();
+ if($email != $account['account_email']) {
+ if(! valid_email($email))
+ $errs[] = t('Not valid email.');
+ $adm = trim(get_config('system','admin_email'));
+ if(($adm) && (strcasecmp($email,$adm) == 0)) {
+ $errs[] = t('Protected email address. Cannot change to that email.');
+ $email = \App::$user['email'];
+ }
+ if(! $errs) {
+ $r = q("update account set account_email = '%s' where account_id = %d",
+ dbesc($email),
+ intval($account['account_id'])
+ );
+ if(! $r)
+ $errs[] = t('System failure storing new email. Please try again.');
+ }
+ }
+
+ if($errs) {
+ foreach($errs as $err)
+ notice($err . EOL);
+ $errs = array();
+ }
+
+
+ if((x($_POST,'npassword')) || (x($_POST,'confirm'))) {
+
+ $origpass = trim($_POST['origpass']);
+
+ require_once('include/auth.php');
+ if(! account_verify_password($email,$origpass)) {
+ $errs[] = t('Password verification failed.');
+ }
+
+ $newpass = trim($_POST['npassword']);
+ $confirm = trim($_POST['confirm']);
+
+ if($newpass != $confirm ) {
+ $errs[] = t('Passwords do not match. Password unchanged.');
+ }
+
+ if((! x($newpass)) || (! x($confirm))) {
+ $errs[] = t('Empty passwords are not allowed. Password unchanged.');
+ }
+
+ if(! $errs) {
+ $salt = random_string(32);
+ $password_encoded = hash('whirlpool', $salt . $newpass);
+ $r = q("update account set account_salt = '%s', account_password = '%s', account_password_changed = '%s'
+ where account_id = %d",
+ dbesc($salt),
+ dbesc($password_encoded),
+ dbesc(datetime_convert()),
+ intval(get_account_id())
+ );
+ if($r)
+ info( t('Password changed.') . EOL);
+ else
+ $errs[] = t('Password update failed. Please try again.');
+ }
+ }
+
+
+ if($errs) {
+ foreach($errs as $err)
+ notice($err . EOL);
+ }
+ goaway(z_root() . '/settings/account' );
+ }
+
+
+ check_form_security_token_redirectOnErr('/settings', 'settings');
+
+ call_hooks('settings_post', $_POST);
+
+ $set_perms = '';
+
+ $role = ((x($_POST,'permissions_role')) ? notags(trim($_POST['permissions_role'])) : '');
+ $oldrole = get_pconfig(local_channel(),'system','permissions_role');
+
+ if(($role != $oldrole) || ($role === 'custom')) {
+
+ if($role === 'custom') {
+ $hide_presence = (((x($_POST,'hide_presence')) && (intval($_POST['hide_presence']) == 1)) ? 1: 0);
+ $publish = (((x($_POST,'profile_in_directory')) && (intval($_POST['profile_in_directory']) == 1)) ? 1: 0);
+ $def_group = ((x($_POST,'group-selection')) ? notags(trim($_POST['group-selection'])) : '');
+ $r = q("update channel set channel_default_group = '%s' where channel_id = %d",
+ dbesc($def_group),
+ intval(local_channel())
+ );
+
+ $global_perms = get_perms();
+
+ foreach($global_perms as $k => $v) {
+ $set_perms .= ', ' . $v[0] . ' = ' . intval($_POST[$k]) . ' ';
+ }
+ $acl = new \Zotlabs\Access\AccessList($channel);
+ $acl->set_from_array($_POST);
+ $x = $acl->get();
+
+ $r = q("update channel set channel_allow_cid = '%s', channel_allow_gid = '%s',
+ channel_deny_cid = '%s', channel_deny_gid = '%s' where channel_id = %d",
+ dbesc($x['allow_cid']),
+ dbesc($x['allow_gid']),
+ dbesc($x['deny_cid']),
+ dbesc($x['deny_gid']),
+ intval(local_channel())
+ );
+ }
+ else {
+ $role_permissions = get_role_perms($_POST['permissions_role']);
+ if(! $role_permissions) {
+ notice('Permissions category could not be found.');
+ return;
+ }
+ $hide_presence = 1 - (intval($role_permissions['online']));
+ if($role_permissions['default_collection']) {
+ $r = q("select hash from groups where uid = %d and name = '%s' limit 1",
+ intval(local_channel()),
+ dbesc( t('Friends') )
+ );
+ if(! $r) {
+ require_once('include/group.php');
+ group_add(local_channel(), t('Friends'));
+ group_add_member(local_channel(),t('Friends'),$channel['channel_hash']);
+ $r = q("select hash from groups where uid = %d and name = '%s' limit 1",
+ intval(local_channel()),
+ dbesc( t('Friends') )
+ );
+ }
+ if($r) {
+ q("update channel set channel_default_group = '%s', channel_allow_gid = '%s', channel_allow_cid = '', channel_deny_gid = '', channel_deny_cid = '' where channel_id = %d",
+ dbesc($r[0]['hash']),
+ dbesc('<' . $r[0]['hash'] . '>'),
+ intval(local_channel())
+ );
+ }
+ else {
+ notice( sprintf('Default privacy group \'%s\' not found. Please create and re-submit permission change.', t('Friends')) . EOL);
+ return;
+ }
+ }
+ // no default collection
+ else {
+ q("update channel set channel_default_group = '', channel_allow_gid = '', channel_allow_cid = '', channel_deny_gid = '',
+ channel_deny_cid = '' where channel_id = %d",
+ intval(local_channel())
+ );
+ }
+
+ $r = q("update abook set abook_my_perms = %d where abook_channel = %d and abook_self = 1",
+ intval((array_key_exists('perms_accept',$role_permissions)) ? $role_permissions['perms_accept'] : 0),
+ intval(local_channel())
+ );
+ set_pconfig(local_channel(),'system','autoperms',(($role_permissions['perms_auto']) ? intval($role_permissions['perms_accept']) : 0));
+
+ foreach($role_permissions as $p => $v) {
+ if(strpos($p,'channel_') !== false) {
+ $set_perms .= ', ' . $p . ' = ' . intval($v) . ' ';
+ }
+ if($p === 'directory_publish') {
+ $publish = intval($v);
+ }
+ }
+ }
+
+ set_pconfig(local_channel(),'system','hide_online_status',$hide_presence);
+ set_pconfig(local_channel(),'system','permissions_role',$role);
+ }
+
+ $username = ((x($_POST,'username')) ? notags(trim($_POST['username'])) : '');
+ $timezone = ((x($_POST,'timezone_select')) ? notags(trim($_POST['timezone_select'])) : '');
+ $defloc = ((x($_POST,'defloc')) ? notags(trim($_POST['defloc'])) : '');
+ $openid = ((x($_POST,'openid_url')) ? notags(trim($_POST['openid_url'])) : '');
+ $maxreq = ((x($_POST,'maxreq')) ? intval($_POST['maxreq']) : 0);
+ $expire = ((x($_POST,'expire')) ? intval($_POST['expire']) : 0);
+ $evdays = ((x($_POST,'evdays')) ? intval($_POST['evdays']) : 3);
+ $photo_path = ((x($_POST,'photo_path')) ? escape_tags(trim($_POST['photo_path'])) : '');
+ $attach_path = ((x($_POST,'attach_path')) ? escape_tags(trim($_POST['attach_path'])) : '');
+
+ $channel_menu = ((x($_POST['channel_menu'])) ? htmlspecialchars_decode(trim($_POST['channel_menu']),ENT_QUOTES) : '');
+
+ $expire_items = ((x($_POST,'expire_items')) ? intval($_POST['expire_items']) : 0);
+ $expire_starred = ((x($_POST,'expire_starred')) ? intval($_POST['expire_starred']) : 0);
+ $expire_photos = ((x($_POST,'expire_photos'))? intval($_POST['expire_photos']) : 0);
+ $expire_network_only = ((x($_POST,'expire_network_only'))? intval($_POST['expire_network_only']) : 0);
+
+ $allow_location = (((x($_POST,'allow_location')) && (intval($_POST['allow_location']) == 1)) ? 1: 0);
+
+ $blocktags = (((x($_POST,'blocktags')) && (intval($_POST['blocktags']) == 1)) ? 0: 1); // this setting is inverted!
+ $unkmail = (((x($_POST,'unkmail')) && (intval($_POST['unkmail']) == 1)) ? 1: 0);
+ $cntunkmail = ((x($_POST,'cntunkmail')) ? intval($_POST['cntunkmail']) : 0);
+ $suggestme = ((x($_POST,'suggestme')) ? intval($_POST['suggestme']) : 0);
+
+ $post_newfriend = (($_POST['post_newfriend'] == 1) ? 1: 0);
+ $post_joingroup = (($_POST['post_joingroup'] == 1) ? 1: 0);
+ $post_profilechange = (($_POST['post_profilechange'] == 1) ? 1: 0);
+ $adult = (($_POST['adult'] == 1) ? 1 : 0);
+
+ $cal_first_day = (((x($_POST,'first_day')) && (intval($_POST['first_day']) == 1)) ? 1: 0);
+
+ $channel = \App::get_channel();
+ $pageflags = $channel['channel_pageflags'];
+ $existing_adult = (($pageflags & PAGE_ADULT) ? 1 : 0);
+ if($adult != $existing_adult)
+ $pageflags = ($pageflags ^ PAGE_ADULT);
+
+
+ $notify = 0;
+
+ if(x($_POST,'notify1'))
+ $notify += intval($_POST['notify1']);
+ if(x($_POST,'notify2'))
+ $notify += intval($_POST['notify2']);
+ if(x($_POST,'notify3'))
+ $notify += intval($_POST['notify3']);
+ if(x($_POST,'notify4'))
+ $notify += intval($_POST['notify4']);
+ if(x($_POST,'notify5'))
+ $notify += intval($_POST['notify5']);
+ if(x($_POST,'notify6'))
+ $notify += intval($_POST['notify6']);
+ if(x($_POST,'notify7'))
+ $notify += intval($_POST['notify7']);
+ if(x($_POST,'notify8'))
+ $notify += intval($_POST['notify8']);
+
+
+ $vnotify = 0;
+
+ if(x($_POST,'vnotify1'))
+ $vnotify += intval($_POST['vnotify1']);
+ if(x($_POST,'vnotify2'))
+ $vnotify += intval($_POST['vnotify2']);
+ if(x($_POST,'vnotify3'))
+ $vnotify += intval($_POST['vnotify3']);
+ if(x($_POST,'vnotify4'))
+ $vnotify += intval($_POST['vnotify4']);
+ if(x($_POST,'vnotify5'))
+ $vnotify += intval($_POST['vnotify5']);
+ if(x($_POST,'vnotify6'))
+ $vnotify += intval($_POST['vnotify6']);
+ if(x($_POST,'vnotify7'))
+ $vnotify += intval($_POST['vnotify7']);
+ if(x($_POST,'vnotify8'))
+ $vnotify += intval($_POST['vnotify8']);
+ if(x($_POST,'vnotify9'))
+ $vnotify += intval($_POST['vnotify9']);
+ if(x($_POST,'vnotify10'))
+ $vnotify += intval($_POST['vnotify10']);
+ if(x($_POST,'vnotify11'))
+ $vnotify += intval($_POST['vnotify11']);
+
+ $always_show_in_notices = x($_POST,'always_show_in_notices') ? 1 : 0;
+
+ $channel = \App::get_channel();
+
+ $err = '';
+
+ $name_change = false;
+
+ if($username != $channel['channel_name']) {
+ $name_change = true;
+ require_once('include/identity.php');
+ $err = validate_channelname($username);
+ if($err) {
+ notice($err);
+ return;
+ }
+ }
+
+ if($timezone != $channel['channel_timezone']) {
+ if(strlen($timezone))
+ date_default_timezone_set($timezone);
+ }
+
+ set_pconfig(local_channel(),'system','use_browser_location',$allow_location);
+ set_pconfig(local_channel(),'system','suggestme', $suggestme);
+ set_pconfig(local_channel(),'system','post_newfriend', $post_newfriend);
+ set_pconfig(local_channel(),'system','post_joingroup', $post_joingroup);
+ set_pconfig(local_channel(),'system','post_profilechange', $post_profilechange);
+ set_pconfig(local_channel(),'system','blocktags',$blocktags);
+ set_pconfig(local_channel(),'system','channel_menu',$channel_menu);
+ set_pconfig(local_channel(),'system','vnotify',$vnotify);
+ set_pconfig(local_channel(),'system','always_show_in_notices',$always_show_in_notices);
+ set_pconfig(local_channel(),'system','evdays',$evdays);
+ set_pconfig(local_channel(),'system','photo_path',$photo_path);
+ set_pconfig(local_channel(),'system','attach_path',$attach_path);
+ set_pconfig(local_channel(),'system','cal_first_day',$cal_first_day);
+
+ $r = q("update channel set channel_name = '%s', channel_pageflags = %d, channel_timezone = '%s', channel_location = '%s', channel_notifyflags = %d, channel_max_anon_mail = %d, channel_max_friend_req = %d, channel_expire_days = %d $set_perms where channel_id = %d",
+ dbesc($username),
+ intval($pageflags),
+ dbesc($timezone),
+ dbesc($defloc),
+ intval($notify),
+ intval($unkmail),
+ intval($maxreq),
+ intval($expire),
+ intval(local_channel())
+ );
+ if($r)
+ info( t('Settings updated.') . EOL);
+
+ if(! is_null($publish)) {
+ $r = q("UPDATE profile SET publish = %d WHERE is_default = 1 AND uid = %d",
+ intval($publish),
+ intval(local_channel())
+ );
+ }
+
+ if($name_change) {
+ $r = q("update xchan set xchan_name = '%s', xchan_name_date = '%s' where xchan_hash = '%s'",
+ dbesc($username),
+ dbesc(datetime_convert()),
+ dbesc($channel['channel_hash'])
+ );
+ $r = q("update profile set name = '%s' where uid = %d and is_default = 1",
+ dbesc($username),
+ intval($channel['channel_id'])
+ );
+ }
+
+ proc_run('php','include/directory.php',local_channel());
+
+ build_sync_packet();
+
+
+ //$_SESSION['theme'] = $theme;
+ if($email_changed && \App::$config['system']['register_policy'] == REGISTER_VERIFY) {
+
+ // FIXME - set to un-verified, blocked and redirect to logout
+ // Why? Are we verifying people or email addresses?
+
+ }
+
+ goaway(z_root() . '/settings' );
+ return; // NOTREACHED
+ }
+
+
+
+ function get() {
+
+ $o = '';
+ nav_set_selected('settings');
+
+
+ if((! local_channel()) || ($_SESSION['delegate'])) {
+ notice( t('Permission denied.') . EOL );
+ return login();
+ }
+
+
+ $channel = \App::get_channel();
+ if($channel)
+ head_set_icon($channel['xchan_photo_s']);
+
+ $yes_no = array(t('No'),t('Yes'));
+
+ if((argc() > 1) && (argv(1) === 'oauth')) {
+
+ if((argc() > 2) && (argv(2) === 'add')) {
+ $tpl = get_markup_template("settings_oauth_edit.tpl");
+ $o .= replace_macros($tpl, array(
+ '$form_security_token' => get_form_security_token("settings_oauth"),
+ '$title' => t('Add application'),
+ '$submit' => t('Submit'),
+ '$cancel' => t('Cancel'),
+ '$name' => array('name', t('Name'), '', t('Name of application')),
+ '$key' => array('key', t('Consumer Key'), random_string(16), t('Automatically generated - change if desired. Max length 20')),
+ '$secret' => array('secret', t('Consumer Secret'), random_string(16), t('Automatically generated - change if desired. Max length 20')),
+ '$redirect' => array('redirect', t('Redirect'), '', t('Redirect URI - leave blank unless your application specifically requires this')),
+ '$icon' => array('icon', t('Icon url'), '', t('Optional')),
+ ));
+ return $o;
+ }
+
+ if((argc() > 3) && (argv(2) === 'edit')) {
+ $r = q("SELECT * FROM clients WHERE client_id='%s' AND uid=%d",
+ dbesc(argv(3)),
+ local_channel());
+
+ if (!count($r)){
+ notice(t('Application not found.'));
+ return;
+ }
+ $app = $r[0];
+
+ $tpl = get_markup_template("settings_oauth_edit.tpl");
+ $o .= replace_macros($tpl, array(
+ '$form_security_token' => get_form_security_token("settings_oauth"),
+ '$title' => t('Add application'),
+ '$submit' => t('Update'),
+ '$cancel' => t('Cancel'),
+ '$name' => array('name', t('Name'), $app['name'] , ''),
+ '$key' => array('key', t('Consumer Key'), $app['client_id'], ''),
+ '$secret' => array('secret', t('Consumer Secret'), $app['pw'], ''),
+ '$redirect' => array('redirect', t('Redirect'), $app['redirect_uri'], ''),
+ '$icon' => array('icon', t('Icon url'), $app['icon'], ''),
+ ));
+ return $o;
+ }
+
+ if((argc() > 3) && (argv(2) === 'delete')) {
+ check_form_security_token_redirectOnErr('/settings/oauth', 'settings_oauth', 't');
+
+ $r = q("DELETE FROM clients WHERE client_id='%s' AND uid=%d",
+ dbesc(argv(3)),
+ local_channel());
+ goaway(z_root()."/settings/oauth/");
+ return;
+ }
+
+
+ $r = q("SELECT clients.*, tokens.id as oauth_token, (clients.uid=%d) AS my
+ FROM clients
+ LEFT JOIN tokens ON clients.client_id=tokens.client_id
+ WHERE clients.uid IN (%d,0)",
+ local_channel(),
+ local_channel());
+
+
+ $tpl = get_markup_template("settings_oauth.tpl");
+ $o .= replace_macros($tpl, array(
+ '$form_security_token' => get_form_security_token("settings_oauth"),
+ '$baseurl' => z_root(),
+ '$title' => t('Connected Apps'),
+ '$add' => t('Add application'),
+ '$edit' => t('Edit'),
+ '$delete' => t('Delete'),
+ '$consumerkey' => t('Client key starts with'),
+ '$noname' => t('No name'),
+ '$remove' => t('Remove authorization'),
+ '$apps' => $r,
+ ));
+ return $o;
+
+ }
+ if((argc() > 1) && (argv(1) === 'featured')) {
+ $settings_addons = "";
+
+ $o = '';
+
+ $r = q("SELECT * FROM `hook` WHERE `hook` = 'feature_settings' ");
+ if(! $r)
+ $settings_addons = t('No feature settings configured');
+
+ call_hooks('feature_settings', $settings_addons);
+
+ $tpl = get_markup_template("settings_addons.tpl");
+ $o .= replace_macros($tpl, array(
+ '$form_security_token' => get_form_security_token("settings_featured"),
+ '$title' => t('Feature/Addon Settings'),
+ '$settings_addons' => $settings_addons
+ ));
+ return $o;
+ }
+
+
+ /*
+ * ACCOUNT SETTINGS
+ */
+
+
+ if((argc() > 1) && (argv(1) === 'account')) {
+ $account_settings = "";
+
+ call_hooks('account_settings', $account_settings);
+
+ $email = \App::$account['account_email'];
+
+
+ $tpl = get_markup_template("settings_account.tpl");
+ $o .= replace_macros($tpl, array(
+ '$form_security_token' => get_form_security_token("settings_account"),
+ '$title' => t('Account Settings'),
+ '$origpass' => array('origpass', t('Current Password'), ' ',''),
+ '$password1'=> array('npassword', t('Enter New Password'), '', ''),
+ '$password2'=> array('confirm', t('Confirm New Password'), '', t('Leave password fields blank unless changing')),
+ '$submit' => t('Submit'),
+ '$email' => array('email', t('Email Address:'), $email, ''),
+ '$removeme' => t('Remove Account'),
+ '$removeaccount' => t('Remove this account including all its channels'),
+ '$account_settings' => $account_settings
+ ));
+ return $o;
+ }
+
+
+
+ if((argc() > 1) && (argv(1) === 'features')) {
+ $arr = array();
+ $features = get_features();
+
+ foreach($features as $fname => $fdata) {
+ $arr[$fname] = array();
+ $arr[$fname][0] = $fdata[0];
+ foreach(array_slice($fdata,1) as $f) {
+ $arr[$fname][1][] = array('feature_' .$f[0],$f[1],((intval(feature_enabled(local_channel(),$f[0]))) ? "1" : ''),$f[2],array(t('Off'),t('On')));
+ }
+ }
+
+ $tpl = get_markup_template("settings_features.tpl");
+ $o .= replace_macros($tpl, array(
+ '$form_security_token' => get_form_security_token("settings_features"),
+ '$title' => t('Additional Features'),
+ '$features' => $arr,
+ '$submit' => t('Submit'),
+ ));
+
+ return $o;
+ }
+
+
+
+
+
+ if((argc() > 1) && (argv(1) === 'connectors')) {
+
+ $settings_connectors = "";
+
+ call_hooks('connector_settings', $settings_connectors);
+
+ $r = null;
+
+ $tpl = get_markup_template("settings_connectors.tpl");
+
+ $o .= replace_macros($tpl, array(
+ '$form_security_token' => get_form_security_token("settings_connectors"),
+ '$title' => t('Connector Settings'),
+ '$submit' => t('Submit'),
+ '$settings_connectors' => $settings_connectors
+ ));
+
+ call_hooks('display_settings', $o);
+ return $o;
+ }
+
+ /*
+ * DISPLAY SETTINGS
+ */
+
+ if((argc() > 1) && (argv(1) === 'display')) {
+ $default_theme = get_config('system','theme');
+ if(! $default_theme)
+ $default_theme = 'default';
+ $default_mobile_theme = get_config('system','mobile_theme');
+ if(! $mobile_default_theme)
+ $mobile_default_theme = 'none';
+
+ $allowed_themes_str = get_config('system','allowed_themes');
+ $allowed_themes_raw = explode(',',$allowed_themes_str);
+ $allowed_themes = array();
+ if(count($allowed_themes_raw))
+ foreach($allowed_themes_raw as $x)
+ if(strlen(trim($x)) && is_dir("view/theme/$x"))
+ $allowed_themes[] = trim($x);
+
+
+ $themes = array();
+ $files = glob('view/theme/*');
+ if($allowed_themes) {
+ foreach($allowed_themes as $th) {
+ $f = $th;
+ $is_experimental = file_exists('view/theme/' . $th . '/experimental');
+ $unsupported = file_exists('view/theme/' . $th . '/unsupported');
+ $is_mobile = file_exists('view/theme/' . $th . '/mobile');
+ $is_library = file_exists('view/theme/'. $th . '/library');
+ $mobile_themes["---"] = t("No special theme for mobile devices");
+
+ if (!$is_experimental or ($is_experimental && (get_config('experimentals','exp_themes')==1 or get_config('experimentals','exp_themes')===false))){
+ $theme_name = (($is_experimental) ? sprintf(t('%s - (Experimental)'), $f) : $f);
+ if (! $is_library) {
+ if($is_mobile) {
+ $mobile_themes[$f] = $themes[$f] = $theme_name . ' (' . t('mobile') . ')';
+ }
+ else {
+ $mobile_themes[$f] = $themes[$f] = $theme_name;
+ }
+ }
+ }
+
+ }
+ }
+ $theme_selected = (!x($_SESSION,'theme')? $default_theme : $_SESSION['theme']);
+ $mobile_theme_selected = (!x($_SESSION,'mobile_theme')? $default_mobile_theme : $_SESSION['mobile_theme']);
+
+ $preload_images = get_pconfig(local_channel(),'system','preload_images');
+ $preload_images = (($preload_images===false)? '0': $preload_images); // default if not set: 0
+
+ $user_scalable = get_pconfig(local_channel(),'system','user_scalable');
+ $user_scalable = (($user_scalable===false)? '1': $user_scalable); // default if not set: 1
+
+ $browser_update = intval(get_pconfig(local_channel(), 'system','update_interval'));
+ $browser_update = (($browser_update == 0) ? 80 : $browser_update / 1000); // default if not set: 40 seconds
+
+ $itemspage = intval(get_pconfig(local_channel(), 'system','itemspage'));
+ $itemspage = (($itemspage > 0 && $itemspage < 101) ? $itemspage : 20); // default if not set: 20 items
+
+ $nosmile = get_pconfig(local_channel(),'system','no_smilies');
+ $nosmile = (($nosmile===false)? '0': $nosmile); // default if not set: 0
+
+ $title_tosource = get_pconfig(local_channel(),'system','title_tosource');
+ $title_tosource = (($title_tosource===false)? '0': $title_tosource); // default if not set: 0
+
+ $theme_config = "";
+ if( ($themeconfigfile = $this->get_theme_config_file($theme_selected)) != null){
+ require_once($themeconfigfile);
+ $theme_config = theme_content($a);
+ }
+
+ $tpl = get_markup_template("settings_display.tpl");
+ $o = replace_macros($tpl, array(
+ '$ptitle' => t('Display Settings'),
+ '$d_tset' => t('Theme Settings'),
+ '$d_ctset' => t('Custom Theme Settings'),
+ '$d_cset' => t('Content Settings'),
+ '$form_security_token' => get_form_security_token("settings_display"),
+ '$submit' => t('Submit'),
+ '$baseurl' => z_root(),
+ '$uid' => local_channel(),
+
+ '$theme' => (($themes) ? array('theme', t('Display Theme:'), $theme_selected, '', $themes, 'preview') : false),
+ '$mobile_theme' => (($mobile_themes) ? array('mobile_theme', t('Mobile Theme:'), $mobile_theme_selected, '', $mobile_themes, '') : false),
+ '$preload_images' => array('preload_images', t("Preload images before rendering the page"), $preload_images, t("The subjective page load time will be longer but the page will be ready when displayed"), $yes_no),
+ '$user_scalable' => array('user_scalable', t("Enable user zoom on mobile devices"), $user_scalable, '', $yes_no),
+ '$ajaxint' => array('browser_update', t("Update browser every xx seconds"), $browser_update, t('Minimum of 10 seconds, no maximum')),
+ '$itemspage' => array('itemspage', t("Maximum number of conversations to load at any time:"), $itemspage, t('Maximum of 100 items')),
+ '$nosmile' => array('nosmile', t("Show emoticons (smilies) as images"), 1-intval($nosmile), '', $yes_no),
+ '$title_tosource' => array('title_tosource', t("Link post titles to source"), $title_tosource, '', $yes_no),
+ '$layout_editor' => t('System Page Layout Editor - (advanced)'),
+ '$theme_config' => $theme_config,
+ '$expert' => feature_enabled(local_channel(),'expert'),
+ '$channel_list_mode' => array('channel_list_mode', t('Use blog/list mode on channel page'), get_pconfig(local_channel(),'system','channel_list_mode'), t('(comments displayed separately)'), $yes_no),
+ '$network_list_mode' => array('network_list_mode', t('Use blog/list mode on grid page'), get_pconfig(local_channel(),'system','network_list_mode'), t('(comments displayed separately)'), $yes_no),
+ '$channel_divmore_height' => array('channel_divmore_height', t('Channel page max height of content (in pixels)'), ((get_pconfig(local_channel(),'system','channel_divmore_height')) ? get_pconfig(local_channel(),'system','channel_divmore_height') : 400), t('click to expand content exceeding this height')),
+ '$network_divmore_height' => array('network_divmore_height', t('Grid page max height of content (in pixels)'), ((get_pconfig(local_channel(),'system','network_divmore_height')) ? get_pconfig(local_channel(),'system','network_divmore_height') : 400) , t('click to expand content exceeding this height')),
+
+
+ ));
+
+ return $o;
+ }
+
+
+
+
+
+ if(argv(1) === 'channel') {
+
+ require_once('include/acl_selectors.php');
+ require_once('include/permissions.php');
+
+
+ $p = q("SELECT * FROM `profile` WHERE `is_default` = 1 AND `uid` = %d LIMIT 1",
+ intval(local_channel())
+ );
+ if(count($p))
+ $profile = $p[0];
+
+ load_pconfig(local_channel(),'expire');
+
+ $channel = \App::get_channel();
+
+
+ $global_perms = get_perms();
+
+ $permiss = array();
+
+ $perm_opts = array(
+ array( t('Nobody except yourself'), 0),
+ array( t('Only those you specifically allow'), PERMS_SPECIFIC),
+ array( t('Approved connections'), PERMS_CONTACTS),
+ array( t('Any connections'), PERMS_PENDING),
+ array( t('Anybody on this website'), PERMS_SITE),
+ array( t('Anybody in this network'), PERMS_NETWORK),
+ array( t('Anybody authenticated'), PERMS_AUTHED),
+ array( t('Anybody on the internet'), PERMS_PUBLIC)
+ );
+
+
+ foreach($global_perms as $k => $perm) {
+ $options = array();
+ foreach($perm_opts as $opt) {
+ if((! $perm[2]) && $opt[1] == PERMS_PUBLIC)
+ continue;
+ $options[$opt[1]] = $opt[0];
+ }
+ $permiss[] = array($k,$perm[3],$channel[$perm[0]],$perm[4],$options);
+ }
+
+
+ // logger('permiss: ' . print_r($permiss,true));
+
+
+
+ $username = $channel['channel_name'];
+ $nickname = $channel['channel_address'];
+ $timezone = $channel['channel_timezone'];
+ $notify = $channel['channel_notifyflags'];
+ $defloc = $channel['channel_location'];
+
+ $maxreq = $channel['channel_max_friend_req'];
+ $expire = $channel['channel_expire_days'];
+ $adult_flag = intval($channel['channel_pageflags'] & PAGE_ADULT);
+ $sys_expire = get_config('system','default_expire_days');
+
+ // $unkmail = \App::$user['unkmail'];
+ // $cntunkmail = \App::$user['cntunkmail'];
+
+ $hide_presence = intval(get_pconfig(local_channel(), 'system','hide_online_status'));
+
+
+ $expire_items = get_pconfig(local_channel(), 'expire','items');
+ $expire_items = (($expire_items===false)? '1' : $expire_items); // default if not set: 1
+
+ $expire_notes = get_pconfig(local_channel(), 'expire','notes');
+ $expire_notes = (($expire_notes===false)? '1' : $expire_notes); // default if not set: 1
+
+ $expire_starred = get_pconfig(local_channel(), 'expire','starred');
+ $expire_starred = (($expire_starred===false)? '1' : $expire_starred); // default if not set: 1
+
+ $expire_photos = get_pconfig(local_channel(), 'expire','photos');
+ $expire_photos = (($expire_photos===false)? '0' : $expire_photos); // default if not set: 0
+
+ $expire_network_only = get_pconfig(local_channel(), 'expire','network_only');
+ $expire_network_only = (($expire_network_only===false)? '0' : $expire_network_only); // default if not set: 0
+
+
+ $suggestme = get_pconfig(local_channel(), 'system','suggestme');
+ $suggestme = (($suggestme===false)? '0': $suggestme); // default if not set: 0
+
+ $post_newfriend = get_pconfig(local_channel(), 'system','post_newfriend');
+ $post_newfriend = (($post_newfriend===false)? '0': $post_newfriend); // default if not set: 0
+
+ $post_joingroup = get_pconfig(local_channel(), 'system','post_joingroup');
+ $post_joingroup = (($post_joingroup===false)? '0': $post_joingroup); // default if not set: 0
+
+ $post_profilechange = get_pconfig(local_channel(), 'system','post_profilechange');
+ $post_profilechange = (($post_profilechange===false)? '0': $post_profilechange); // default if not set: 0
+
+ $blocktags = get_pconfig(local_channel(),'system','blocktags');
+ $blocktags = (($blocktags===false) ? '0' : $blocktags);
+
+ $timezone = date_default_timezone_get();
+
+ $opt_tpl = get_markup_template("field_checkbox.tpl");
+ if(get_config('system','publish_all')) {
+ $profile_in_dir = '<input type="hidden" name="profile_in_directory" value="1" />';
+ }
+ else {
+ $profile_in_dir = replace_macros($opt_tpl,array(
+ '$field' => array('profile_in_directory', t('Publish your default profile in the network directory'), $profile['publish'], '', $yes_no),
+ ));
+ }
+
+ $suggestme = replace_macros($opt_tpl,array(
+ '$field' => array('suggestme', t('Allow us to suggest you as a potential friend to new members?'), $suggestme, '', $yes_no),
+
+ ));
+
+ $subdir = ((strlen(\App::get_path())) ? '<br />' . t('or') . ' ' . z_root() . '/channel/' . $nickname : '');
+
+ $tpl_addr = get_markup_template("settings_nick_set.tpl");
+
+ $prof_addr = replace_macros($tpl_addr,array(
+ '$desc' => t('Your channel address is'),
+ '$nickname' => $nickname,
+ '$subdir' => $subdir,
+ '$basepath' => \App::get_hostname()
+ ));
+
+ $stpl = get_markup_template('settings.tpl');
+
+ $acl = new \Zotlabs\Access\AccessList($channel);
+ $perm_defaults = $acl->get();
+
+ require_once('include/group.php');
+ $group_select = mini_group_select(local_channel(),$channel['channel_default_group']);
+
+ require_once('include/menu.php');
+ $m1 = menu_list(local_channel());
+ $menu = false;
+ if($m1) {
+ $menu = array();
+ $current = get_pconfig(local_channel(),'system','channel_menu');
+ $menu[] = array('name' => '', 'selected' => ((! $current) ? true : false));
+ foreach($m1 as $m) {
+ $menu[] = array('name' => htmlspecialchars($m['menu_name'],ENT_COMPAT,'UTF-8'), 'selected' => (($m['menu_name'] === $current) ? ' selected="selected" ' : false));
+ }
+ }
+
+ $evdays = get_pconfig(local_channel(),'system','evdays');
+ if(! $evdays)
+ $evdays = 3;
+
+ $permissions_role = get_pconfig(local_channel(),'system','permissions_role');
+ if(! $permissions_role)
+ $permissions_role = 'custom';
+
+ $permissions_set = (($permissions_role != 'custom') ? true : false);
+
+ $vnotify = get_pconfig(local_channel(),'system','vnotify');
+ $always_show_in_notices = get_pconfig(local_channel(),'system','always_show_in_notices');
+ if($vnotify === false)
+ $vnotify = (-1);
+
+ $o .= replace_macros($stpl,array(
+ '$ptitle' => t('Channel Settings'),
+
+ '$submit' => t('Submit'),
+ '$baseurl' => z_root(),
+ '$uid' => local_channel(),
+ '$form_security_token' => get_form_security_token("settings"),
+ '$nickname_block' => $prof_addr,
+ '$h_basic' => t('Basic Settings'),
+ '$username' => array('username', t('Full Name:'), $username,''),
+ '$email' => array('email', t('Email Address:'), $email, ''),
+ '$timezone' => array('timezone_select' , t('Your Timezone:'), $timezone, '', get_timezones()),
+ '$defloc' => array('defloc', t('Default Post Location:'), $defloc, t('Geographical location to display on your posts')),
+ '$allowloc' => array('allow_location', t('Use Browser Location:'), ((get_pconfig(local_channel(),'system','use_browser_location')) ? 1 : ''), '', $yes_no),
+
+ '$adult' => array('adult', t('Adult Content'), $adult_flag, t('This channel frequently or regularly publishes adult content. (Please tag any adult material and/or nudity with #NSFW)'), $yes_no),
+
+ '$h_prv' => t('Security and Privacy Settings'),
+ '$permissions_set' => $permissions_set,
+ '$server_role' => \Zotlabs\Project\System::get_server_role(),
+ '$perms_set_msg' => t('Your permissions are already configured. Click to view/adjust'),
+
+ '$hide_presence' => array('hide_presence', t('Hide my online presence'),$hide_presence, t('Prevents displaying in your profile that you are online'), $yes_no),
+
+ '$lbl_pmacro' => t('Simple Privacy Settings:'),
+ '$pmacro3' => t('Very Public - <em>extremely permissive (should be used with caution)</em>'),
+ '$pmacro2' => t('Typical - <em>default public, privacy when desired (similar to social network permissions but with improved privacy)</em>'),
+ '$pmacro1' => t('Private - <em>default private, never open or public</em>'),
+ '$pmacro0' => t('Blocked - <em>default blocked to/from everybody</em>'),
+ '$permiss_arr' => $permiss,
+ '$blocktags' => array('blocktags',t('Allow others to tag your posts'), 1-$blocktags, t('Often used by the community to retro-actively flag inappropriate content'), $yes_no),
+
+ '$lbl_p2macro' => t('Advanced Privacy Settings'),
+
+ '$expire' => array('expire',t('Expire other channel content after this many days'),$expire,sprintf( t('0 or blank to use the website limit. The website expires after %d days.'),intval($sys_expire))),
+ '$maxreq' => array('maxreq', t('Maximum Friend Requests/Day:'), intval($channel['channel_max_friend_req']) , t('May reduce spam activity')),
+ '$permissions' => t('Default Post Permissions'),
+ '$permdesc' => t("\x28click to open/close\x29"),
+ '$aclselect' => populate_acl($perm_defaults,false),
+ '$suggestme' => $suggestme,
+ '$group_select' => $group_select,
+ '$role' => array('permissions_role' , t('Channel permissions category:'), $permissions_role, '', get_roles()),
+
+ '$profile_in_dir' => $profile_in_dir,
+ '$hide_friends' => $hide_friends,
+ '$hide_wall' => $hide_wall,
+ '$unkmail' => $unkmail,
+ '$cntunkmail' => array('cntunkmail', t('Maximum private messages per day from unknown people:'), intval($channel['channel_max_anon_mail']) ,t("Useful to reduce spamming")),
+
+
+ '$h_not' => t('Notification Settings'),
+ '$activity_options' => t('By default post a status message when:'),
+ '$post_newfriend' => array('post_newfriend', t('accepting a friend request'), $post_newfriend, '', $yes_no),
+ '$post_joingroup' => array('post_joingroup', t('joining a forum/community'), $post_joingroup, '', $yes_no),
+ '$post_profilechange' => array('post_profilechange', t('making an <em>interesting</em> profile change'), $post_profilechange, '', $yes_no),
+ '$lbl_not' => t('Send a notification email when:'),
+ '$notify1' => array('notify1', t('You receive a connection request'), ($notify & NOTIFY_INTRO), NOTIFY_INTRO, '', $yes_no),
+ '$notify2' => array('notify2', t('Your connections are confirmed'), ($notify & NOTIFY_CONFIRM), NOTIFY_CONFIRM, '', $yes_no),
+ '$notify3' => array('notify3', t('Someone writes on your profile wall'), ($notify & NOTIFY_WALL), NOTIFY_WALL, '', $yes_no),
+ '$notify4' => array('notify4', t('Someone writes a followup comment'), ($notify & NOTIFY_COMMENT), NOTIFY_COMMENT, '', $yes_no),
+ '$notify5' => array('notify5', t('You receive a private message'), ($notify & NOTIFY_MAIL), NOTIFY_MAIL, '', $yes_no),
+ '$notify6' => array('notify6', t('You receive a friend suggestion'), ($notify & NOTIFY_SUGGEST), NOTIFY_SUGGEST, '', $yes_no),
+ '$notify7' => array('notify7', t('You are tagged in a post'), ($notify & NOTIFY_TAGSELF), NOTIFY_TAGSELF, '', $yes_no),
+ '$notify8' => array('notify8', t('You are poked/prodded/etc. in a post'), ($notify & NOTIFY_POKE), NOTIFY_POKE, '', $yes_no),
+
+
+ '$lbl_vnot' => t('Show visual notifications including:'),
+
+ '$vnotify1' => array('vnotify1', t('Unseen grid activity'), ($vnotify & VNOTIFY_NETWORK), VNOTIFY_NETWORK, '', $yes_no),
+ '$vnotify2' => array('vnotify2', t('Unseen channel activity'), ($vnotify & VNOTIFY_CHANNEL), VNOTIFY_CHANNEL, '', $yes_no),
+ '$vnotify3' => array('vnotify3', t('Unseen private messages'), ($vnotify & VNOTIFY_MAIL), VNOTIFY_MAIL, t('Recommended'), $yes_no),
+ '$vnotify4' => array('vnotify4', t('Upcoming events'), ($vnotify & VNOTIFY_EVENT), VNOTIFY_EVENT, '', $yes_no),
+ '$vnotify5' => array('vnotify5', t('Events today'), ($vnotify & VNOTIFY_EVENTTODAY), VNOTIFY_EVENTTODAY, '', $yes_no),
+ '$vnotify6' => array('vnotify6', t('Upcoming birthdays'), ($vnotify & VNOTIFY_BIRTHDAY), VNOTIFY_BIRTHDAY, t('Not available in all themes'), $yes_no),
+ '$vnotify7' => array('vnotify7', t('System (personal) notifications'), ($vnotify & VNOTIFY_SYSTEM), VNOTIFY_SYSTEM, '', $yes_no),
+ '$vnotify8' => array('vnotify8', t('System info messages'), ($vnotify & VNOTIFY_INFO), VNOTIFY_INFO, t('Recommended'), $yes_no),
+ '$vnotify9' => array('vnotify9', t('System critical alerts'), ($vnotify & VNOTIFY_ALERT), VNOTIFY_ALERT, t('Recommended'), $yes_no),
+ '$vnotify10' => array('vnotify10', t('New connections'), ($vnotify & VNOTIFY_INTRO), VNOTIFY_INTRO, t('Recommended'), $yes_no),
+ '$vnotify11' => array('vnotify11', t('System Registrations'), ($vnotify & VNOTIFY_REGISTER), VNOTIFY_REGISTER, '', $yes_no),
+ '$always_show_in_notices' => array('always_show_in_notices', t('Also show new wall posts, private messages and connections under Notices'), $always_show_in_notices, 1, '', $yes_no),
+
+ '$evdays' => array('evdays', t('Notify me of events this many days in advance'), $evdays, t('Must be greater than 0')),
+
+ '$h_advn' => t('Advanced Account/Page Type Settings'),
+ '$h_descadvn' => t('Change the behaviour of this account for special situations'),
+ '$pagetype' => $pagetype,
+ '$expert' => feature_enabled(local_channel(),'expert'),
+ '$hint' => t('Please enable expert mode (in <a href="settings/features">Settings > Additional features</a>) to adjust!'),
+ '$lbl_misc' => t('Miscellaneous Settings'),
+ '$photo_path' => array('photo_path', t('Default photo upload folder'), get_pconfig(local_channel(),'system','photo_path'), t('%Y - current year, %m - current month')),
+ '$attach_path' => array('attach_path', t('Default file upload folder'), get_pconfig(local_channel(),'system','attach_path'), t('%Y - current year, %m - current month')),
+ '$menus' => $menu,
+ '$menu_desc' => t('Personal menu to display in your channel pages'),
+ '$removeme' => t('Remove Channel'),
+ '$removechannel' => t('Remove this channel.'),
+ '$firefoxshare' => t('Firefox Share $Projectname provider'),
+ '$cal_first_day' => array('first_day', t('Start calendar week on monday'), ((get_pconfig(local_channel(),'system','cal_first_day')) ? 1 : ''), '', $yes_no),
+ ));
+
+ call_hooks('settings_form',$o);
+
+ $o .= '</form>' . "\r\n";
+
+ return $o;
+ }
+ }
+
+ function get_theme_config_file($theme){
+
+ $base_theme = \App::$theme_info['extends'];
+
+ if (file_exists("view/theme/$theme/php/config.php")){
+ return "view/theme/$theme/php/config.php";
+ }
+ if (file_exists("view/theme/$base_theme/php/config.php")){
+ return "view/theme/$base_theme/php/config.php";
+ }
+ return null;
+ }
+
+
+}
diff --git a/Zotlabs/Module/Setup.php b/Zotlabs/Module/Setup.php
new file mode 100644
index 000000000..3ac67e1c0
--- /dev/null
+++ b/Zotlabs/Module/Setup.php
@@ -0,0 +1,754 @@
+<?php
+namespace Zotlabs\Module;
+/**
+ * @file mod/setup.php
+ *
+ * Controller for the initial setup/installation.
+ *
+ * @todo This setup module could need some love and improvements.
+ */
+
+
+/**
+ * @brief Initialisation for the setup module.
+ *
+ * @param[in,out] App &$a
+ */
+
+class Setup extends \Zotlabs\Web\Controller {
+
+ private static $install_wizard_pass = 1;
+
+
+ function init() {
+
+ // Ensure that if somebody hasn't read the install documentation and doesn't have all
+ // the required modules or has a totally borked shared hosting provider and they can't
+ // figure out what the hell is going on - that we at least spit out an error message which
+ // we can inquire about when they write to tell us that our software doesn't work.
+
+ // The worst thing we can do at this point is throw a white screen of death and rely on
+ // them knowing about servers and php modules and logfiles enough so that we can guess
+ // at the source of the problem. As ugly as it may be, we need to throw a technically worded
+ // PHP error message in their face. Once installation is complete application errors will
+ // throw a white screen because these error messages divulge information which can
+ // potentially be useful to hackers.
+
+ error_reporting(E_ERROR | E_WARNING | E_PARSE );
+ ini_set('log_errors', '0');
+ ini_set('display_errors', '1');
+
+ // $baseurl/setup/testrwrite to test if rewite in .htaccess is working
+ if (argc() == 2 && argv(1) == "testrewrite") {
+ echo 'ok';
+ killme();
+ }
+
+ if (x($_POST, 'pass'))
+ $this->install_wizard_pass = intval($_POST['pass']);
+ else
+ $this->install_wizard_pass = 1;
+
+ }
+
+ /**
+ * @brief Handle the actions of the different setup steps.
+ *
+ * @param[in,out] App &$a
+ */
+ function post() {
+ global $db;
+
+ switch($this->install_wizard_pass) {
+ case 1:
+ case 2:
+ return;
+ break; // just in case return don't return :)
+ case 3:
+ $urlpath = \App::get_path();
+ $dbhost = trim($_POST['dbhost']);
+ $dbport = intval(trim($_POST['dbport']));
+ $dbuser = trim($_POST['dbuser']);
+ $dbpass = trim($_POST['dbpass']);
+ $dbdata = trim($_POST['dbdata']);
+ $dbtype = intval(trim($_POST['dbtype']));
+ $phpath = trim($_POST['phpath']);
+ $adminmail = trim($_POST['adminmail']);
+ $siteurl = trim($_POST['siteurl']);
+ $advanced = ((intval($_POST['advanced'])) ? 1 : 0);
+
+ // $siteurl should not have a trailing slash
+
+ $siteurl = rtrim($siteurl,'/');
+
+ require_once('include/dba/dba_driver.php');
+ unset($db);
+ $db = dba_factory($dbhost, $dbport, $dbuser, $dbpass, $dbdata, $dbtype, true);
+
+ if(! $db->connected) {
+ echo 'Database Connect failed: ' . $db->error;
+ killme();
+ \App::$data['db_conn_failed']=true;
+ }
+ /*if(get_db_errno()) {
+ unset($db);
+ $db = dba_factory($dbhost, $dbport, $dbuser, $dbpass, '', true);
+
+ if(! get_db_errno()) {
+ $r = q("CREATE DATABASE '%s'",
+ dbesc($dbdata)
+ );
+ if($r) {
+ unset($db);
+ $db = new dba($dbhost, $dbport, $dbuser, $dbpass, $dbdata, true);
+ } else {
+ \App::$data['db_create_failed']=true;
+ }
+ } else {
+ \App::$data['db_conn_failed']=true;
+ return;
+ }
+ }*/
+ //if(get_db_errno()) {
+
+ //}
+
+ return;
+ break;
+ case 4:
+ $urlpath = \App::get_path();
+ $dbhost = notags(trim($_POST['dbhost']));
+ $dbport = intval(notags(trim($_POST['dbport'])));
+ $dbuser = notags(trim($_POST['dbuser']));
+ $dbpass = notags(trim($_POST['dbpass']));
+ $dbdata = notags(trim($_POST['dbdata']));
+ $dbtype = intval(notags(trim($_POST['dbtype'])));
+ $phpath = notags(trim($_POST['phpath']));
+ $timezone = notags(trim($_POST['timezone']));
+ $adminmail = notags(trim($_POST['adminmail']));
+ $siteurl = notags(trim($_POST['siteurl']));
+ $advanced = ((intval($_POST['advanced'])) ? 1 : 0);
+
+ if($siteurl != z_root()) {
+ $test = z_fetch_url($siteurl."/setup/testrewrite");
+ if((! $test['success']) || ($test['body'] != 'ok')) {
+ \App::$data['url_fail'] = true;
+ \App::$data['url_error'] = $test['error'];
+ return;
+ }
+ }
+
+ // connect to db
+ $db = dba_factory($dbhost, $dbport, $dbuser, $dbpass, $dbdata, $dbtype, true);
+
+ if(! $db->connected) {
+ echo 'CRITICAL: DB not connected.';
+ killme();
+ }
+
+ $tpl = get_intltext_template('htconfig.tpl');
+ $txt = replace_macros($tpl,array(
+ '$dbhost' => $dbhost,
+ '$dbport' => $dbport,
+ '$dbuser' => $dbuser,
+ '$dbpass' => $dbpass,
+ '$dbdata' => $dbdata,
+ '$dbtype' => $dbtype,
+ '$uno' => 1 - $advanced,
+ '$timezone' => $timezone,
+ '$siteurl' => $siteurl,
+ '$site_id' => random_string(),
+ '$phpath' => $phpath,
+ '$adminmail' => $adminmail
+ ));
+
+ $result = file_put_contents('.htconfig.php', $txt);
+ if(! $result) {
+ \App::$data['txt'] = $txt;
+ }
+
+ $errors = $this->load_database($db);
+
+ if($errors)
+ \App::$data['db_failed'] = $errors;
+ else
+ \App::$data['db_installed'] = true;
+
+ return;
+ break;
+ }
+ }
+
+ function get_db_errno() {
+ if(class_exists('mysqli'))
+ return mysqli_connect_errno();
+ else
+ return mysql_errno();
+ }
+
+ /**
+ * @brief Get output for the setup page.
+ *
+ * Depending on the state we are currently in it returns different content.
+ *
+ * @param App &$a
+ * @return string parsed HTML output
+ */
+ function get() {
+ global $db;
+
+ $o = '';
+ $wizard_status = '';
+ $install_title = t('$Projectname Server - Setup');
+
+ if(x(\App::$data, 'db_conn_failed')) {
+ $this->install_wizard_pass = 2;
+ $wizard_status = t('Could not connect to database.');
+ }
+ if(x(\App::$data, 'url_fail')) {
+ $this->install_wizard_pass = 3;
+ $wizard_status = t('Could not connect to specified site URL. Possible SSL certificate or DNS issue.');
+ if(\App::$data['url_error'])
+ $wizard_status .= ' ' . \App::$data['url_error'];
+ }
+
+ if(x(\App::$data, 'db_create_failed')) {
+ $this->install_wizard_pass = 2;
+ $wizard_status = t('Could not create table.');
+ }
+ $db_return_text = '';
+ if(x(\App::$data, 'db_installed')) {
+ $txt = '<p style="font-size: 130%;">';
+ $txt .= t('Your site database has been installed.') . EOL;
+ $db_return_text .= $txt;
+ }
+ if(x(\App::$data, 'db_failed')) {
+ $txt = t('You may need to import the file "install/schema_xxx.sql" manually using a database client.') . EOL;
+ $txt .= t('Please see the file "install/INSTALL.txt".') . EOL ."<hr>" ;
+ $txt .= "<pre>".\App::$data['db_failed'] . "</pre>". EOL ;
+ $db_return_text .= $txt;
+ }
+ if($db && $db->connected) {
+ $r = q("SELECT COUNT(*) as `total` FROM `account`");
+ if($r && count($r) && $r[0]['total']) {
+ $tpl = get_markup_template('install.tpl');
+ return replace_macros($tpl, array(
+ '$title' => $install_title,
+ '$pass' => '',
+ '$status' => t('Permission denied.'),
+ '$text' => '',
+ ));
+ }
+ }
+
+ if(x(\App::$data, 'txt') && strlen(\App::$data['txt'])) {
+ $db_return_text .= $this->manual_config($a);
+ }
+
+ if ($db_return_text != "") {
+ $tpl = get_markup_template('install.tpl');
+ return replace_macros($tpl, array(
+ '$title' => $install_title,
+ '$pass' => '',
+ '$text' => $db_return_text . $this->what_next(),
+ ));
+ }
+
+ switch ($this->install_wizard_pass){
+ case 1: { // System check
+
+ $checks = array();
+
+ $this->check_funcs($checks);
+
+ $this->check_htconfig($checks);
+
+ $this->check_store($checks);
+
+ $this->check_smarty3($checks);
+
+ $this->check_keys($checks);
+
+ if (x($_POST, 'phpath'))
+ $phpath = notags(trim($_POST['phpath']));
+
+ $this->check_php($phpath, $checks);
+
+ $this->check_phpconfig($checks);
+
+ $this->check_htaccess($checks);
+
+ $checkspassed = array_reduce($checks, "self::check_passed", true);
+
+ $tpl = get_markup_template('install_checks.tpl');
+ $o .= replace_macros($tpl, array(
+ '$title' => $install_title,
+ '$pass' => t('System check'),
+ '$checks' => $checks,
+ '$passed' => $checkspassed,
+ '$see_install' => t('Please see the file "install/INSTALL.txt".'),
+ '$next' => t('Next'),
+ '$reload' => t('Check again'),
+ '$phpath' => $phpath,
+ '$baseurl' => z_root(),
+ ));
+ return $o;
+ }; break;
+
+ case 2: { // Database config
+
+ $dbhost = ((x($_POST,'dbhost')) ? notags(trim($_POST['dbhost'])) : '127.0.0.1');
+ $dbuser = notags(trim($_POST['dbuser']));
+ $dbport = intval(notags(trim($_POST['dbport'])));
+ $dbpass = notags(trim($_POST['dbpass']));
+ $dbdata = notags(trim($_POST['dbdata']));
+ $dbtype = intval(notags(trim($_POST['dbtype'])));
+ $phpath = notags(trim($_POST['phpath']));
+ $adminmail = notags(trim($_POST['adminmail']));
+ $siteurl = notags(trim($_POST['siteurl']));
+
+ $tpl = get_markup_template('install_db.tpl');
+ $o .= replace_macros($tpl, array(
+ '$title' => $install_title,
+ '$pass' => t('Database connection'),
+ '$info_01' => t('In order to install $Projectname we need to know how to connect to your database.'),
+ '$info_02' => t('Please contact your hosting provider or site administrator if you have questions about these settings.'),
+ '$info_03' => t('The database you specify below should already exist. If it does not, please create it before continuing.'),
+
+ '$status' => $wizard_status,
+
+ '$dbhost' => array('dbhost', t('Database Server Name'), $dbhost, t('Default is 127.0.0.1')),
+ '$dbport' => array('dbport', t('Database Port'), $dbport, t('Communication port number - use 0 for default')),
+ '$dbuser' => array('dbuser', t('Database Login Name'), $dbuser, ''),
+ '$dbpass' => array('dbpass', t('Database Login Password'), $dbpass, ''),
+ '$dbdata' => array('dbdata', t('Database Name'), $dbdata, ''),
+ '$dbtype' => array('dbtype', t('Database Type'), $dbtype, '', array( 0=>'MySQL', 1=>'PostgreSQL' )),
+
+ '$adminmail' => array('adminmail', t('Site administrator email address'), $adminmail, t('Your account email address must match this in order to use the web admin panel.')),
+ '$siteurl' => array('siteurl', t('Website URL'), z_root(), t('Please use SSL (https) URL if available.')),
+ '$lbl_10' => t('Please select a default timezone for your website'),
+
+ '$baseurl' => z_root(),
+
+ '$phpath' => $phpath,
+
+ '$submit' => t('Submit'),
+ ));
+ return $o;
+ }; break;
+ case 3: { // Site settings
+ require_once('include/datetime.php');
+ $dbhost = ((x($_POST,'dbhost')) ? notags(trim($_POST['dbhost'])) : '127.0.0.1');
+ $dbport = intval(notags(trim($_POST['dbuser'])));
+ $dbuser = notags(trim($_POST['dbuser']));
+ $dbpass = notags(trim($_POST['dbpass']));
+ $dbdata = notags(trim($_POST['dbdata']));
+ $dbtype = intval(notags(trim($_POST['dbtype'])));
+ $phpath = notags(trim($_POST['phpath']));
+
+ $adminmail = notags(trim($_POST['adminmail']));
+ $siteurl = notags(trim($_POST['siteurl']));
+ $timezone = ((x($_POST,'timezone')) ? ($_POST['timezone']) : 'America/Los_Angeles');
+
+ $tpl = get_markup_template('install_settings.tpl');
+ $o .= replace_macros($tpl, array(
+ '$title' => $install_title,
+ '$pass' => t('Site settings'),
+ '$status' => $wizard_status,
+
+ '$dbhost' => $dbhost,
+ '$dbport' => $dbport,
+ '$dbuser' => $dbuser,
+ '$dbpass' => $dbpass,
+ '$dbdata' => $dbdata,
+ '$phpath' => $phpath,
+ '$dbtype' => $dbtype,
+
+ '$adminmail' => array('adminmail', t('Site administrator email address'), $adminmail, t('Your account email address must match this in order to use the web admin panel.')),
+
+ '$siteurl' => array('siteurl', t('Website URL'), z_root(), t('Please use SSL (https) URL if available.')),
+ '$advanced' => array('advanced', t('Enable $Projectname <strong>advanced</strong> features?'), 1, t('Some advanced features, while useful - may be best suited for technically proficient audiences')),
+
+ '$timezone' => array('timezone', t('Please select a default timezone for your website'), $timezone, '', get_timezones()),
+
+ '$baseurl' => z_root(),
+
+ '$submit' => t('Submit'),
+ ));
+ return $o;
+ }; break;
+ }
+ }
+
+ /**
+ * @brief Add a check result to the array for output.
+ *
+ * @param[in,out] array &$checks array passed to template
+ * @param string $title a title for the check
+ * @param boolean $status
+ * @param boolean $required
+ * @param[optional] string $help optional help string
+ */
+ function check_add(&$checks, $title, $status, $required, $help = '') {
+ $checks[] = array(
+ 'title' => $title,
+ 'status' => $status,
+ 'required' => $required,
+ 'help' => $help
+ );
+ }
+
+ /**
+ * @brief Checks the PHP environment.
+ *
+ * @param[in,out] string &$phpath
+ * @param[out] array &$checks
+ */
+ function check_php(&$phpath, &$checks) {
+ $help = '';
+
+ if (strlen($phpath)) {
+ $passed = file_exists($phpath);
+ } else {
+ if(is_windows())
+ $phpath = trim(shell_exec('where php'));
+ else
+ $phpath = trim(shell_exec('which php'));
+
+ $passed = strlen($phpath);
+ }
+
+ if(!$passed) {
+ $help .= t('Could not find a command line version of PHP in the web server PATH.'). EOL;
+ $help .= t('If you don\'t have a command line version of PHP installed on server, you will not be able to run background polling via cron.') . EOL;
+ $help .= EOL . EOL ;
+ $tpl = get_markup_template('field_input.tpl');
+ $help .= replace_macros($tpl, array(
+ '$field' => array('phpath', t('PHP executable path'), $phpath, t('Enter full path to php executable. You can leave this blank to continue the installation.')),
+ ));
+ $phpath = '';
+ }
+
+ $this->check_add($checks, t('Command line PHP').($passed?" (<tt>$phpath</tt>)":""), $passed, false, $help);
+
+ if($passed) {
+ $str = autoname(8);
+ $cmd = "$phpath install/testargs.php $str";
+ $result = trim(shell_exec($cmd));
+ $passed2 = $result == $str;
+ $help = '';
+ if(!$passed2) {
+ $help .= t('The command line version of PHP on your system does not have "register_argc_argv" enabled.'). EOL;
+ $help .= t('This is required for message delivery to work.');
+ }
+
+ $this->check_add($checks, t('PHP register_argc_argv'), $passed, true, $help);
+ }
+ }
+
+ /**
+ * @brief Some PHP configuration checks.
+ *
+ * @todo Change how we display such informational text. Add more description
+ * how to change them.
+ *
+ * @param[out] array &$checks
+ */
+ function check_phpconfig(&$checks) {
+ require_once 'include/environment.php';
+
+ $help = '';
+
+ $result = getPhpiniUploadLimits();
+ $help = sprintf(t('Your max allowed total upload size is set to %s. Maximum size of one file to upload is set to %s. You are allowed to upload up to %d files at once.'),
+ userReadableSize($result['post_max_size']),
+ userReadableSize($result['max_upload_filesize']),
+ $result['max_file_uploads']
+ );
+ $help .= '<br>' . t('You can adjust these settings in the servers php.ini.');
+
+ $this->check_add($checks, t('PHP upload limits'), true, false, $help);
+ }
+
+ /**
+ * @brief Check if the openssl implementation can generate keys.
+ *
+ * @param[out] array $checks
+ */
+ function check_keys(&$checks) {
+ $help = '';
+ $res = false;
+
+ if (function_exists('openssl_pkey_new')) {
+ $res = openssl_pkey_new(array(
+ 'digest_alg' => 'sha1',
+ 'private_key_bits' => 4096,
+ 'encrypt_key' => false)
+ );
+ }
+
+ // Get private key
+
+ if (! $res) {
+ $help .= t('Error: the "openssl_pkey_new" function on this system is not able to generate encryption keys'). EOL;
+ $help .= t('If running under Windows, please see "http://www.php.net/manual/en/openssl.installation.php".');
+ }
+
+ $this->check_add($checks, t('Generate encryption keys'), $res, true, $help);
+ }
+
+ /**
+ * @brief Check for some PHP functions and modules.
+ *
+ * @param[in,out] array &$checks
+ */
+ function check_funcs(&$checks) {
+ $ck_funcs = array();
+
+ // add check metadata, the real check is done bit later and return values set
+ $this->check_add($ck_funcs, t('libCurl PHP module'), true, true);
+ $this->check_add($ck_funcs, t('GD graphics PHP module'), true, true);
+ $this->check_add($ck_funcs, t('OpenSSL PHP module'), true, true);
+ $this->check_add($ck_funcs, t('mysqli or postgres PHP module'), true, true);
+ $this->check_add($ck_funcs, t('mb_string PHP module'), true, true);
+ $this->check_add($ck_funcs, t('mcrypt PHP module'), true, true);
+ $this->check_add($ck_funcs, t('xml PHP module'), true, true);
+
+ if(function_exists('apache_get_modules')){
+ if (! in_array('mod_rewrite', apache_get_modules())) {
+ $this->check_add($ck_funcs, t('Apache mod_rewrite module'), false, true, t('Error: Apache webserver mod-rewrite module is required but not installed.'));
+ } else {
+ $this->check_add($ck_funcs, t('Apache mod_rewrite module'), true, true);
+ }
+ }
+ if((! function_exists('proc_open')) || strstr(ini_get('disable_functions'),'proc_open')) {
+ $this->check_add($ck_funcs, t('proc_open'), false, true, t('Error: proc_open is required but is either not installed or has been disabled in php.ini'));
+ }
+ else {
+ $this->check_add($ck_funcs, t('proc_open'), true, true);
+ }
+
+ if(! function_exists('curl_init')) {
+ $ck_funcs[0]['status'] = false;
+ $ck_funcs[0]['help'] = t('Error: libCURL PHP module required but not installed.');
+ }
+ if(! function_exists('imagecreatefromjpeg')) {
+ $ck_funcs[1]['status'] = false;
+ $ck_funcs[1]['help'] = t('Error: GD graphics PHP module with JPEG support required but not installed.');
+ }
+ if(! function_exists('openssl_public_encrypt')) {
+ $ck_funcs[2]['status'] = false;
+ $ck_funcs[2]['help'] = t('Error: openssl PHP module required but not installed.');
+ }
+ if(! function_exists('mysqli_connect') && !function_exists('pg_connect')) {
+ $ck_funcs[3]['status'] = false;
+ $ck_funcs[3]['help'] = t('Error: mysqli or postgres PHP module required but neither are installed.');
+ }
+ if(! function_exists('mb_strlen')) {
+ $ck_funcs[4]['status'] = false;
+ $ck_funcs[4]['help'] = t('Error: mb_string PHP module required but not installed.');
+ }
+ if(! function_exists('mcrypt_encrypt')) {
+ $ck_funcs[5]['status'] = false;
+ $ck_funcs[5]['help'] = t('Error: mcrypt PHP module required but not installed.');
+ }
+ if(! extension_loaded('xml')) {
+ $ck_funcs[6]['status'] = false;
+ $ck_funcs[6]['help'] = t('Error: xml PHP module required for DAV but not installed.');
+ }
+
+ $checks = array_merge($checks, $ck_funcs);
+ }
+
+ /**
+ * @brief Check for .htconfig requirements.
+ *
+ * @param[out] array &$checks
+ */
+ function check_htconfig(&$checks) {
+ $status = true;
+ $help = '';
+
+ if( (file_exists('.htconfig.php') && !is_writable('.htconfig.php')) ||
+ (!file_exists('.htconfig.php') && !is_writable('.')) ) {
+ $status = false;
+ $help = t('The web installer needs to be able to create a file called ".htconfig.php" in the top folder of your web server and it is unable to do so.') .EOL;
+ $help .= t('This is most often a permission setting, as the web server may not be able to write files in your folder - even if you can.').EOL;
+ $help .= t('At the end of this procedure, we will give you a text to save in a file named .htconfig.php in your Red top folder.').EOL;
+ $help .= t('You can alternatively skip this procedure and perform a manual installation. Please see the file "install/INSTALL.txt" for instructions.').EOL;
+ }
+
+ $this->check_add($checks, t('.htconfig.php is writable'), $status, false, $help);
+ }
+
+ /**
+ * @brief Checks for our templating engine Smarty3 requirements.
+ *
+ * @param[out] array &$checks
+ */
+ function check_smarty3(&$checks) {
+ $status = true;
+ $help = '';
+
+ if(! is_writable(TEMPLATE_BUILD_PATH) ) {
+ $status = false;
+ $help = t('Red uses the Smarty3 template engine to render its web views. Smarty3 compiles templates to PHP to speed up rendering.') .EOL;
+ $help .= sprintf( t('In order to store these compiled templates, the web server needs to have write access to the directory %s under the Red top level folder.'), TEMPLATE_BUILD_PATH) . EOL;
+ $help .= t('Please ensure that the user that your web server runs as (e.g. www-data) has write access to this folder.').EOL;
+ $help .= sprintf( t('Note: as a security measure, you should give the web server write access to %s only--not the template files (.tpl) that it contains.'), TEMPLATE_BUILD_PATH) . EOL;
+ }
+
+ $this->check_add($checks, sprintf( t('%s is writable'), TEMPLATE_BUILD_PATH), $status, true, $help);
+ }
+
+ /**
+ * @brief Check for store directory.
+ *
+ * @param[out] array &$checks
+ */
+ function check_store(&$checks) {
+ $status = true;
+ $help = '';
+
+ @os_mkdir(TEMPLATE_BUILD_PATH, STORAGE_DEFAULT_PERMISSIONS, true);
+
+ if(! is_writable('store')) {
+ $status = false;
+ $help = t('Red uses the store directory to save uploaded files. The web server needs to have write access to the store directory under the Red top level folder') . EOL;
+ $help .= t('Please ensure that the user that your web server runs as (e.g. www-data) has write access to this folder.').EOL;
+ }
+
+ $this->check_add($checks, t('store is writable'), $status, true, $help);
+ }
+
+ /**
+ * @brief Check URL rewrite und SSL certificate.
+ *
+ * @param[out] array &$checks
+ */
+ function check_htaccess(&$checks) {
+ $a = get_app();
+ $status = true;
+ $help = '';
+ $ssl_error = false;
+
+ $url = z_root() . '/setup/testrewrite';
+
+ if (function_exists('curl_init')){
+ $test = z_fetch_url($url);
+ if(! $test['success']) {
+ if(strstr($url,'https://')) {
+ $test = z_fetch_url($url,false,0,array('novalidate' => true));
+ if($test['success']) {
+ $ssl_error = true;
+ }
+ }
+ else {
+ $test = z_fetch_url(str_replace('http://','https://',$url),false,0,array('novalidate' => true));
+ if($test['success']) {
+ $ssl_error = true;
+ }
+ }
+
+ if($ssl_error) {
+ $help = t('SSL certificate cannot be validated. Fix certificate or disable https access to this site.') . EOL;
+ $help .= t('If you have https access to your website or allow connections to TCP port 443 (the https: port), you MUST use a browser-valid certificate. You MUST NOT use self-signed certificates!') . EOL;
+ $help .= t('This restriction is incorporated because public posts from you may for example contain references to images on your own hub.') . EOL;
+ $help .= t('If your certificate is not recognized, members of other sites (who may themselves have valid certificates) will get a warning message on their own site complaining about security issues.') . EOL;
+ $help .= t('This can cause usability issues elsewhere (not just on your own site) so we must insist on this requirement.') .EOL;
+ $help .= t('Providers are available that issue free certificates which are browser-valid.'). EOL;
+
+ $this->check_add($checks, t('SSL certificate validation'), false, true, $help);
+ }
+ }
+
+ if ((! $test['success']) || ($test['body'] != "ok")) {
+ $status = false;
+ $help = t('Url rewrite in .htaccess is not working. Check your server configuration.'.'Test: '.var_export($test,true));
+ }
+
+ $this->check_add($checks, t('Url rewrite is working'), $status, true, $help);
+ } else {
+ // cannot check modrewrite if libcurl is not installed
+ }
+ }
+
+
+ function manual_config(&$a) {
+ $data = htmlspecialchars(\App::$data['txt'], ENT_COMPAT, 'UTF-8');
+ $o = t('The database configuration file ".htconfig.php" could not be written. Please use the enclosed text to create a configuration file in your web server root.');
+ $o .= "<textarea rows=\"24\" cols=\"80\" >$data</textarea>";
+
+ return $o;
+ }
+
+ function load_database_rem($v, $i){
+ $l = trim($i);
+ if (strlen($l)>1 && ($l[0]=="-" || ($l[0]=="/" && $l[1]=="*"))){
+ return $v;
+ } else {
+ return $v."\n".$i;
+ }
+ }
+
+
+ function load_database($db) {
+ $str = file_get_contents($db->get_install_script());
+ $arr = explode(';',$str);
+ $errors = false;
+ foreach($arr as $a) {
+ if(strlen(trim($a))) {
+ $r = @$db->q(trim($a));
+ if(! $r) {
+ $errors .= t('Errors encountered creating database tables.') . $a . EOL;
+ }
+ }
+ }
+
+ return $errors;
+ }
+
+ function what_next() {
+ $a = get_app();
+ // install the standard theme
+ set_config('system', 'allowed_themes', 'redbasic');
+
+ // Set a lenient list of ciphers if using openssl. Other ssl engines
+ // (e.g. NSS used in RedHat) require different syntax, so hopefully
+ // the default curl cipher list will work for most sites. If not,
+ // this can set via config. Many distros are now disabling RC4,
+ // but many Red sites still use it and are unable to change it.
+ // We do not use SSL for encryption, only to protect session cookies.
+ // z_fetch_url() is also used to import shared links and other content
+ // so in theory most any cipher could show up and we should do our best
+ // to make the content available rather than tell folks that there's a
+ // weird SSL error which they can't do anything about.
+
+ $x = curl_version();
+ if(stristr($x['ssl_version'],'openssl'))
+ set_config('system','curl_ssl_ciphers','ALL:!eNULL');
+
+ // Create a system channel
+ require_once ('include/identity.php');
+ create_sys_channel();
+
+ $baseurl = z_root();
+ return
+ t('<h1>What next</h1>')
+ ."<p>".t('IMPORTANT: You will need to [manually] setup a scheduled task for the poller.')
+ .t('Please see the file "install/INSTALL.txt".')
+ ."</p><p>"
+ .t("Go to your new hub <a href='$baseurl/register'>registration page</a> and register as new member. Remember to use the same email you have entered as administrator email. This will allow you to enter the site admin panel.")
+ ."</p>";
+ }
+
+
+ static private function check_passed($v, $c) {
+ if ($c['required'])
+ $v = $v && $c['status'];
+
+ return $v;
+ }
+
+
+}
diff --git a/Zotlabs/Module/Share.php b/Zotlabs/Module/Share.php
new file mode 100644
index 000000000..73db01657
--- /dev/null
+++ b/Zotlabs/Module/Share.php
@@ -0,0 +1,93 @@
+<?php
+namespace Zotlabs\Module;
+
+require_once('include/security.php');
+require_once('include/bbcode.php');
+
+
+class Share extends \Zotlabs\Web\Controller {
+
+ function init() {
+
+ $post_id = ((argc() > 1) ? intval(argv(1)) : 0);
+
+ if(! $post_id)
+ killme();
+
+ if(! (local_channel() || remote_channel()))
+ killme();
+
+ $r = q("SELECT * from item left join xchan on author_xchan = xchan_hash WHERE id = %d LIMIT 1",
+ intval($post_id)
+ );
+ if(! $r)
+ killme();
+ if(($r[0]['item_private']) && ($r[0]['xchan_network'] !== 'rss'))
+ killme();
+
+ $sql_extra = item_permissions_sql($r[0]['uid']);
+
+ $r = q("select * from item where id = %d $sql_extra",
+ intval($post_id)
+ );
+ if(! $r)
+ killme();
+
+ /** @FIXME we only share bbcode */
+
+ if($r[0]['mimetype'] !== 'text/bbcode')
+ killme();
+
+ /** @FIXME eventually we want to post remotely via rpost on your home site */
+ // When that works remove this next bit:
+
+ if(! local_channel())
+ killme();
+
+ xchan_query($r);
+
+ $is_photo = (($r[0]['obj_type'] === ACTIVITY_OBJ_PHOTO) ? true : false);
+ if($is_photo) {
+ $object = json_decode($r[0]['object'],true);
+ $photo_bb = $object['body'];
+ }
+
+ if (strpos($r[0]['body'], "[/share]") !== false) {
+ $pos = strpos($r[0]['body'], "[share");
+ $o = substr($r[0]['body'], $pos);
+ } else {
+ $o = "[share author='".urlencode($r[0]['author']['xchan_name']).
+ "' profile='".$r[0]['author']['xchan_url'] .
+ "' avatar='".$r[0]['author']['xchan_photo_s'].
+ "' link='".$r[0]['plink'].
+ "' posted='".$r[0]['created'].
+ "' message_id='".$r[0]['mid']."']";
+ if($r[0]['title'])
+ $o .= '[b]'.$r[0]['title'].'[/b]'."\r\n";
+ $o .= (($is_photo) ? $photo_bb . "\r\n" . $r[0]['body'] : $r[0]['body']);
+ $o .= "[/share]";
+ }
+
+ if(local_channel()) {
+ echo $o;
+ killme();
+ }
+
+ $observer = \App::get_observer();
+ $parsed = $observer['xchan_url'];
+ if($parsed) {
+ $post_url = $parsed['scheme'] . ':' . $parsed['host'] . (($parsed['port']) ? ':' . $parsed['port'] : '')
+ . '/rpost';
+
+ /**
+ * @FIXME we were probably called from JS so we don't know the return page.
+ * In fact we won't be able to load the remote page.
+ * we might need an iframe
+ */
+
+ $x = z_post_url($post_url, array('f' => '', 'body' => $o ));
+ killme();
+ }
+ }
+
+}
diff --git a/Zotlabs/Module/Sharedwithme.php b/Zotlabs/Module/Sharedwithme.php
new file mode 100644
index 000000000..8eaa47dba
--- /dev/null
+++ b/Zotlabs/Module/Sharedwithme.php
@@ -0,0 +1,113 @@
+<?php
+namespace Zotlabs\Module;
+require_once('include/conversation.php');
+require_once('include/text.php');
+
+
+class Sharedwithme extends \Zotlabs\Web\Controller {
+
+ function get() {
+ if(! local_channel()) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ $channel = \App::get_channel();
+
+ $is_owner = (local_channel() && (local_channel() == $channel['channel_id']));
+
+ //check for updated items and remove them
+ require_once('include/sharedwithme.php');
+ apply_updates();
+
+ //drop single file - localuser
+ if((argc() > 2) && (argv(2) === 'drop')) {
+
+ $id = intval(argv(1));
+
+ q("DELETE FROM item WHERE id = %d AND uid = %d",
+ intval($id),
+ intval(local_channel())
+ );
+
+ goaway(z_root() . '/sharedwithme');
+ }
+
+ //drop all files - localuser
+ if((argc() > 1) && (argv(1) === 'dropall')) {
+
+ q("DELETE FROM item WHERE verb = '%s' AND obj_type = '%s' AND uid = %d",
+ dbesc(ACTIVITY_POST),
+ dbesc(ACTIVITY_OBJ_FILE),
+ intval(local_channel())
+ );
+
+ goaway(z_root() . '/sharedwithme');
+ }
+
+ //list files
+ $r = q("SELECT id, uid, object, item_unseen FROM item WHERE verb = '%s' AND obj_type = '%s' AND uid = %d AND owner_xchan != '%s'",
+ dbesc(ACTIVITY_POST),
+ dbesc(ACTIVITY_OBJ_FILE),
+ intval(local_channel()),
+ dbesc($channel['channel_hash'])
+ );
+
+ $items =array();
+ $ids = '';
+
+ if($r) {
+
+ foreach($r as $rr) {
+ $object = json_decode($rr['object'],true);
+
+ $item = array();
+ $item['id'] = $rr['id'];
+ $item['objfiletype'] = $object['filetype'];
+ $item['objfiletypeclass'] = getIconFromType($object['filetype']);
+ $item['objurl'] = rawurldecode(get_rel_link($object['link'],'alternate')) . '?f=&zid=' . $channel['xchan_addr'];
+ $item['objfilename'] = $object['filename'];
+ $item['objfilesize'] = userReadableSize($object['filesize']);
+ $item['objedited'] = $object['edited'];
+ $item['unseen'] = $rr['item_unseen'];
+
+ $items[] = $item;
+
+ if($item['unseen'] > 0) {
+ $ids .= " '" . $rr['id'] . "',";
+ }
+
+ }
+
+ }
+
+ if($ids) {
+
+ //remove trailing ,
+ $ids = rtrim($ids, ",");
+
+ q("UPDATE item SET item_unseen = 0 WHERE id IN ( $ids ) AND uid = %d",
+ intval(local_channel())
+ );
+
+ }
+
+ $o = profile_tabs($a, $is_owner, $channel['channel_address']);
+
+ $o .= replace_macros(get_markup_template('sharedwithme.tpl'), array(
+ '$header' => t('Files: shared with me'),
+ '$name' => t('Name'),
+ '$label_new' => t('NEW'),
+ '$size' => t('Size'),
+ '$lastmod' => t('Last Modified'),
+ '$dropall' => t('Remove all files'),
+ '$drop' => t('Remove this file'),
+ '$items' => $items
+ ));
+
+ return $o;
+
+ }
+
+
+}
diff --git a/Zotlabs/Module/Siteinfo.php b/Zotlabs/Module/Siteinfo.php
new file mode 100644
index 000000000..ccca6ab43
--- /dev/null
+++ b/Zotlabs/Module/Siteinfo.php
@@ -0,0 +1,94 @@
+<?php
+namespace Zotlabs\Module;
+
+
+class Siteinfo extends \Zotlabs\Web\Controller {
+
+ function init() {
+ if (argv(1) === 'json') {
+ $data = get_site_info();
+ json_return_and_die($data);
+ }
+ }
+
+
+
+ function get() {
+
+ if(! get_config('system','hidden_version_siteinfo')) {
+ $version = sprintf( t('Version %s'), \Zotlabs\Project\System::get_project_version());
+ if(@is_dir('.git') && function_exists('shell_exec')) {
+ $commit = @shell_exec('git log -1 --format="%h"');
+ $tag = \Zotlabs\Project\System::get_std_version(); // @shell_exec('git describe --tags --abbrev=0');
+ }
+ if(! isset($commit) || strlen($commit) > 16)
+ $commit = '';
+ }
+ else {
+ $version = $commit = '';
+ }
+ $visible_plugins = array();
+ if(is_array(\App::$plugins) && count(\App::$plugins)) {
+ $r = q("select * from addon where hidden = 0");
+ if(count($r))
+ foreach($r as $rr)
+ $visible_plugins[] = $rr['name'];
+ }
+
+ $plugins_list = '';
+ if(count($visible_plugins)) {
+ $plugins_text = t('Installed plugins/addons/apps:');
+ $sorted = $visible_plugins;
+ $s = '';
+ sort($sorted);
+ foreach($sorted as $p) {
+ if(strlen($p)) {
+ if(strlen($s)) $s .= ', ';
+ $s .= $p;
+ }
+ }
+ $plugins_list .= $s;
+ }
+ else
+ $plugins_text = t('No installed plugins/addons/apps');
+
+ $txt = get_config('system','admininfo');
+ $admininfo = bbcode($txt);
+
+ if(file_exists('doc/site_donate.html'))
+ $donate .= file_get_contents('doc/site_donate.html');
+
+ if(function_exists('sys_getloadavg'))
+ $loadavg = sys_getloadavg();
+
+ $o = replace_macros(get_markup_template('siteinfo.tpl'), array(
+ '$title' => t('$Projectname'),
+ '$description' => t('This is a hub of $Projectname - a global cooperative network of decentralized privacy enhanced websites.'),
+ '$version' => $version,
+ '$tag_txt' => t('Tag: '),
+ '$tag' => $tag,
+ '$polled' => t('Last background fetch: '),
+ '$lastpoll' => get_poller_runtime(),
+ '$load_average' => t('Current load average: '),
+ '$loadavg_all' => $loadavg[0] . ', ' . $loadavg[1] . ', ' . $loadavg[2],
+ '$commit' => $commit,
+ '$web_location' => t('Running at web location') . ' ' . z_root(),
+ '$visit' => t('Please visit <a href="http://hubzilla.org">hubzilla.org</a> to learn more about $Projectname.'),
+ '$bug_text' => t('Bug reports and issues: please visit'),
+ '$bug_link_url' => 'https://github.com/redmatrix/hubzilla/issues',
+ '$bug_link_text' => t('$projectname issues'),
+ '$contact' => t('Suggestions, praise, etc. - please email "redmatrix" at librelist - dot com'),
+ '$donate' => $donate,
+ '$adminlabel' => t('Site Administrators'),
+ '$admininfo' => $admininfo,
+ '$plugins_text' => $plugins_text,
+ '$plugins_list' => $plugins_list
+ ));
+
+ call_hooks('about_hook', $o);
+
+ return $o;
+
+ }
+
+}
diff --git a/Zotlabs/Module/Siteinfo_json.php b/Zotlabs/Module/Siteinfo_json.php
new file mode 100644
index 000000000..99c22610f
--- /dev/null
+++ b/Zotlabs/Module/Siteinfo_json.php
@@ -0,0 +1,14 @@
+<?php
+namespace Zotlabs\Module;
+
+
+class Siteinfo_json extends \Zotlabs\Web\Controller {
+
+ function init() {
+
+ $data = get_site_info();
+ json_return_and_die($data);
+
+ }
+
+}
diff --git a/Zotlabs/Module/Sitelist.php b/Zotlabs/Module/Sitelist.php
new file mode 100644
index 000000000..e7d4187b7
--- /dev/null
+++ b/Zotlabs/Module/Sitelist.php
@@ -0,0 +1,67 @@
+<?php
+namespace Zotlabs\Module; /** @file */
+
+
+class Sitelist extends \Zotlabs\Web\Controller {
+
+ function init() {
+
+ $start = (($_REQUEST['start']) ? intval($_REQUEST['start']) : 0);
+ $limit = ((intval($_REQUEST['limit'])) ? intval($_REQUEST['limit']) : 30);
+ $order = (($_REQUEST['order']) ? $_REQUEST['order'] : 'random');
+ $open = (($_REQUEST['open']) ? intval($_REQUEST['open']) : false);
+
+
+ $sql_order = " order by site_url ";
+ $rand = db_getfunc('rand');
+ if($order == 'random')
+ $sql_order = " order by $rand ";
+
+ $sql_limit = " LIMIT $limit OFFSET $start ";
+
+ $sql_extra = "";
+ if($open)
+ $sql_extra = " and site_register = " . intval(REGISTER_OPEN) . " ";
+
+ $realm = get_directory_realm();
+ if($realm == DIRECTORY_REALM) {
+ $sql_extra .= " and ( site_realm = '" . dbesc($realm) . "' or site_realm = '') ";
+ }
+ else
+ $sql_extra .= " and site_realm = '" . dbesc($realm) . "' ";
+
+ $result = array('success' => false);
+
+ $r = q("select count(site_url) as total from site where site_type = %d $sql_extra ",
+ intval(SITE_TYPE_ZOT)
+ );
+
+ if($r)
+ $result['total'] = intval($r[0]['total']);
+
+ $result['start'] = $start;
+ $result['limit'] = $limit;
+
+ $r = q("select * from site where site_type = %d $sql_extra $sql_order $sql_limit",
+ intval(SITE_TYPE_ZOT)
+ );
+
+ $result['results'] = 0;
+ $result['entries'] = array();
+
+ if($r) {
+ $result['success'] = true;
+ $result['results'] = count($r);
+
+ foreach($r as $rr) {
+ $result['entries'][] = array('url' => $rr['site_url']);
+ }
+
+ }
+
+ echo json_encode($result);
+ killme();
+
+
+ }
+}
diff --git a/Zotlabs/Module/Smilies.php b/Zotlabs/Module/Smilies.php
new file mode 100644
index 000000000..efac07f84
--- /dev/null
+++ b/Zotlabs/Module/Smilies.php
@@ -0,0 +1,21 @@
+<?php
+namespace Zotlabs\Module;
+
+
+class Smilies extends \Zotlabs\Web\Controller {
+
+ function get() {
+ if (\App::$argv[1]==="json"){
+ $tmp = list_smilies();
+ $results = array();
+ for($i = 0; $i < count($tmp['texts']); $i++) {
+ $results[] = array('text' => $tmp['texts'][$i], 'icon' => $tmp['icons'][$i]);
+ }
+ json_return_and_die($results);
+ }
+ else {
+ return smilies('',true);
+ }
+ }
+
+}
diff --git a/Zotlabs/Module/Sources.php b/Zotlabs/Module/Sources.php
new file mode 100644
index 000000000..cca9e5ebf
--- /dev/null
+++ b/Zotlabs/Module/Sources.php
@@ -0,0 +1,173 @@
+<?php
+namespace Zotlabs\Module; /** @file */
+
+
+class Sources extends \Zotlabs\Web\Controller {
+
+ function post() {
+ if(! local_channel())
+ return;
+
+ if(! feature_enabled(local_channel(),'channel_sources'))
+ return '';
+
+ $source = intval($_REQUEST['source']);
+ $xchan = $_REQUEST['xchan'];
+ $abook = intval($_REQUEST['abook']);
+ $words = $_REQUEST['words'];
+ $frequency = $_REQUEST['frequency'];
+ $name = $_REQUEST['name'];
+
+ $channel = \App::get_channel();
+
+ if($name == '*')
+ $xchan = '*';
+
+ if($abook) {
+ $r = q("select abook_xchan from abook where abook_id = %d and abook_channel = %d limit 1",
+ intval($abook),
+ intval(local_channel())
+ );
+ if($r)
+ $xchan = $r[0]['abook_xchan'];
+ }
+
+ if(! $xchan) {
+ notice ( t('Failed to create source. No channel selected.') . EOL);
+ return;
+ }
+
+ if(! $source) {
+ $r = q("insert into source ( src_channel_id, src_channel_xchan, src_xchan, src_patt )
+ values ( %d, '%s', '%s', '%s' ) ",
+ intval(local_channel()),
+ dbesc($channel['channel_hash']),
+ dbesc($xchan),
+ dbesc($words)
+ );
+ if($r) {
+ info( t('Source created.') . EOL);
+ }
+ goaway(z_root() . '/sources');
+ }
+ else {
+ $r = q("update source set src_xchan = '%s', src_patt = '%s' where src_channel_id = %d and src_id = %d",
+ dbesc($xchan),
+ dbesc($words),
+ intval(local_channel()),
+ intval($source)
+ );
+ if($r) {
+ info( t('Source updated.') . EOL);
+ }
+
+ }
+ }
+
+
+ function get() {
+ if(! local_channel()) {
+ notice( t('Permission denied.') . EOL);
+ return '';
+ }
+
+ if(! feature_enabled(local_channel(),'channel_sources')) {
+ return '';
+ }
+
+ // list sources
+ if(argc() == 1) {
+ $r = q("select source.*, xchan.* from source left join xchan on src_xchan = xchan_hash where src_channel_id = %d",
+ intval(local_channel())
+ );
+ if($r) {
+ for($x = 0; $x < count($r); $x ++) {
+ if($r[$x]['src_xchan'] == '*') {
+ $r[$x]['xchan_name'] = t('*');
+ }
+ $r[$x]['src_patt'] = htmlspecialchars($r[$x]['src_patt'], ENT_COMPAT,'UTF-8');
+ }
+ }
+ $o = replace_macros(get_markup_template('sources_list.tpl'), array(
+ '$title' => t('Channel Sources'),
+ '$desc' => t('Manage remote sources of content for your channel.'),
+ '$new' => t('New Source'),
+ '$sources' => $r
+ ));
+ return $o;
+ }
+
+ if(argc() == 2 && argv(1) === 'new') {
+ // TODO add the words 'or RSS feed' and corresponding code to manage feeds and frequency
+
+ $o = replace_macros(get_markup_template('sources_new.tpl'), array(
+ '$title' => t('New Source'),
+ '$desc' => t('Import all or selected content from the following channel into this channel and distribute it according to your channel settings.'),
+ '$words' => array( 'words', t('Only import content with these words (one per line)'),'',t('Leave blank to import all public content')),
+ '$name' => array( 'name', t('Channel Name'), '', ''),
+ '$submit' => t('Submit')
+ ));
+ return $o;
+
+ }
+
+ if(argc() == 2 && intval(argv(1))) {
+ // edit source
+ $r = q("select source.*, xchan.* from source left join xchan on src_xchan = xchan_hash where src_id = %d and src_channel_id = %d limit 1",
+ intval(argv(1)),
+ intval(local_channel())
+ );
+ if($r) {
+ $x = q("select abook_id from abook where abook_xchan = '%s' and abook_channel = %d limit 1",
+ dbesc($r[0]['src_xchan']),
+ intval(local_channel())
+ );
+ }
+ if(! $r) {
+ notice( t('Source not found.') . EOL);
+ return '';
+ }
+
+ $r[0]['src_patt'] = htmlspecialchars($r[0]['src_patt'], ENT_QUOTES,'UTF-8');
+
+ $o = replace_macros(get_markup_template('sources_edit.tpl'), array(
+ '$title' => t('Edit Source'),
+ '$drop' => t('Delete Source'),
+ '$id' => $r[0]['src_id'],
+ '$desc' => t('Import all or selected content from the following channel into this channel and distribute it according to your channel settings.'),
+ '$words' => array( 'words', t('Only import content with these words (one per line)'),$r[0]['src_patt'],t('Leave blank to import all public content')),
+ '$xchan' => $r[0]['src_xchan'],
+ '$abook' => $x[0]['abook_id'],
+ '$name' => array( 'name', t('Channel Name'), $r[0]['xchan_name'], ''),
+ '$submit' => t('Submit')
+ ));
+ return $o;
+
+ }
+
+ if(argc() == 3 && intval(argv(1)) && argv(2) === 'drop') {
+ $r = q("select * from source where src_id = %d and src_channel_id = %d limit 1",
+ intval(argv(1)),
+ intval(local_channel())
+ );
+ if(! $r) {
+ notice( t('Source not found.') . EOL);
+ return '';
+ }
+ $r = q("delete from source where src_id = %d and src_channel_id = %d",
+ intval(argv(1)),
+ intval(local_channel())
+ );
+ if($r)
+ info( t('Source removed') . EOL);
+ else
+ notice( t('Unable to remove source.') . EOL);
+
+ goaway(z_root() . '/sources');
+
+ }
+
+ // shouldn't get here.
+
+ }
+}
diff --git a/Zotlabs/Module/Sslify.php b/Zotlabs/Module/Sslify.php
new file mode 100644
index 000000000..db73f85e0
--- /dev/null
+++ b/Zotlabs/Module/Sslify.php
@@ -0,0 +1,30 @@
+<?php
+namespace Zotlabs\Module;
+
+
+class Sslify extends \Zotlabs\Web\Controller {
+
+ function init() {
+ $x = z_fetch_url($_REQUEST['url']);
+ if($x['success']) {
+ $h = explode("\n",$x['header']);
+ foreach ($h as $l) {
+ list($k,$v) = array_map("trim", explode(":", trim($l), 2));
+ $hdrs[$k] = $v;
+ }
+ if (array_key_exists('Content-Type', $hdrs))
+ $type = $hdrs['Content-Type'];
+
+ header('Content-Type: ' . $type);
+ echo $x['body'];
+ killme();
+ }
+ killme();
+ // for some reason when this fallback is in place - it gets triggered
+ // often, (creating mixed content exceptions) even though there is
+ // nothing obvious missing on the page when we bypass it.
+ goaway($_REQUEST['url']);
+ }
+
+
+}
diff --git a/Zotlabs/Module/Starred.php b/Zotlabs/Module/Starred.php
new file mode 100644
index 000000000..73a2dc808
--- /dev/null
+++ b/Zotlabs/Module/Starred.php
@@ -0,0 +1,39 @@
+<?php
+namespace Zotlabs\Module;
+
+
+
+class Starred extends \Zotlabs\Web\Controller {
+
+ function init() {
+
+ $starred = 0;
+
+ if(! local_channel())
+ killme();
+ if(argc() > 1)
+ $message_id = intval(argv(1));
+ if(! $message_id)
+ killme();
+
+ $r = q("SELECT item_flags FROM item WHERE uid = %d AND id = %d LIMIT 1",
+ intval(local_channel()),
+ intval($message_id)
+ );
+ if(! count($r))
+ killme();
+
+ $item_starred = (intval($r[0]['item_starred']) ? 0 : 1);
+
+ $r = q("UPDATE item SET item_starred = %d WHERE uid = %d and id = %d",
+ intval($item_starred),
+ intval(local_channel()),
+ intval($message_id)
+ );
+
+ header('Content-type: application/json');
+ echo json_encode(array('result' => $item_starred));
+ killme();
+ }
+
+}
diff --git a/Zotlabs/Module/Subthread.php b/Zotlabs/Module/Subthread.php
new file mode 100644
index 000000000..16a011a40
--- /dev/null
+++ b/Zotlabs/Module/Subthread.php
@@ -0,0 +1,169 @@
+<?php
+namespace Zotlabs\Module;
+
+require_once('include/security.php');
+require_once('include/bbcode.php');
+require_once('include/items.php');
+
+
+
+class Subthread extends \Zotlabs\Web\Controller {
+
+ function get() {
+
+ if((! local_channel()) && (! remote_channel())) {
+ return;
+ }
+
+ $item_id = ((argc() > 2) ? notags(trim(argv(2))) : 0);
+
+ if(argv(1) === 'sub')
+ $activity = ACTIVITY_FOLLOW;
+ elseif(argv(1) === 'unsub')
+ $activity = ACTIVITY_UNFOLLOW;
+
+
+ $r = q("SELECT parent FROM item WHERE id = '%s'",
+ dbesc($item_id)
+ );
+
+ if($r) {
+ $r = q("select * from item where id = parent and id = %d limit 1",
+ dbesc($r[0]['parent'])
+ );
+ }
+
+ if((! $item_id) || (! $r)) {
+ logger('subthread: no item ' . $item_id);
+ return;
+ }
+
+ $item = $r[0];
+
+ $owner_uid = $item['uid'];
+ $observer = \App::get_observer();
+ $ob_hash = (($observer) ? $observer['xchan_hash'] : '');
+
+ if(! perm_is_allowed($owner_uid,$ob_hash,'post_comments'))
+ return;
+
+ $sys = get_sys_channel();
+
+ $owner_uid = $item['uid'];
+ $owner_aid = $item['aid'];
+
+ // if this is a "discover" item, (item['uid'] is the sys channel),
+ // fallback to the item comment policy, which should've been
+ // respected when generating the conversation thread.
+ // Even if the activity is rejected by the item owner, it should still get attached
+ // to the local discover conversation on this site.
+
+ if(($owner_uid != $sys['channel_id']) && (! perm_is_allowed($owner_uid,$observer['xchan_hash'],'post_comments'))) {
+ notice( t('Permission denied') . EOL);
+ killme();
+ }
+
+ $r = q("select * from xchan where xchan_hash = '%s' limit 1",
+ dbesc($item['owner_xchan'])
+ );
+ if($r)
+ $thread_owner = $r[0];
+ else
+ killme();
+
+ $r = q("select * from xchan where xchan_hash = '%s' limit 1",
+ dbesc($item['author_xchan'])
+ );
+ if($r)
+ $item_author = $r[0];
+ else
+ killme();
+
+
+
+
+ $mid = item_message_id();
+
+ $post_type = (($item['resource_type'] === 'photo') ? t('photo') : t('status'));
+
+ $links = array(array('rel' => 'alternate','type' => 'text/html', 'href' => $item['plink']));
+ $objtype = (($item['resource_type'] === 'photo') ? ACTIVITY_OBJ_PHOTO : ACTIVITY_OBJ_NOTE );
+
+ $body = $item['body'];
+
+ $obj = json_encode(array(
+ 'type' => $objtype,
+ 'id' => $item['mid'],
+ 'parent' => (($item['thr_parent']) ? $item['thr_parent'] : $item['parent_mid']),
+ 'link' => $links,
+ 'title' => $item['title'],
+ 'content' => $item['body'],
+ 'created' => $item['created'],
+ 'edited' => $item['edited'],
+ 'author' => array(
+ 'name' => $item_author['xchan_name'],
+ 'address' => $item_author['xchan_addr'],
+ 'guid' => $item_author['xchan_guid'],
+ 'guid_sig' => $item_author['xchan_guid_sig'],
+ 'link' => array(
+ array('rel' => 'alternate', 'type' => 'text/html', 'href' => $item_author['xchan_url']),
+ array('rel' => 'photo', 'type' => $item_author['xchan_photo_mimetype'], 'href' => $item_author['xchan_photo_m'])),
+ ),
+ ));
+
+ if(! intval($item['item_thread_top']))
+ $post_type = 'comment';
+
+ if($activity === ACTIVITY_FOLLOW)
+ $bodyverb = t('%1$s is following %2$s\'s %3$s');
+ if($activity === ACTIVITY_UNFOLLOW)
+ $bodyverb = t('%1$s stopped following %2$s\'s %3$s');
+
+ $arr = array();
+
+ $arr['mid'] = $mid;
+ $arr['aid'] = $owner_aid;
+ $arr['uid'] = $owner_uid;
+ $arr['parent'] = $item['id'];
+ $arr['parent_mid'] = $item['mid'];
+ $arr['thr_parent'] = $item['mid'];
+ $arr['owner_xchan'] = $thread_owner['xchan_hash'];
+ $arr['author_xchan'] = $observer['xchan_hash'];
+ $arr['item_origin'] = 1;
+ $arr['item_notshown'] = 1;
+ if(intval($item['item_wall']))
+ $arr['item_wall'] = 1;
+ else
+ $arr['item_wall'] = 0;
+
+ $ulink = '[zrl=' . $item_author['xchan_url'] . ']' . $item_author['xchan_name'] . '[/zrl]';
+ $alink = '[zrl=' . $observer['xchan_url'] . ']' . $observer['xchan_name'] . '[/zrl]';
+ $plink = '[zrl=' . z_root() . '/display/' . $item['mid'] . ']' . $post_type . '[/zrl]';
+
+ $arr['body'] = sprintf( $bodyverb, $alink, $ulink, $plink );
+
+ $arr['verb'] = $activity;
+ $arr['obj_type'] = $objtype;
+ $arr['object'] = $obj;
+
+ $arr['allow_cid'] = $item['allow_cid'];
+ $arr['allow_gid'] = $item['allow_gid'];
+ $arr['deny_cid'] = $item['deny_cid'];
+ $arr['deny_gid'] = $item['deny_gid'];
+
+ $post = item_store($arr);
+ $post_id = $post['item_id'];
+
+ $arr['id'] = $post_id;
+
+ call_hooks('post_local_end', $arr);
+
+ killme();
+
+
+ }
+
+
+
+
+}
diff --git a/Zotlabs/Module/Suggest.php b/Zotlabs/Module/Suggest.php
new file mode 100644
index 000000000..367308d90
--- /dev/null
+++ b/Zotlabs/Module/Suggest.php
@@ -0,0 +1,72 @@
+<?php
+namespace Zotlabs\Module;
+
+require_once('include/socgraph.php');
+require_once('include/contact_widgets.php');
+require_once('include/widgets.php');
+
+
+
+class Suggest extends \Zotlabs\Web\Controller {
+
+ function init() {
+ if(! local_channel())
+ return;
+
+ if(x($_GET,'ignore')) {
+ q("insert into xign ( uid, xchan ) values ( %d, '%s' ) ",
+ intval(local_channel()),
+ dbesc($_GET['ignore'])
+ );
+ }
+
+ }
+
+
+ function get() {
+
+ $o = '';
+ if(! local_channel()) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ $_SESSION['return_url'] = z_root() . '/' . \App::$cmd;
+
+ $r = suggestion_query(local_channel(),get_observer_hash());
+
+ if(! $r) {
+ info( t('No suggestions available. If this is a new site, please try again in 24 hours.'));
+ return;
+ }
+
+ $arr = array();
+
+ foreach($r as $rr) {
+
+ $connlnk = z_root() . '/follow/?url=' . $rr['xchan_addr'];
+
+ $arr[] = array(
+ 'url' => chanlink_url($rr['xchan_url']),
+ 'common' => $rr['total'],
+ 'profile' => $rr['xchan_url'],
+ 'name' => $rr['xchan_name'],
+ 'photo' => $rr['xchan_photo_m'],
+ 'ignlnk' => z_root() . '/suggest?ignore=' . $rr['xchan_hash'],
+ 'conntxt' => t('Connect'),
+ 'connlnk' => $connlnk,
+ 'ignore' => t('Ignore/Hide')
+ );
+ }
+
+
+ $o = replace_macros(get_markup_template('suggest_page.tpl'),array(
+ '$title' => t('Channel Suggestions'),
+ '$entries' => $arr
+ ));
+
+ return $o;
+
+ }
+
+}
diff --git a/Zotlabs/Module/Tagger.php b/Zotlabs/Module/Tagger.php
new file mode 100644
index 000000000..879cf3dbb
--- /dev/null
+++ b/Zotlabs/Module/Tagger.php
@@ -0,0 +1,140 @@
+<?php
+namespace Zotlabs\Module;
+
+require_once('include/security.php');
+require_once('include/bbcode.php');
+require_once('include/items.php');
+
+
+
+class Tagger extends \Zotlabs\Web\Controller {
+
+ function get() {
+
+ if(! local_channel() && ! remote_channel()) {
+ return;
+ }
+
+ $observer_hash = get_observer_hash();
+ //strip html-tags
+ $term = notags(trim($_GET['term']));
+ //check if empty
+ if(! $term)
+ return;
+
+ $item_id = ((argc() > 1) ? notags(trim(argv(1))) : 0);
+
+ logger('tagger: tag ' . $term . ' item ' . $item_id);
+
+
+ $r = q("SELECT * FROM item left join xchan on xchan_hash = author_xchan WHERE id = '%s' and uid = %d LIMIT 1",
+ dbesc($item_id),
+ intval(local_channel())
+ );
+
+ if((! $item_id) || (! $r)) {
+ logger('tagger: no item ' . $item_id);
+ return;
+ }
+
+ $item = $r[0];
+
+ $owner_uid = $item['uid'];
+
+ switch($item['resource_type']) {
+ case 'photo':
+ $targettype = ACTIVITY_OBJ_PHOTO;
+ $post_type = t('photo');
+ break;
+ case 'event':
+ $targgettype = ACTIVITY_OBJ_EVENT;
+ $post_type = t('event');
+ break;
+ default:
+ $targettype = ACTIVITY_OBJ_NOTE;
+ $post_type = t('post');
+ if($item['mid'] != $item['parent_mid'])
+ $post_type = t('comment');
+ break;
+ }
+
+
+ $links = array(array('rel' => 'alternate','type' => 'text/html',
+ 'href' => z_root() . '/display/' . $item['mid']));
+
+ $target = json_encode(array(
+ 'type' => $targettype,
+ 'id' => $item['mid'],
+ 'link' => $links,
+ 'title' => $item['title'],
+ 'content' => $item['body'],
+ 'created' => $item['created'],
+ 'edited' => $item['edited'],
+ 'author' => array(
+ 'name' => $item['xchan_name'],
+ 'address' => $item['xchan_addr'],
+ 'guid' => $item['xchan_guid'],
+ 'guid_sig' => $item['xchan_guid_sig'],
+ 'link' => array(
+ array('rel' => 'alternate', 'type' => 'text/html', 'href' => $item['xchan_url']),
+ array('rel' => 'photo', 'type' => $item['xchan_photo_mimetype'], 'href' => $item['xchan_photo_m'])),
+ ),
+ ));
+
+
+
+ $link = xmlify('<link rel="alternate" type="text/html" href="'
+ . z_root() . '/display/' . $owner['nickname'] . '/' . $item['id'] . '" />' . "\n") ;
+
+ $tagid = z_root() . '/search?tag=' . $term;
+ $objtype = ACTIVITY_OBJ_TAGTERM;
+
+ $obj = json_encode(array(
+ 'type' => $objtype,
+ 'id' => $tagid,
+ 'link' => array(array('rel' => 'alternate','type' => 'text/html', 'href' => $tagid)),
+ 'title' => $term,
+ 'content' => $term
+ ));
+
+ $bodyverb = t('%1$s tagged %2$s\'s %3$s with %4$s');
+
+ // saving here for reference
+ // also check out x22d5 and x2317 and x0d6b and x0db8 and x24d0 and xff20 !!!
+
+ $termlink = html_entity_decode('&#x22d5;') . '[zrl=' . z_root() . '/search?tag=' . urlencode($term) . ']'. $term . '[/zrl]';
+
+ $channel = \App::get_channel();
+
+ $arr = array();
+
+ $arr['owner_xchan'] = $item['owner_xchan'];
+ $arr['author_xchan'] = $channel['channel_hash'];
+
+ $arr['item_origin'] = 1;
+ $arr['item_wall'] = ((intval($item['item_wall'])) ? 1 : 0);
+
+ $ulink = '[zrl=' . $channel['xchan_url'] . ']' . $channel['channel_name'] . '[/zrl]';
+ $alink = '[zrl=' . $item['xchan_url'] . ']' . $item['xchan_name'] . '[/zrl]';
+ $plink = '[zrl=' . $item['plink'] . ']' . $post_type . '[/zrl]';
+
+ $arr['body'] = sprintf( $bodyverb, $ulink, $alink, $plink, $termlink );
+
+ $arr['verb'] = ACTIVITY_TAG;
+ $arr['tgt_type'] = $targettype;
+ $arr['target'] = $target;
+ $arr['obj_type'] = $objtype;
+ $arr['object'] = $obj;
+ $arr['parent_mid'] = $item['mid'];
+
+ store_item_tag($item['uid'],$item['id'],TERM_OBJ_POST,TERM_COMMUNITYTAG,$term,$tagid);
+ $ret = post_activity_item($arr);
+
+ if($ret['success'])
+ proc_run('php','include/notifier.php','tag',$ret['activity']['id']);
+
+ killme();
+
+ }
+
+}
diff --git a/Zotlabs/Module/Tagrm.php b/Zotlabs/Module/Tagrm.php
new file mode 100644
index 000000000..81ae30aa5
--- /dev/null
+++ b/Zotlabs/Module/Tagrm.php
@@ -0,0 +1,147 @@
+<?php
+namespace Zotlabs\Module;
+
+require_once('include/bbcode.php');
+
+
+class Tagrm extends \Zotlabs\Web\Controller {
+
+ function post() {
+
+ if(! local_channel())
+ goaway(z_root() . '/' . $_SESSION['photo_return']);
+
+
+ if((x($_POST,'submit')) && ($_POST['submit'] === t('Cancel')))
+ goaway(z_root() . '/' . $_SESSION['photo_return']);
+
+ $tag = ((x($_POST,'tag')) ? trim($_POST['tag']) : '');
+ $item = ((x($_POST,'item')) ? intval($_POST['item']) : 0 );
+
+ $r = q("SELECT * FROM `item` WHERE `id` = %d AND `uid` = %d LIMIT 1",
+ intval($item),
+ intval(local_channel())
+ );
+
+ if(! $r)
+ goaway(z_root() . '/' . $_SESSION['photo_return']);
+
+ $r = fetch_post_tags($r,true);
+
+ $item = $r[0];
+ $new_tags = array();
+
+ if($item['term']) {
+ for($x = 0; $x < count($item['term']); $x ++) {
+ if($item['term'][$x]['term'] !== hex2bin($tag))
+ $new_tags[] = $item['term'][$x];
+ }
+ }
+
+ if($new_tags)
+ $item['term'] = $new_tags;
+ else
+ unset($item['term']);
+
+ item_store_update($item);
+
+ info( t('Tag removed') . EOL );
+ goaway(z_root() . '/' . $_SESSION['photo_return']);
+
+ // NOTREACHED
+
+ }
+
+
+
+ function get() {
+
+ if(! local_channel()) {
+ goaway(z_root() . '/' . $_SESSION['photo_return']);
+ // NOTREACHED
+ }
+
+ // remove tag on the fly if item and tag are provided
+ if((argc() == 4) && (argv(1) === 'drop') && intval(argv(2))) {
+
+ $item = intval(argv(2));
+ $tag = argv(3);
+
+ $r = q("SELECT * FROM `item` WHERE `id` = %d AND `uid` = %d LIMIT 1",
+ intval($item),
+ intval(local_channel())
+ );
+
+ if(! $r)
+ goaway(z_root() . '/' . $_SESSION['photo_return']);
+
+ $r = fetch_post_tags($r,true);
+
+ $item = $r[0];
+
+ $new_tags = array();
+
+ if($item['term']) {
+ for($x = 0; $x < count($item['term']); $x ++) {
+ if($item['term'][$x]['term'] !== hex2bin($tag))
+ $new_tags[] = $item['term'][$x];
+ }
+ }
+
+ if($new_tags)
+ $item['term'] = $new_tags;
+ else
+ unset($item['term']);
+
+ item_store_update($item);
+
+ info( t('Tag removed') . EOL );
+ goaway(z_root() . '/' . $_SESSION['photo_return']);
+
+ }
+
+ //if we got only the item print a list of tags to select
+ if((argc() == 3) && (argv(1) === 'drop') && intval(argv(2))) {
+
+ $o = '';
+
+ $item = intval(argv(2));
+
+ $r = q("SELECT * FROM `item` WHERE `id` = %d AND `uid` = %d LIMIT 1",
+ intval($item),
+ intval(local_channel())
+ );
+
+ if(! $r)
+ goaway(z_root() . '/' . $_SESSION['photo_return']);
+
+ $r = fetch_post_tags($r,true);
+
+ if(! count($r[0]['term']))
+ goaway(z_root() . '/' . $_SESSION['photo_return']);
+
+ $o .= '<h3>' . t('Remove Item Tag') . '</h3>';
+
+ $o .= '<p id="tag-remove-desc">' . t('Select a tag to remove: ') . '</p>';
+
+ $o .= '<form id="tagrm" action="tagrm" method="post" >';
+ $o .= '<input type="hidden" name="item" value="' . $item . '" />';
+ $o .= '<ul>';
+
+
+ foreach($r[0]['term'] as $x) {
+ $o .= '<li><input type="checkbox" name="tag" value="' . bin2hex($x['term']) . '" >' . bbcode($x['term']) . '</input></li>';
+ }
+
+ $o .= '</ul>';
+ $o .= '<input id="tagrm-submit" type="submit" name="submit" value="' . t('Remove') .'" />';
+ $o .= '<input id="tagrm-cancel" type="submit" name="submit" value="' . t('Cancel') .'" />';
+ $o .= '</form>';
+
+ return $o;
+
+ }
+
+ }
+
+}
diff --git a/Zotlabs/Module/Tasks.php b/Zotlabs/Module/Tasks.php
new file mode 100644
index 000000000..ab05f8be9
--- /dev/null
+++ b/Zotlabs/Module/Tasks.php
@@ -0,0 +1,112 @@
+<?php
+namespace Zotlabs\Module;
+
+require_once('include/event.php');
+
+
+
+class Tasks extends \Zotlabs\Web\Controller {
+
+ function init() {
+
+
+ // logger('request: ' . print_r($_REQUEST,true));
+
+ $arr = array();
+
+ if(argc() > 1 && argv(1) === 'fetch') {
+ if(argc() > 2 && argv(2) === 'all')
+ $arr['all'] = 1;
+
+ $x = tasks_fetch($arr);
+ if($x['tasks']) {
+ $x['html'] = '';
+ foreach($x['tasks'] as $y) {
+ $x['html'] .= '<div class="tasklist-item"><input type="checkbox" onchange="taskComplete(' . $y['id'] . '); return false;" /> ' . $y['summary'] . '</div>';
+ }
+ }
+ json_return_and_die($x);
+ }
+
+ }
+
+
+
+ function post() {
+
+
+ // logger('post: ' . print_r($_POST,true));
+
+
+ if(! local_channel())
+ return;
+
+ $channel = \App::get_channel();
+
+ if((argc() > 2) && (argv(1) === 'complete') && intval(argv(2))) {
+ $ret = array('success' => false);
+ $r = q("select * from event where `type` = 'task' and uid = %d and id = %d limit 1",
+ intval(local_channel()),
+ intval(argv(2))
+ );
+ if($r) {
+ $event = $r[0];
+ if($event['event_status'] === 'COMPLETED') {
+ $event['event_status'] = 'IN-PROCESS';
+ $event['event_status_date'] = NULL_DATE;
+ $event['event_percent'] = 0;
+ $event['event_sequence'] = $event['event_sequence'] + 1;
+ $event['edited'] = datetime_convert();
+ }
+ else {
+ $event['event_status'] = 'COMPLETED';
+ $event['event_status_date'] = datetime_convert();
+ $event['event_percent'] = 100;
+ $event['event_sequence'] = $event['event_sequence'] + 1;
+ $event['edited'] = datetime_convert();
+ }
+ $x = event_store_event($event);
+ if($x)
+ $ret['success'] = true;
+ }
+ json_return_and_die($ret);
+ }
+
+ if(argc() == 2 && argv(1) === 'new') {
+ $text = escape_tags(trim($_REQUEST['summary']));
+ if(! $text)
+ return array('success' => false);
+ $event = array();
+ $event['account'] = $channel['channel_account_id'];
+ $event['uid'] = $channel['channel_id'];
+ $event['event_xchan'] = $channel['channel_hash'];
+ $event['type'] = 'task';
+ $event['nofinish'] = true;
+ $event['created'] = $event['edited'] = $event['start'] = datetime_convert();
+ $event['adjust'] = 1;
+ $event['allow_cid'] = '<' . $channel['channel_hash'] . '>';
+ $event['summary'] = escape_tags($_REQUEST['summary']);
+ $x = event_store_event($event);
+ if($x)
+ $x['success'] = true;
+ else
+ $x = array('success' => false);
+ json_return_and_die($x);
+ }
+
+
+ }
+
+
+
+
+
+ function get() {
+
+ if(! local_channel())
+ return;
+
+
+ return '';
+ }
+}
diff --git a/Zotlabs/Module/Thing.php b/Zotlabs/Module/Thing.php
new file mode 100644
index 000000000..e95ec53f6
--- /dev/null
+++ b/Zotlabs/Module/Thing.php
@@ -0,0 +1,368 @@
+<?php
+namespace Zotlabs\Module;
+/**
+ * @file mod/thing.php
+ * @brief
+ */
+
+require_once('include/items.php');
+require_once('include/security.php');
+require_once('include/contact_selectors.php');
+require_once('include/acl_selectors.php');
+
+
+class Thing extends \Zotlabs\Web\Controller {
+
+ function init() {
+
+ if(! local_channel())
+ return;
+
+ $channel = \App::get_channel();
+
+ $term_hash = (($_REQUEST['term_hash']) ? $_REQUEST['term_hash'] : '');
+
+ $name = escape_tags($_REQUEST['term']);
+ $verb = escape_tags($_REQUEST['verb']);
+ $activity = intval($_REQUEST['activity']);
+ $profile_guid = escape_tags($_REQUEST['profile_assign']);
+ $url = $_REQUEST['link'];
+ $photo = $_REQUEST['img'];
+
+ $hash = random_string();
+
+ $verbs = obj_verbs();
+
+ /**
+ * verbs: [0] = first person singular, e.g. "I want", [1] = 3rd person singular, e.g. "Bill wants"
+ * We use the first person form when creating an activity, but the third person for use in activities
+ * @FIXME There is no accounting for verb gender for languages where this is significant. We may eventually
+ * require obj_verbs() to provide full conjugations and specify which form to use in the $_REQUEST params to this module.
+ */
+
+ $translated_verb = $verbs[$verb][1];
+
+ /*
+ * The site administrator can do things that normals cannot.
+ * This is restricted because it will likely cause
+ * an activitystreams protocol violation and the activity might
+ * choke in some other network and result in unnecessary
+ * support requests. It isn't because we're trying to be heavy-handed
+ * about what you can and can't do.
+ */
+
+ if(! $translated_verb) {
+ if(is_site_admin())
+ $translated_verb = $verb;
+ }
+
+ /*
+ * Things, objects: We do not provide definite (a, an) or indefinite (the) articles or singular/plural designators
+ * That needs to be specified in your thing. e.g. Mike has "a carrot", Greg wants "balls", Bob likes "the Boston Red Sox".
+ */
+
+ /*
+ * Future work on this module might produce more complex activities with targets, e.g. Phillip likes Karen's moustache
+ * and to describe other non-thing objects like channels, such as Karl wants Susan - where Susan represents a channel profile.
+ */
+
+ if((! $name) || (! $translated_verb))
+ return;
+
+ $acl = new \Zotlabs\Access\AccessList($channel);
+
+ if(array_key_exists('contact_allow',$_REQUEST)
+ || array_key_exists('group_allow',$_REQUEST)
+ || array_key_exists('contact_deny',$_REQUEST)
+ || array_key_exists('group_deny',$_REQUEST)) {
+ $acl->set_from_array($_REQUEST);
+ }
+
+ $x = $acl->get();
+
+ if($term_hash) {
+ $t = q("select * from obj where obj_obj = '%s' and obj_channel = %d limit 1",
+ dbesc($term_hash),
+ intval(local_channel())
+ );
+ if(! $t) {
+ notice( t('Item not found.') . EOL);
+ return;
+ }
+ $orig_record = $t[0];
+ if($photo != $orig_record['obj_imgurl']) {
+ $arr = import_xchan_photo($photo,get_observer_hash(),true);
+ $local_photo = $arr[0];
+ $local_photo_type = $arr[3];
+ }
+ else
+ $local_photo = $orig_record['obj_imgurl'];
+
+ $r = q("update obj set obj_term = '%s', obj_url = '%s', obj_imgurl = '%s', obj_edited = '%s', allow_cid = '%s', allow_gid = '%s', deny_cid = '%s', deny_gid = '%s' where obj_obj = '%s' and obj_channel = %d ",
+ dbesc($name),
+ dbesc(($url) ? $url : z_root() . '/thing/' . $term_hash),
+ dbesc($local_photo),
+ dbesc(datetime_convert()),
+ dbesc($x['allow_cid']),
+ dbesc($x['allow_gid']),
+ dbesc($x['deny_cid']),
+ dbesc($x['deny_gid']),
+ dbesc($term_hash),
+ intval(local_channel())
+ );
+
+ info( t('Thing updated') . EOL);
+
+ $r = q("select * from obj where obj_channel = %d and obj_obj = '%s' limit 1",
+ intval(local_channel()),
+ dbesc($term_hash)
+ );
+ if($r) {
+ build_sync_packet(0, array('obj' => $r));
+ }
+
+ return;
+ }
+
+ $sql = (($profile_guid) ? " and profile_guid = '" . dbesc($profile_guid) . "' " : " and is_default = 1 ");
+ $p = q("select profile_guid, is_default from profile where uid = %d $sql limit 1",
+ intval(local_channel())
+ );
+
+ if($p)
+ $profile = $p[0];
+ else
+ return;
+
+ $local_photo = null;
+
+ if($photo) {
+ $arr = import_xchan_photo($photo,get_observer_hash(),true);
+ $local_photo = $arr[0];
+ $local_photo_type = $arr[3];
+ }
+
+ $created = datetime_convert();
+ $url = (($url) ? $url : z_root() . '/thing/' . $hash);
+
+ $r = q("insert into obj ( obj_page, obj_verb, obj_type, obj_channel, obj_obj, obj_term, obj_url, obj_imgurl, obj_created, obj_edited, allow_cid, allow_gid, deny_cid, deny_gid ) values ('%s','%s', %d, %d, '%s','%s','%s','%s','%s','%s','%s','%s','%s','%s') ",
+ dbesc($profile['profile_guid']),
+ dbesc($verb),
+ intval(TERM_OBJ_THING),
+ intval(local_channel()),
+ dbesc($hash),
+ dbesc($name),
+ dbesc($url),
+ dbesc(($photo) ? $local_photo : ''),
+ dbesc($created),
+ dbesc($created),
+ dbesc($x['allow_cid']),
+ dbesc($x['allow_gid']),
+ dbesc($x['deny_cid']),
+ dbesc($x['deny_gid'])
+ );
+
+ if(! $r) {
+ notice( t('Object store: failed'));
+ return;
+ }
+
+ info( t('Thing added'));
+
+ $r = q("select * from obj where obj_channel = %d and obj_obj = '%s' limit 1",
+ intval(local_channel()),
+ dbesc($hash)
+ );
+ if($r) {
+ build_sync_packet(0, array('obj' => $r));
+ }
+
+ if($activity) {
+ $arr = array();
+ $links = array(array('rel' => 'alternate','type' => 'text/html', 'href' => $url));
+ if($local_photo)
+ $links[] = array('rel' => 'photo', 'type' => $local_photo_type, 'href' => $local_photo);
+
+ $objtype = ACTIVITY_OBJ_THING;
+
+ $obj = json_encode(array(
+ 'type' => $objtype,
+ 'id' => $url,
+ 'link' => $links,
+ 'title' => $name,
+ 'content' => $name
+ ));
+
+ $bodyverb = str_replace('OBJ: ', '',t('OBJ: %1$s %2$s %3$s'));
+
+ $arr['owner_xchan'] = $channel['channel_hash'];
+ $arr['author_xchan'] = $channel['channel_hash'];
+
+ $arr['item_origin'] = 1;
+ $arr['item_wall'] = 1;
+ $arr['item_thread_top'] = 1;
+
+ $ulink = '[zrl=' . $channel['xchan_url'] . ']' . $channel['channel_name'] . '[/zrl]';
+ $plink = '[zrl=' . $url . ']' . $name . '[/zrl]';
+
+ $arr['body'] = sprintf( $bodyverb, $ulink, $translated_verb, $plink );
+
+ if($local_photo)
+ $arr['body'] .= "\n\n[zmg]" . $local_photo . "[/zmg]";
+
+ $arr['verb'] = $verb;
+ $arr['obj_type'] = $objtype;
+ $arr['object'] = $obj;
+
+ if(! $profile['is_default']) {
+ $arr['item_private'] = true;
+ $str = '';
+ $r = q("select abook_xchan from abook where abook_channel = %d and abook_profile = '%s'",
+ intval(local_channel()),
+ dbesc($profile_guid)
+ );
+ if($r) {
+ $arr['allow_cid'] = '';
+ foreach($r as $rr)
+ $arr['allow_cid'] .= '<' . $rr['abook_xchan'] . '>';
+ }
+ else
+ $arr['allow_cid'] = '<' . get_observer_hash() . '>';
+ }
+
+ $ret = post_activity_item($arr);
+ }
+ }
+
+
+ function get() {
+
+ // @FIXME one problem with things is we can't share them unless we provide the channel in the url
+ // so we can definitively lookup the owner.
+
+ if(argc() == 2) {
+
+ $r = q("select obj_channel from obj where obj_type = %d and obj_obj = '%s' limit 1",
+ intval(TERM_OBJ_THING),
+ dbesc(argv(1))
+ );
+ if($r)
+ $sql_extra = permissions_sql($r[0]['obj_channel']);
+
+ $r = q("select * from obj where obj_type = %d and obj_obj = '%s' $sql_extra limit 1",
+ intval(TERM_OBJ_THING),
+ dbesc(argv(1))
+ );
+
+ if($r) {
+ return replace_macros(get_markup_template('show_thing.tpl'), array(
+ '$header' => t('Show Thing'),
+ '$edit' => t('Edit'),
+ '$delete' => t('Delete'),
+ '$canedit' => ((local_channel() && local_channel() == $r[0]['obj_channel']) ? true : false),
+ '$thing' => $r[0] ));
+ }
+ else {
+ notice( t('item not found.') . EOL);
+ return;
+ }
+ }
+
+ $channel = \App::get_channel();
+
+ if(! (local_channel() && $channel)) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ $acl = new \Zotlabs\Access\AccessList($channel);
+ $channel_acl = $acl->get();
+
+ $lockstate = (($acl->is_private()) ? 'lock' : 'unlock');
+
+ $thing_hash = '';
+
+ if(argc() == 3 && argv(1) === 'edit') {
+ $thing_hash = argv(2);
+
+ $r = q("select * from obj where obj_type = %d and obj_obj = '%s' limit 1",
+ intval(TERM_OBJ_THING),
+ dbesc($thing_hash)
+ );
+
+ if((! $r) || ($r[0]['obj_channel'] != local_channel())) {
+ notice( t('Permission denied.') . EOL);
+ return '';
+ }
+
+ $o .= replace_macros(get_markup_template('thing_edit.tpl'),array(
+ '$thing_hdr' => t('Edit Thing'),
+ '$multiprof' => feature_enabled(local_channel(),'multi_profiles'),
+ '$profile_lbl' => t('Select a profile'),
+ '$profile_select' => contact_profile_assign($r[0]['obj_page']),
+ '$verb_lbl' => $channel['channel_name'],
+ '$verb_select' => obj_verb_selector($r[0]['obj_verb']),
+ '$activity' => array('activity',t('Post an activity'),true,t('Only sends to viewers of the applicable profile')),
+ '$thing_hash' => $thing_hash,
+ '$thing_lbl' => t('Name of thing e.g. something'),
+ '$thething' => $r[0]['obj_term'],
+ '$url_lbl' => t('URL of thing (optional)'),
+ '$theurl' => $r[0]['obj_url'],
+ '$img_lbl' => t('URL for photo of thing (optional)'),
+ '$imgurl' => $r[0]['obj_imgurl'],
+ '$permissions' => t('Permissions'),
+ '$aclselect' => populate_acl($channel_acl,false),
+ '$lockstate' => $lockstate,
+ '$submit' => t('Submit')
+ ));
+
+ return $o;
+ }
+
+ if(argc() == 3 && argv(1) === 'drop') {
+ $thing_hash = argv(2);
+
+ $r = q("select * from obj where obj_type = %d and obj_obj = '%s' limit 1",
+ intval(TERM_OBJ_THING),
+ dbesc($thing_hash)
+ );
+
+ if((! $r) || ($r[0]['obj_channel'] != local_channel())) {
+ notice( t('Permission denied.') . EOL);
+ return '';
+ }
+
+ $x = q("delete from obj where obj_obj = '%s' and obj_type = %d and obj_channel = %d",
+ dbesc($thing_hash),
+ intval(TERM_OBJ_THING),
+ intval(local_channel())
+ );
+
+ $r[0]['obj_deleted'] = 1;
+
+ build_sync_packet(0,array('obj' => $r));
+
+ return $o;
+ }
+
+ $o .= replace_macros(get_markup_template('thing_input.tpl'),array(
+ '$thing_hdr' => t('Add Thing to your Profile'),
+ '$multiprof' => feature_enabled(local_channel(),'multi_profiles'),
+ '$profile_lbl' => t('Select a profile'),
+ '$profile_select' => contact_profile_assign(''),
+ '$verb_lbl' => $channel['channel_name'],
+ '$activity' => array('activity',t('Post an activity'),((array_key_exists('activity',$_REQUEST)) ? $_REQUEST['activity'] : true),t('Only sends to viewers of the applicable profile')),
+ '$verb_select' => obj_verb_selector(),
+ '$thing_lbl' => t('Name of thing e.g. something'),
+ '$url_lbl' => t('URL of thing (optional)'),
+ '$img_lbl' => t('URL for photo of thing (optional)'),
+ '$permissions' => t('Permissions'),
+ '$aclselect' => populate_acl($channel_acl,false),
+ '$lockstate' => $lockstate,
+ '$submit' => t('Submit')
+ ));
+
+ return $o;
+ }
+
+}
diff --git a/Zotlabs/Module/Toggle_mobile.php b/Zotlabs/Module/Toggle_mobile.php
new file mode 100644
index 000000000..9d90c0821
--- /dev/null
+++ b/Zotlabs/Module/Toggle_mobile.php
@@ -0,0 +1,23 @@
+<?php
+namespace Zotlabs\Module;
+
+
+class Toggle_mobile extends \Zotlabs\Web\Controller {
+
+ function init() {
+
+ if(isset($_GET['off']))
+ $_SESSION['show_mobile'] = false;
+ else
+ $_SESSION['show_mobile'] = true;
+
+ if(isset($_GET['address']))
+ $address = $_GET['address'];
+ else
+ $address = z_root();
+
+ goaway($address);
+ }
+
+
+}
diff --git a/Zotlabs/Module/Toggle_safesearch.php b/Zotlabs/Module/Toggle_safesearch.php
new file mode 100644
index 000000000..2e9bc2575
--- /dev/null
+++ b/Zotlabs/Module/Toggle_safesearch.php
@@ -0,0 +1,31 @@
+<?php
+namespace Zotlabs\Module;
+
+
+class Toggle_safesearch extends \Zotlabs\Web\Controller {
+
+ function init() {
+
+ $observer = get_observer_hash();
+ if (! $observer)
+ return;
+
+ if($observer)
+ $safe_mode = get_xconfig($observer,'directory','safe_mode');
+ if ($safe_mode == '')
+ set_xconfig($observer,'directory','safe_mode', '0');
+ elseif($safe_mode == '0')
+ set_xconfig($observer,'directory','safe_mode', '1');
+ elseif($safe_mode == '1')
+ set_xconfig($observer,'directory','safe_mode', '0');
+
+ if(isset($_GET['address']))
+ $address = $_GET['address'];
+ else
+ $address = z_root() . '/directory';
+
+ goaway($address);
+ }
+
+
+}
diff --git a/Zotlabs/Module/Uexport.php b/Zotlabs/Module/Uexport.php
new file mode 100644
index 000000000..ada7e0986
--- /dev/null
+++ b/Zotlabs/Module/Uexport.php
@@ -0,0 +1,71 @@
+<?php
+namespace Zotlabs\Module;
+
+
+class Uexport extends \Zotlabs\Web\Controller {
+
+ function init() {
+ if(! local_channel())
+ killme();
+
+ if(argc() > 1) {
+ $channel = \App::get_channel();
+
+ require_once('include/identity.php');
+
+ if(argc() > 1 && intval(argv(1)) > 1900) {
+ $year = intval(argv(1));
+ }
+
+ if(argc() > 2 && intval(argv(2)) > 0 && intval(argv(2)) <= 12) {
+ $month = intval(argv(2));
+ }
+
+ header('content-type: application/octet_stream');
+ header('content-disposition: attachment; filename="' . $channel['channel_address'] . (($year) ? '-' . $year : '') . (($month) ? '-' . $month : '') . '.json"' );
+
+ if($year) {
+ echo json_encode(identity_export_year(local_channel(),$year,$month));
+ killme();
+ }
+
+ if(argc() > 1 && argv(1) === 'basic') {
+ echo json_encode(identity_basic_export(local_channel()));
+ killme();
+ }
+
+ // FIXME - this basically doesn't work in the wild with a channel more than a few months old due to memory and execution time limits.
+ // It probably needs to be built at the CLI and offered to download as a tarball. Maybe stored in the members dav.
+
+ if(argc() > 1 && argv(1) === 'complete') {
+ echo json_encode(identity_basic_export(local_channel(),true));
+ killme();
+ }
+ }
+ }
+
+ function get() {
+
+ $y = datetime_convert('UTC',date_default_timezone_get(),'now','Y');
+
+ $yearurl = z_root() . '/uexport/' . $y;
+ $janurl = z_root() . '/uexport/' . $y . '/1';
+ $impurl = '/import_items';
+ $o = replace_macros(get_markup_template('uexport.tpl'), array(
+ '$title' => t('Export Channel'),
+ '$basictitle' => t('Export Channel'),
+ '$basic' => t('Export your basic channel information to a file. This acts as a backup of your connections, permissions, profile and basic data, which can be used to import your data to a new server hub, but does not contain your content.'),
+ '$fulltitle' => t('Export Content'),
+ '$full' => t('Export your channel information and recent content to a JSON backup that can be restored or imported to another server hub. This backs up all of your connections, permissions, profile data and several months of posts. This file may be VERY large. Please be patient - it may take several minutes for this download to begin.'),
+ '$by_year' => t('Export your posts from a given year.'),
+
+ '$extra' => t('You may also export your posts and conversations for a particular year or month. Adjust the date in your browser location bar to select other dates. If the export fails (possibly due to memory exhaustion on your server hub), please try again selecting a more limited date range.'),
+ '$extra2' => sprintf( t('To select all posts for a given year, such as this year, visit <a href="%1$s">%2$s</a>'),$yearurl,$yearurl),
+ '$extra3' => sprintf( t('To select all posts for a given month, such as January of this year, visit <a href="%1$s">%2$s</a>'),$janurl,$janurl),
+ '$extra4' => sprintf( t('These content files may be imported or restored by visiting <a href="%1$s">%2$s</a> on any site containing your channel. For best results please import or restore these in date order (oldest first).'),$impurl,$impurl)
+
+ ));
+ return $o;
+ }
+
+}
diff --git a/mod/update_channel.php b/Zotlabs/Module/Update_channel.php
index 63a3735ea..b1b2d5103 100644
--- a/mod/update_channel.php
+++ b/Zotlabs/Module/Update_channel.php
@@ -1,5 +1,7 @@
<?php
+namespace Zotlabs\Module;
+
/**
* Module: update_profile
* Purpose: AJAX synchronisation of profile page
@@ -7,9 +9,9 @@
*/
-require_once('mod/channel.php');
+class Update_channel extends \Zotlabs\Web\Controller {
-function update_channel_content(&$a) {
+function get() {
$profile_uid = intval($_GET['p']);
$load = (((argc() > 1) && (argv(1) == 'load')) ? 1 : 0);
@@ -33,7 +35,9 @@ function update_channel_content(&$a) {
*
*/
- $text = channel_content($a,$profile_uid,$load);
+ $mod = new Channel();
+
+ $text = $mod->get($profile_uid,$load);
$pattern = "/<img([^>]*) src=\"([^\"]*)\"/";
$replace = "<img\${1} dst=\"\${2}\"";
@@ -62,4 +66,5 @@ function update_channel_content(&$a) {
echo "</body></html>\r\n";
killme();
+}
} \ No newline at end of file
diff --git a/Zotlabs/Module/Update_display.php b/Zotlabs/Module/Update_display.php
new file mode 100644
index 000000000..13b04204d
--- /dev/null
+++ b/Zotlabs/Module/Update_display.php
@@ -0,0 +1,48 @@
+<?php
+namespace Zotlabs\Module;
+
+// See update_profile.php for documentation
+
+require_once('include/group.php');
+
+
+class Update_display extends \Zotlabs\Web\Controller {
+
+ function get() {
+
+ $profile_uid = intval($_GET['p']);
+ if(! $profile_uid)
+ $profile_uid = (-1);
+ $load = (((argc() > 1) && (argv(1) == 'load')) ? 1 : 0);
+ header("Content-type: text/html");
+ echo "<!DOCTYPE html><html><body>\r\n";
+ echo (($_GET['msie'] == 1) ? '<div>' : '<section>');
+
+ $mod = new Display();
+ $text = $mod->get($profile_uid, $load);
+
+ $pattern = "/<img([^>]*) src=\"([^\"]*)\"/";
+ $replace = "<img\${1} dst=\"\${2}\"";
+ // $text = preg_replace($pattern, $replace, $text);
+ /*
+ if(! $load) {
+ $replace = '<br />' . t('[Embedded content - reload page to view]') . '<br />';
+ $pattern = "/<\s*audio[^>]*>(.*?)<\s*\/\s*audio>/i";
+ $text = preg_replace($pattern, $replace, $text);
+ $pattern = "/<\s*video[^>]*>(.*?)<\s*\/\s*video>/i";
+ $text = preg_replace($pattern, $replace, $text);
+ $pattern = "/<\s*embed[^>]*>(.*?)<\s*\/\s*embed>/i";
+ $text = preg_replace($pattern, $replace, $text);
+ $pattern = "/<\s*iframe[^>]*>(.*?)<\s*\/\s*iframe>/i";
+ $text = preg_replace($pattern, $replace, $text);
+ }
+ */
+ echo str_replace("\t",' ',$text);
+ echo (($_GET['msie'] == 1) ? '</div>' : '</section>');
+ echo "</body></html>\r\n";
+ // logger('update_display: ' . $text);
+ killme();
+
+ }
+
+}
diff --git a/Zotlabs/Module/Update_home.php b/Zotlabs/Module/Update_home.php
new file mode 100644
index 000000000..0f699482e
--- /dev/null
+++ b/Zotlabs/Module/Update_home.php
@@ -0,0 +1,42 @@
+<?php
+namespace Zotlabs\Module;
+
+// See update_profile.php for documentation
+
+class Update_home extends \Zotlabs\Web\Controller {
+
+ function get() {
+
+ $profile_uid = ((intval($_GET['p'])) ? intval($_GET['p']) : (-1));
+ $load = (((argc() > 1) && (argv(1) == 'load')) ? 1 : 0);
+ header("Content-type: text/html");
+ echo "<!DOCTYPE html><html><body>\r\n";
+ echo ((array_key_exists('msie',$_GET) && $_GET['msie'] == 1) ? '<div>' : '<section>');
+
+ $mod = new Home();
+ $text = $mod->get($profile_uid, $load);
+
+ $pattern = "/<img([^>]*) src=\"([^\"]*)\"/";
+ $replace = "<img\${1} dst=\"\${2}\"";
+ // $text = preg_replace($pattern, $replace, $text);
+ /*
+ if(! $load) {
+ $replace = '<br />' . t('[Embedded content - reload page to view]') . '<br />';
+ $pattern = "/<\s*audio[^>]*>(.*?)<\s*\/\s*audio>/i";
+ $text = preg_replace($pattern, $replace, $text);
+ $pattern = "/<\s*video[^>]*>(.*?)<\s*\/\s*video>/i";
+ $text = preg_replace($pattern, $replace, $text);
+ $pattern = "/<\s*embed[^>]*>(.*?)<\s*\/\s*embed>/i";
+ $text = preg_replace($pattern, $replace, $text);
+ $pattern = "/<\s*iframe[^>]*>(.*?)<\s*\/\s*iframe>/i";
+ $text = preg_replace($pattern, $replace, $text);
+ }
+ */
+ echo str_replace("\t",' ',$text);
+ echo ((array_key_exists('msie',$_GET) && $_GET['msie'] == 1) ? '</div>' : '</section>');
+ echo "</body></html>\r\n";
+ // logger('update_home: ' . $text);
+ killme();
+
+ }
+}
diff --git a/Zotlabs/Module/Update_network.php b/Zotlabs/Module/Update_network.php
new file mode 100644
index 000000000..c27b7614a
--- /dev/null
+++ b/Zotlabs/Module/Update_network.php
@@ -0,0 +1,44 @@
+<?php
+namespace Zotlabs\Module;
+
+// See update_profile.php for documentation
+
+require_once('include/group.php');
+
+class Update_network extends \Zotlabs\Web\Controller {
+
+ function get() {
+
+ $profile_uid = intval($_GET['p']);
+ $load = (((argc() > 1) && (argv(1) == 'load')) ? 1 : 0);
+ header("Content-type: text/html");
+ echo "<!DOCTYPE html><html><body>\r\n";
+ echo ((array_key_exists('msie',$_GET) && $_GET['msie'] == 1) ? '<div>' : '<section>');
+
+ $mod = new Network();
+ $text = $mod->get($profile_uid, $load);
+
+ $pattern = "/<img([^>]*) src=\"([^\"]*)\"/";
+ $replace = "<img\${1} dst=\"\${2}\"";
+ // $text = preg_replace($pattern, $replace, $text);
+ /*
+ if(! $load) {
+ $replace = '<br />' . t('[Embedded content - reload page to view]') . '<br />';
+ $pattern = "/<\s*audio[^>]*>(.*?)<\s*\/\s*audio>/i";
+ $text = preg_replace($pattern, $replace, $text);
+ $pattern = "/<\s*video[^>]*>(.*?)<\s*\/\s*video>/i";
+ $text = preg_replace($pattern, $replace, $text);
+ $pattern = "/<\s*embed[^>]*>(.*?)<\s*\/\s*embed>/i";
+ $text = preg_replace($pattern, $replace, $text);
+ $pattern = "/<\s*iframe[^>]*>(.*?)<\s*\/\s*iframe>/i";
+ $text = preg_replace($pattern, $replace, $text);
+ }
+ */
+ echo str_replace("\t",' ',$text);
+ echo ((array_key_exists('msie',$_GET) && $_GET['msie'] == 1) ? '</div>' : '</section>');
+ echo "</body></html>\r\n";
+ // logger('update_network: ' . $text);
+ killme();
+
+ }
+}
diff --git a/Zotlabs/Module/Update_pubstream.php b/Zotlabs/Module/Update_pubstream.php
new file mode 100644
index 000000000..153db56ba
--- /dev/null
+++ b/Zotlabs/Module/Update_pubstream.php
@@ -0,0 +1,42 @@
+<?php
+namespace Zotlabs\Module;
+
+// See update_profile.php for documentation
+
+
+class Update_pubstream extends \Zotlabs\Web\Controller {
+
+ function get() {
+
+ $profile_uid = ((intval($_GET['p'])) ? intval($_GET['p']) : (-1));
+ $load = (((argc() > 1) && (argv(1) == 'load')) ? 1 : 0);
+ header("Content-type: text/html");
+ echo "<!DOCTYPE html><html><body>\r\n";
+ echo ((array_key_exists('msie',$_GET) && $_GET['msie'] == 1) ? '<div>' : '<section>');
+
+ $mod = new Pubstream();
+ $text = $mod->get($profile_uid, $load);
+
+ $pattern = "/<img([^>]*) src=\"([^\"]*)\"/";
+ $replace = "<img\${1} dst=\"\${2}\"";
+ // $text = preg_replace($pattern, $replace, $text);
+ /*
+ if(! $load) {
+ $replace = '<br />' . t('[Embedded content - reload page to view]') . '<br />';
+ $pattern = "/<\s*audio[^>]*>(.*?)<\s*\/\s*audio>/i";
+ $text = preg_replace($pattern, $replace, $text);
+ $pattern = "/<\s*video[^>]*>(.*?)<\s*\/\s*video>/i";
+ $text = preg_replace($pattern, $replace, $text);
+ $pattern = "/<\s*embed[^>]*>(.*?)<\s*\/\s*embed>/i";
+ $text = preg_replace($pattern, $replace, $text);
+ $pattern = "/<\s*iframe[^>]*>(.*?)<\s*\/\s*iframe>/i";
+ $text = preg_replace($pattern, $replace, $text);
+ }
+ */
+ echo str_replace("\t",' ',$text);
+ echo ((array_key_exists('msie',$_GET) && $_GET['msie'] == 1) ? '</div>' : '</section>');
+ echo "</body></html>\r\n";
+ killme();
+
+ }
+}
diff --git a/Zotlabs/Module/Update_search.php b/Zotlabs/Module/Update_search.php
new file mode 100644
index 000000000..4491f40f4
--- /dev/null
+++ b/Zotlabs/Module/Update_search.php
@@ -0,0 +1,69 @@
+<?php
+namespace Zotlabs\Module;
+
+/**
+ * Module: update_profile
+ * Purpose: AJAX synchronisation of search page
+ *
+ */
+
+
+class Update_search extends \Zotlabs\Web\Controller {
+
+ function get() {
+
+ $profile_uid = intval($_GET['p']);
+ if(! $profile_uid)
+ $profile_uid = (-1);
+
+ $load = (((argc() > 1) && (argv(1) == 'load')) ? 1 : 0);
+
+ header("Content-type: text/html");
+ echo "<!DOCTYPE html><html><body>\r\n";
+
+ /**
+ * We can remove this hack once Internet Explorer recognises HTML5 natively
+ */
+
+ echo (($_GET['msie'] == 1) ? '<div>' : '<section>');
+
+ /**
+ *
+ * Grab the page inner contents by calling the content function from the profile module directly,
+ * but move any image src attributes to another attribute name. This is because
+ * some browsers will prefetch all the images for the page even if we don't need them.
+ * The only ones we need to fetch are those for new page additions, which we'll discover
+ * on the client side and then swap the image back.
+ *
+ */
+
+ $mod = new Search();
+ $text = $mod->get($profile_uid,$load);
+
+ $pattern = "/<img([^>]*) src=\"([^\"]*)\"/";
+ $replace = "<img\${1} dst=\"\${2}\"";
+ // $text = preg_replace($pattern, $replace, $text);
+ /*
+ if(! $load) {
+ $replace = '<br />' . t('[Embedded content - reload page to view]') . '<br />';
+ $pattern = "/<\s*audio[^>]*>(.*?)<\s*\/\s*audio>/i";
+ $text = preg_replace($pattern, $replace, $text);
+ $pattern = "/<\s*video[^>]*>(.*?)<\s*\/\s*video>/i";
+ $text = preg_replace($pattern, $replace, $text);
+ $pattern = "/<\s*embed[^>]*>(.*?)<\s*\/\s*embed>/i";
+ $text = preg_replace($pattern, $replace, $text);
+ $pattern = "/<\s*iframe[^>]*>(.*?)<\s*\/\s*iframe>/i";
+ $text = preg_replace($pattern, $replace, $text);
+ }
+ */
+ /**
+ * reportedly some versions of MSIE don't handle tabs in XMLHttpRequest documents very well
+ */
+
+ echo str_replace("\t",' ',$text);
+ echo (($_GET['msie'] == 1) ? '</div>' : '</section>');
+ echo "</body></html>\r\n";
+ killme();
+
+ }
+}
diff --git a/Zotlabs/Module/View.php b/Zotlabs/Module/View.php
new file mode 100644
index 000000000..85497a2a4
--- /dev/null
+++ b/Zotlabs/Module/View.php
@@ -0,0 +1,20 @@
+<?php
+namespace Zotlabs\Module;
+/**
+ * load view/theme/$current_theme/style.php with Hubzilla context
+ */
+
+
+class View extends \Zotlabs\Web\Controller {
+
+ function init() {
+ header("Content-Type: text/css");
+
+ $theme = argv(2);
+ $THEMEPATH = "view/theme/$theme";
+ if(file_exists("view/theme/$theme/php/style.php"))
+ require_once("view/theme/$theme/php/style.php");
+ killme();
+ }
+
+}
diff --git a/Zotlabs/Module/Viewconnections.php b/Zotlabs/Module/Viewconnections.php
new file mode 100644
index 000000000..726ef043b
--- /dev/null
+++ b/Zotlabs/Module/Viewconnections.php
@@ -0,0 +1,117 @@
+<?php
+namespace Zotlabs\Module;
+require_once('include/contact_selectors.php');
+require_once('include/Contact.php');
+
+
+class Viewconnections extends \Zotlabs\Web\Controller {
+
+ function init() {
+
+ if((get_config('system','block_public')) && (! local_channel()) && (! remote_channel())) {
+ return;
+ }
+ if(argc() > 1)
+ profile_load($a,argv(1));
+ }
+
+ function get() {
+
+ if((get_config('system','block_public')) && (! local_channel()) && (! remote_channel())) {
+ notice( t('Public access denied.') . EOL);
+ return;
+ }
+
+ if(((! count(\App::$profile)) || (\App::$profile['hide_friends']))) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ if(! perm_is_allowed(\App::$profile['uid'], get_observer_hash(),'view_contacts')) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ if(! $_REQUEST['aj'])
+ $_SESSION['return_url'] = \App::$query_string;
+
+
+ $is_owner = ((local_channel() && local_channel() == \App::$profile['uid']) ? true : false);
+
+ $abook_flags = " and abook_pending = 0 and abook_self = 0 ";
+ $sql_extra = '';
+
+ if(! $is_owner) {
+ $abook_flags = " and abook_hidden = 0 ";
+ $sql_extra = " and xchan_hidden = 0 ";
+ }
+
+ $r = q("SELECT count(*) as total FROM abook left join xchan on abook_xchan = xchan_hash where abook_channel = %d $abook_flags and xchan_orphan = 0 and xchan_deleted = 0 $sql_extra ",
+ intval(\App::$profile['uid'])
+ );
+ if($r) {
+ \App::set_pager_total($r[0]['total']);
+ }
+
+ $r = q("SELECT * FROM abook left join xchan on abook_xchan = xchan_hash where abook_channel = %d $abook_flags and xchan_orphan = 0 and xchan_deleted = 0 $sql_extra order by xchan_name LIMIT %d OFFSET %d ",
+ intval(\App::$profile['uid']),
+ intval(\App::$pager['itemspage']),
+ intval(\App::$pager['start'])
+ );
+
+ if((! $r) && (! $_REQUEST['aj'])) {
+ info( t('No connections.') . EOL );
+ return $o;
+ }
+
+ $contacts = array();
+
+ foreach($r as $rr) {
+
+ $url = chanlink_url($rr['xchan_url']);
+ if($url) {
+ $contacts[] = array(
+ 'id' => $rr['abook_id'],
+ 'archived' => (intval($rr['abook_archived']) ? true : false),
+ 'img_hover' => sprintf( t('Visit %s\'s profile [%s]'), $rr['xchan_name'], $rr['xchan_url']),
+ 'thumb' => $rr['xchan_photo_m'],
+ 'name' => substr($rr['xchan_name'],0,20),
+ 'username' => $rr['xchan_addr'],
+ 'link' => $url,
+ 'sparkle' => '',
+ 'itemurl' => $rr['url'],
+ 'network' => '',
+ );
+ }
+ }
+
+
+ if($_REQUEST['aj']) {
+ if($contacts) {
+ $o = replace_macros(get_markup_template('viewcontactsajax.tpl'),array(
+ '$contacts' => $contacts
+ ));
+ }
+ else {
+ $o = '<div id="content-complete"></div>';
+ }
+ echo $o;
+ killme();
+ }
+ else {
+ $o .= "<script> var page_query = '" . $_GET['q'] . "'; var extra_args = '" . extra_query_args() . "' ; </script>";
+ $tpl = get_markup_template("viewcontact_template.tpl");
+ $o .= replace_macros($tpl, array(
+ '$title' => t('View Connections'),
+ '$contacts' => $contacts,
+ // '$paginate' => paginate($a),
+ ));
+ }
+
+ if(! $contacts)
+ $o .= '<div id="content-complete"></div>';
+
+ return $o;
+ }
+
+}
diff --git a/Zotlabs/Module/Viewsrc.php b/Zotlabs/Module/Viewsrc.php
new file mode 100644
index 000000000..63cc5e717
--- /dev/null
+++ b/Zotlabs/Module/Viewsrc.php
@@ -0,0 +1,53 @@
+<?php
+namespace Zotlabs\Module;
+
+
+
+class Viewsrc extends \Zotlabs\Web\Controller {
+
+ function get() {
+
+ $o = '';
+
+ $sys = get_sys_channel();
+
+ $item_id = ((argc() > 1) ? intval(argv(1)) : 0);
+ $json = ((argc() > 2 && argv(2) === 'json') ? true : false);
+
+ if(! local_channel()) {
+ notice( t('Permission denied.') . EOL);
+ }
+
+
+ if(! $item_id) {
+ \App::$error = 404;
+ notice( t('Item not found.') . EOL);
+ }
+
+ $item_normal = item_normal();
+
+ if(local_channel() && $item_id) {
+ $r = q("select id, item_flags, item_obscured, body from item where uid in (%d , %d) and id = %d $item_normal limit 1",
+ intval(local_channel()),
+ intval($sys['channel_id']),
+ intval($item_id)
+ );
+
+ if($r) {
+ if(intval($r[0]['item_obscured']))
+ $r[0]['body'] = crypto_unencapsulate(json_decode($r[0]['body'],true),get_config('system','prvkey'));
+ $o = (($json) ? json_encode($r[0]['body']) : str_replace("\n",'<br />',$r[0]['body']));
+ }
+ }
+
+ if(is_ajax()) {
+ print '<div><i class="icon-pencil"> ' . t('Source of Item') . ' ' . $r[0]['id'] . '</i></div>';
+ echo $o;
+ killme();
+ }
+
+ return $o;
+ }
+
+
+}
diff --git a/Zotlabs/Module/Wall_attach.php b/Zotlabs/Module/Wall_attach.php
new file mode 100644
index 000000000..5bdecfa75
--- /dev/null
+++ b/Zotlabs/Module/Wall_attach.php
@@ -0,0 +1,55 @@
+<?php
+namespace Zotlabs\Module;
+
+require_once('include/attach.php');
+require_once('include/identity.php');
+require_once('include/photos.php');
+
+
+class Wall_attach extends \Zotlabs\Web\Controller {
+
+ function post() {
+
+ $using_api = false;
+
+ if(\App::$data['api_info'] && array_key_exists('media',$_FILES)) {
+ $using_api = true;
+ $user_info = \App::$data['api_info'];
+ $nick = $user_info['screen_name'];
+ $channel = get_channel_by_nick($user_info['screen_name']);
+ }
+ elseif(argc() > 1)
+ $channel = get_channel_by_nick(argv(1));
+
+ if(! $channel)
+ killme();
+
+ $observer = \App::get_observer();
+
+
+ $def_album = get_pconfig($channel['channel_id'],'system','photo_path');
+ $def_attach = get_pconfig($channel['channel_id'],'system','attach_path');
+
+ $r = attach_store($channel,(($observer) ? $observer['xchan_hash'] : ''),'', array('source' => 'editor', 'visible' => 0, 'album' => $def_album, 'directory' => $def_attach, 'allow_cid' => '<' . $channel['channel_hash'] . '>'));
+
+ if(! $r['success']) {
+ notice( $r['message'] . EOL);
+ killme();
+ }
+
+ if(intval($r['data']['is_photo'])) {
+ $s = "\n\n" . $r['body'] . "\n\n";
+ }
+ else {
+ $s = "\n\n" . '[attachment]' . $r['data']['hash'] . ',' . $r['data']['revision'] . '[/attachment]' . "\n";
+ }
+
+ if($using_api)
+ return $s;
+
+ echo $s;
+ killme();
+
+ }
+
+}
diff --git a/Zotlabs/Module/Wall_upload.php b/Zotlabs/Module/Wall_upload.php
new file mode 100644
index 000000000..fff3ed03a
--- /dev/null
+++ b/Zotlabs/Module/Wall_upload.php
@@ -0,0 +1,57 @@
+<?php
+namespace Zotlabs\Module;
+
+require_once('include/photo/photo_driver.php');
+require_once('include/identity.php');
+require_once('include/photos.php');
+
+
+
+
+class Wall_upload extends \Zotlabs\Web\Controller {
+
+ function post() {
+
+
+ $using_api = ((x($_FILES,'media')) ? true : false);
+
+ if($using_api) {
+ require_once('include/api.php');
+ $user_info = api_get_user($a);
+ $nick = $user_info['screen_name'];
+ }
+ else {
+ if(argc() > 1)
+ $nick = argv(1);
+ }
+
+ $channel = (($nick) ? get_channel_by_nick($nick) : false);
+
+ if(! $channel) {
+ if($using_api)
+ return;
+ notice( t('Channel not found.') . EOL);
+ killme();
+ }
+
+ $observer = \App::get_observer();
+
+ $args = array( 'source' => 'editor', 'visible' => 0, 'contact_allow' => array($channel['channel_hash']));
+
+ $ret = photo_upload($channel,$observer,$args);
+
+ if(! $ret['success']) {
+ if($using_api)
+ return;
+ notice($ret['message']);
+ killme();
+ }
+
+ if($using_api)
+ return("\n\n" . $ret['body'] . "\n\n");
+ else
+ echo "\n\n" . $ret['body'] . "\n\n";
+ killme();
+ }
+
+}
diff --git a/Zotlabs/Module/Webfinger.php b/Zotlabs/Module/Webfinger.php
new file mode 100644
index 000000000..c50680de7
--- /dev/null
+++ b/Zotlabs/Module/Webfinger.php
@@ -0,0 +1,54 @@
+<?php
+namespace Zotlabs\Module;
+
+
+
+
+class Webfinger extends \Zotlabs\Web\Controller {
+
+ function get() {
+
+
+ $o .= '<h3>Webfinger Diagnostic</h3>';
+
+ $o .= '<form action="webfinger" method="get">';
+ $o .= 'Lookup address: <input type="text" style="width: 250px;" name="addr" value="' . $_GET['addr'] .'" />';
+ $o .= '<input type="submit" name="submit" value="Submit" /></form>';
+
+ $o .= '<br /><br />';
+
+ $old = false;
+ if(x($_GET,'addr')) {
+ $addr = trim($_GET['addr']);
+ // if(strpos($addr,'@') !== false) {
+ $res = webfinger_rfc7033($addr,true);
+ if(! $res) {
+ $res = old_webfinger($addr);
+ $old = true;
+ }
+ // }
+ // else {
+ // if(function_exists('lrdd'))
+ // $res = lrdd($addr);
+ // }
+
+ if($res && $old) {
+ foreach($res as $r) {
+ if($r['@attributes']['rel'] === 'http://microformats.org/profile/hcard') {
+ $hcard = unamp($r['@attributes']['href']);
+ require_once('library/HTML5/Parser.php');
+ $res['vcard'] = scrape_vcard($hcard);
+ break;
+ }
+ }
+ }
+
+
+ $o .= '<pre>';
+ $o .= str_replace("\n",'<br />',print_r($res,true));
+ $o .= '</pre>';
+ }
+ return $o;
+ }
+
+}
diff --git a/Zotlabs/Module/Webpages.php b/Zotlabs/Module/Webpages.php
new file mode 100644
index 000000000..84d58058e
--- /dev/null
+++ b/Zotlabs/Module/Webpages.php
@@ -0,0 +1,207 @@
+<?php
+namespace Zotlabs\Module;
+
+require_once('include/identity.php');
+require_once('include/conversation.php');
+require_once('include/acl_selectors.php');
+
+
+class Webpages extends \Zotlabs\Web\Controller {
+
+ function init() {
+
+ if(argc() > 1 && argv(1) === 'sys' && is_site_admin()) {
+ $sys = get_sys_channel();
+ if($sys && intval($sys['channel_id'])) {
+ \App::$is_sys = true;
+ }
+ }
+
+ if(argc() > 1)
+ $which = argv(1);
+ else
+ return;
+
+ profile_load($a,$which);
+
+ }
+
+
+ function get() {
+
+ if(! \App::$profile) {
+ notice( t('Requested profile is not available.') . EOL );
+ \App::$error = 404;
+ return;
+ }
+
+ $which = argv(1);
+
+ $_SESSION['return_url'] = \App::$query_string;
+
+ $uid = local_channel();
+ $owner = 0;
+ $channel = null;
+ $observer = \App::get_observer();
+
+ $channel = \App::get_channel();
+
+ if(\App::$is_sys && is_site_admin()) {
+ $sys = get_sys_channel();
+ if($sys && intval($sys['channel_id'])) {
+ $uid = $owner = intval($sys['channel_id']);
+ $channel = $sys;
+ $observer = $sys;
+ }
+ }
+
+ if(! $owner) {
+ // Figure out who the page owner is.
+ $r = q("select channel_id from channel where channel_address = '%s'",
+ dbesc($which)
+ );
+ if($r) {
+ $owner = intval($r[0]['channel_id']);
+ }
+ }
+
+ $ob_hash = (($observer) ? $observer['xchan_hash'] : '');
+
+ $perms = get_all_perms($owner,$ob_hash);
+
+ if(! $perms['write_pages']) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ $mimetype = (($_REQUEST['mimetype']) ? $_REQUEST['mimetype'] : get_pconfig($owner,'system','page_mimetype'));
+
+ if(! $mimetype) {
+ $mimetype = 'choose';
+ }
+
+ $layout = (($_REQUEST['layout']) ? $_REQUEST['layout'] : get_pconfig($owner,'system','page_layout'));
+ if(! $layout)
+ $layout = 'choose';
+
+ // Create a status editor (for now - we'll need a WYSIWYG eventually) to create pages
+ // Nickname is set to the observers xchan, and profile_uid to the owner's.
+ // This lets you post pages at other people's channels.
+
+ if((! $channel) && ($uid) && ($uid == \App::$profile_uid)) {
+ $channel = \App::get_channel();
+ }
+ if($channel) {
+ $channel_acl = array(
+ 'allow_cid' => $channel['channel_allow_cid'],
+ 'allow_gid' => $channel['channel_allow_gid'],
+ 'deny_cid' => $channel['channel_deny_cid'],
+ 'deny_gid' => $channel['channel_deny_gid']
+ );
+ }
+ else
+ $channel_acl = array();
+
+ $is_owner = ($uid && $uid == $owner);
+ $o = profile_tabs($a, $is_owner, \App::$profile['channel_address']);
+
+ $x = array(
+ 'webpage' => ITEM_TYPE_WEBPAGE,
+ 'is_owner' => true,
+ 'nickname' => \App::$profile['channel_address'],
+ 'lockstate' => (($channel['channel_allow_cid'] || $channel['channel_allow_gid'] || $channel['channel_deny_cid'] || $channel['channel_deny_gid']) ? 'lock' : 'unlock'),
+ 'bang' => '',
+ 'acl' => (($is_owner) ? populate_acl($channel_acl,false) : ''),
+ 'showacl' => (($is_owner) ? true : false),
+ 'visitor' => true,
+ 'profile_uid' => intval($owner),
+ 'mimetype' => $mimetype,
+ 'layout' => $layout,
+ 'expanded' => true,
+ 'novoting'=> true,
+ 'bbco_autocomplete' => 'bbcode',
+ 'bbcode' => true
+ );
+
+ if($_REQUEST['title'])
+ $x['title'] = $_REQUEST['title'];
+ if($_REQUEST['body'])
+ $x['body'] = $_REQUEST['body'];
+ if($_REQUEST['pagetitle'])
+ $x['pagetitle'] = $_REQUEST['pagetitle'];
+
+ $editor = status_editor($a,$x);
+
+ // Get a list of webpages. We can't display all them because endless scroll makes that unusable,
+ // so just list titles and an edit link.
+
+
+ /** @TODO - this should be replaced with pagelist_widget */
+
+ $sql_extra = item_permissions_sql($owner);
+
+ $r = q("select * from item_id left join item on item_id.iid = item.id
+ where item_id.uid = %d and service = 'WEBPAGE' and item_type = %d $sql_extra order by item.created desc",
+ intval($owner),
+ intval(ITEM_TYPE_WEBPAGE)
+ );
+
+ $pages = null;
+
+ if($r) {
+ $pages = array();
+ foreach($r as $rr) {
+ unobscure($rr);
+
+ $lockstate = (($rr['allow_cid'] || $rr['allow_gid'] || $rr['deny_cid'] || $rr['deny_gid']) ? 'lock' : 'unlock');
+
+ $element_arr = array(
+ 'type' => 'webpage',
+ 'title' => $rr['title'],
+ 'body' => $rr['body'],
+ 'created' => $rr['created'],
+ 'edited' => $rr['edited'],
+ 'mimetype' => $rr['mimetype'],
+ 'pagetitle' => $rr['sid'],
+ 'mid' => $rr['mid'],
+ 'layout_mid' => $rr['layout_mid']
+ );
+ $pages[$rr['iid']][] = array(
+ 'url' => $rr['iid'],
+ 'pagetitle' => $rr['sid'],
+ 'title' => $rr['title'],
+ 'created' => datetime_convert('UTC',date_default_timezone_get(),$rr['created']),
+ 'edited' => datetime_convert('UTC',date_default_timezone_get(),$rr['edited']),
+ 'bb_element' => '[element]' . base64url_encode(json_encode($element_arr)) . '[/element]',
+ 'lockstate' => $lockstate
+ );
+ }
+ }
+
+
+ //Build the base URL for edit links
+ $url = z_root() . '/editwebpage/' . $which;
+
+ $o .= replace_macros(get_markup_template('webpagelist.tpl'), array(
+ '$listtitle' => t('Webpages'),
+ '$baseurl' => $url,
+ '$create' => t('Create'),
+ '$edit' => t('Edit'),
+ '$share' => t('Share'),
+ '$delete' => t('Delete'),
+ '$pages' => $pages,
+ '$channel' => $which,
+ '$editor' => $editor,
+ '$view' => t('View'),
+ '$preview' => t('Preview'),
+ '$actions_txt' => t('Actions'),
+ '$pagelink_txt' => t('Page Link'),
+ '$title_txt' => t('Page Title'),
+ '$created_txt' => t('Created'),
+ '$edited_txt' => t('Edited')
+ ));
+
+ return $o;
+ }
+
+}
diff --git a/Zotlabs/Module/Well_known.php b/Zotlabs/Module/Well_known.php
new file mode 100644
index 000000000..b57666bff
--- /dev/null
+++ b/Zotlabs/Module/Well_known.php
@@ -0,0 +1,69 @@
+<?php
+namespace Zotlabs\Module;
+
+
+class Well_known extends \Zotlabs\Web\Controller {
+
+ function init(){
+
+ if(argc() > 1) {
+
+ $arr = array('server' => $_SERVER, 'request' => $_REQUEST);
+ call_hooks('well_known', $arr);
+
+
+ if(! check_siteallowed($_SERVER['REMOTE_ADDR'])) {
+ logger('well_known: site not allowed. ' . $_SERVER['REMOTE_ADDR']);
+ killme();
+ }
+
+ // from php.net re: REMOTE_HOST:
+ // Note: Your web server must be configured to create this variable. For example in Apache
+ // you'll need HostnameLookups On inside httpd.conf for it to exist. See also gethostbyaddr().
+
+ if(get_config('system','siteallowed_remote_host') && (! check_siteallowed($_SERVER['REMOTE_HOST']))) {
+ logger('well_known: site not allowed. ' . $_SERVER['REMOTE_HOST']);
+ killme();
+ }
+
+
+ switch(argv(1)) {
+ case 'zot-info':
+ \App::$argc -= 1;
+ array_shift(\App::$argv);
+ \App::$argv[0] = 'zfinger';
+ $module = new \Zotlabs\Module\Zfinger();
+ $module->init();
+ break;
+
+ case 'webfinger':
+ \App::$argc -= 1;
+ array_shift(\App::$argv);
+ \App::$argv[0] = 'wfinger';
+ $module = new \Zotlabs\Module\Wfinger();
+ $module->init();
+ break;
+
+ case 'host-meta':
+ \App::$argc -= 1;
+ array_shift(\App::$argv);
+ \App::$argv[0] = 'hostxrd';
+ $module = new \Zotlabs\Module\Hostxrd();
+ $module->init();
+ break;
+
+ default:
+ if(file_exists(\App::$cmd)) {
+ echo file_get_contents(\App::$cmd);
+ killme();
+ }
+ elseif(file_exists(\App::$cmd . '.php'))
+ require_once(\App::$cmd . '.php');
+ break;
+
+ }
+ }
+
+ http_status_exit(404);
+ }
+}
diff --git a/Zotlabs/Module/Wfinger.php b/Zotlabs/Module/Wfinger.php
new file mode 100644
index 000000000..fa1e11518
--- /dev/null
+++ b/Zotlabs/Module/Wfinger.php
@@ -0,0 +1,140 @@
+<?php
+namespace Zotlabs\Module;
+
+require_once('include/zot.php');
+
+
+class Wfinger extends \Zotlabs\Web\Controller {
+
+ function init() {
+
+ $result = array();
+
+ $scheme = '';
+
+ if(x($_SERVER,'HTTPS') && $_SERVER['HTTPS'])
+ $scheme = 'https';
+ elseif(x($_SERVER,'SERVER_PORT') && (intval($_SERVER['SERVER_PORT']) == 443))
+ $scheme = 'https';
+
+ $zot = intval($_REQUEST['zot']);
+
+ if(($scheme !== 'https') && (! $zot)) {
+ header($_SERVER["SERVER_PROTOCOL"] . ' ' . 500 . ' ' . 'Webfinger requires HTTPS');
+ killme();
+ }
+
+
+ $resource = $_REQUEST['resource'];
+ logger('webfinger: ' . $resource,LOGGER_DEBUG);
+
+ $r = null;
+
+ if($resource) {
+
+ if(strpos($resource,'acct:') === 0) {
+ $channel = str_replace('acct:','',$resource);
+ if(strpos($channel,'@') !== false) {
+ $host = substr($channel,strpos($channel,'@')+1);
+ if(strcasecmp($host,\App::get_hostname())) {
+ goaway('https://' . $host . '/.well-known/webfinger?f=&resource=' . $resource . (($zot) ? '&zot=' . $zot : ''));
+ }
+ $channel = substr($channel,0,strpos($channel,'@'));
+ }
+ }
+ if(strpos($resource,'http') === 0) {
+ $channel = str_replace('~','',basename($resource));
+ }
+
+ $r = q("select * from channel left join xchan on channel_hash = xchan_hash
+ where channel_address = '%s' limit 1",
+ dbesc($channel)
+ );
+
+ }
+
+ header('Access-Control-Allow-Origin: *');
+
+
+ if($resource && $r) {
+
+ $h = q("select hubloc_addr from hubloc where hubloc_hash = '%s' and hubloc_deleted = 0",
+ dbesc($r[0]['channel_hash'])
+ );
+
+ $result['subject'] = $resource;
+
+ $aliases = array(
+ z_root() . '/channel/' . $r[0]['channel_address'],
+ z_root() . '/~' . $r[0]['channel_address']
+ );
+
+ if($h) {
+ foreach($h as $hh) {
+ $aliases[] = 'acct:' . $hh['hubloc_addr'];
+ }
+ }
+
+ $result['aliases'] = array();
+
+ $result['properties'] = array(
+ 'http://webfinger.net/ns/name' => $r[0]['channel_name'],
+ 'http://xmlns.com/foaf/0.1/name' => $r[0]['channel_name']
+ );
+
+ foreach($aliases as $alias)
+ if($alias != $resource)
+ $result['aliases'][] = $alias;
+
+ $result['links'] = array(
+
+ array(
+ 'rel' => 'http://webfinger.net/rel/avatar',
+ 'type' => $r[0]['xchan_photo_mimetype'],
+ 'href' => $r[0]['xchan_photo_l']
+ ),
+
+ array(
+ 'rel' => 'http://webfinger.net/rel/profile-page',
+ 'href' => z_root() . '/profile/' . $r[0]['channel_address'],
+ ),
+
+ array(
+ 'rel' => 'http://webfinger.net/rel/blog',
+ 'href' => z_root() . '/channel/' . $r[0]['channel_address'],
+ ),
+
+ array(
+ 'rel' => 'http://ostatus.org/schema/1.0/subscribe',
+ 'template' => z_root() . '/follow/url={uri}',
+ ),
+
+ array(
+ 'rel' => 'http://purl.org/zot/protocol',
+ 'href' => z_root() . '/.well-known/zot-info' . '?address=' . $r[0]['xchan_addr'],
+ ),
+
+ array(
+ 'rel' => 'magic-public-key',
+ 'href' => 'data:application/magic-public-key,' . salmon_key($r[0]['channel_pubkey']),
+ )
+ );
+
+ if($zot) {
+ // get a zotinfo packet and return it with webfinger
+ $result['zot'] = zotinfo(array('address' => $r[0]['xchan_addr']));
+ }
+ }
+ else {
+ header($_SERVER["SERVER_PROTOCOL"] . ' ' . 400 . ' ' . 'Bad Request');
+ killme();
+ }
+
+ $arr = array('channel' => $r[0], 'request' => $_REQUEST, 'result' => $result);
+ call_hooks('webfinger',$arr);
+
+ json_return_and_die($arr['result'],'application/jrd+json');
+
+ }
+
+}
diff --git a/Zotlabs/Module/Xchan.php b/Zotlabs/Module/Xchan.php
new file mode 100644
index 000000000..526580fad
--- /dev/null
+++ b/Zotlabs/Module/Xchan.php
@@ -0,0 +1,47 @@
+<?php
+namespace Zotlabs\Module;
+
+
+
+class Xchan extends \Zotlabs\Web\Controller {
+
+ function get() {
+
+ $o = '<h3>' . t('Xchan Lookup') . '</h3>';
+
+ $o .= '<form action="xchan" method="get">';
+ $o .= t('Lookup xchan beginning with (or webbie): ');
+ $o .= '<input type="text" style="width:250px;" name="addr" value="' . $_GET['addr'] .'">';
+ $o .= '<input type="submit" name="submit" value="' . t('Submit') .'"></form>';
+ $o .= '<br><br>';
+
+ if(x($_GET, 'addr')) {
+ $addr = trim($_GET['addr']);
+
+ $r = q("select * from xchan where xchan_hash like '%s%%' or xchan_addr = '%s' group by xchan_hash",
+ dbesc($addr),
+ dbesc($addr)
+ );
+
+ if($r) {
+ foreach($r as $rr) {
+ $o .= str_replace(array("\n", " "), array("<br>", "&nbsp;"), print_r($rr, true)) . EOL;
+
+ $s = q("select * from hubloc where hubloc_hash like '%s'",
+ dbesc($r[0]['xchan_hash'])
+ );
+
+ if($s) {
+ foreach($s as $rrr)
+ $o .= str_replace(array("\n", " "), array("<br>", "&nbsp;"), print_r($rrr, true)) . EOL;
+ }
+ }
+ }
+ else
+ notice( t('Not found.') . EOL);
+
+ }
+ return $o;
+ }
+
+}
diff --git a/Zotlabs/Module/Xpoco.php b/Zotlabs/Module/Xpoco.php
new file mode 100644
index 000000000..3ff05c4e1
--- /dev/null
+++ b/Zotlabs/Module/Xpoco.php
@@ -0,0 +1,13 @@
+<?php
+namespace Zotlabs\Module;
+
+require_once('include/socgraph.php');
+
+
+class Xpoco extends \Zotlabs\Web\Controller {
+
+ function init() {
+ poco($a,true);
+ }
+
+}
diff --git a/Zotlabs/Module/Xrd.php b/Zotlabs/Module/Xrd.php
new file mode 100644
index 000000000..d71fae695
--- /dev/null
+++ b/Zotlabs/Module/Xrd.php
@@ -0,0 +1,81 @@
+<?php
+namespace Zotlabs\Module;
+
+require_once('include/crypto.php');
+
+
+class Xrd extends \Zotlabs\Web\Controller {
+
+ function init() {
+
+ $uri = urldecode(notags(trim($_GET['uri'])));
+ logger('xrd: ' . $uri,LOGGER_DEBUG);
+
+ $resource = $uri;
+
+ if(substr($uri,0,4) === 'http') {
+ $uri = str_replace('~','',$uri);
+ $name = basename($uri);
+ }
+ else {
+ $local = str_replace('acct:', '', $uri);
+ if(substr($local,0,2) == '//')
+ $local = substr($local,2);
+
+ $name = substr($local,0,strpos($local,'@'));
+ }
+
+ $r = q("SELECT * FROM channel WHERE channel_address = '%s' LIMIT 1",
+ dbesc($name)
+ );
+ if(! $r)
+ killme();
+
+ $dspr = replace_macros(get_markup_template('xrd_diaspora.tpl'),array(
+ '$baseurl' => z_root(),
+ '$dspr_guid' => $r[0]['channel_guid'] . str_replace('.','',\App::get_hostname()),
+ '$dspr_key' => base64_encode(pemtorsa($r[0]['channel_pubkey']))
+ ));
+
+ $salmon_key = salmon_key($r[0]['channel_pubkey']);
+
+ header('Access-Control-Allow-Origin: *');
+ header("Content-type: application/xrd+xml");
+
+
+ $aliases = array('acct:' . $r[0]['channel_address'] . '@' . \App::get_hostname(), z_root() . '/channel/' . $r[0]['channel_address'], z_root() . '/~' . $r[0]['channel_address']);
+
+ for($x = 0; $x < count($aliases); $x ++) {
+ if($aliases[$x] === $resource)
+ unset($aliases[$x]);
+ }
+
+
+ $o = replace_macros(get_markup_template('xrd_person.tpl'), array(
+ '$nick' => $r[0]['channel_address'],
+ '$accturi' => $resource,
+ '$aliases' => $aliases,
+ '$profile_url' => z_root() . '/channel/' . $r[0]['channel_address'],
+ '$hcard_url' => z_root() . '/hcard/' . $r[0]['channel_address'],
+ '$atom' => z_root() . '/feed/' . $r[0]['channel_address'],
+ '$zot_post' => z_root() . '/post/' . $r[0]['channel_address'],
+ '$poco_url' => z_root() . '/poco/' . $r[0]['channel_address'],
+ '$photo' => z_root() . '/photo/profile/l/' . $r[0]['channel_id'],
+ '$dspr' => $dspr,
+ // '$salmon' => z_root() . '/salmon/' . $r[0]['channel_address'],
+ // '$salmen' => z_root() . '/salmon/' . $r[0]['channel_address'] . '/mention',
+ '$modexp' => 'data:application/magic-public-key,' . $salmon_key,
+ '$subscribe' => z_root() . '/follow?url={uri}',
+ '$bigkey' => salmon_key($r[0]['channel_pubkey'])
+ ));
+
+
+ $arr = array('user' => $r[0], 'xml' => $o);
+ call_hooks('personal_xrd', $arr);
+
+ echo $arr['xml'];
+ killme();
+
+ }
+
+}
diff --git a/Zotlabs/Module/Xref.php b/Zotlabs/Module/Xref.php
new file mode 100644
index 000000000..e9d494da4
--- /dev/null
+++ b/Zotlabs/Module/Xref.php
@@ -0,0 +1,26 @@
+<?php
+namespace Zotlabs\Module;
+
+
+class Xref extends \Zotlabs\Web\Controller {
+
+ function init() {
+ // Sets a referral URL using an xchan directly
+ // Link format: example.com/xref/[xchan]/[TargetURL]
+ // Target URL is optional.
+ // Cookie lasts 24 hours to survive a browser restart. Contains no personal
+ // information at all - just somebody else's xchan.
+ $referrer = argv(1);
+ $expire=time()+60*60*2;
+ $path = 'xref';
+ setcookie($path, $referrer, $expire, "/");
+ $url = '';
+
+ if (argc() > 2)
+ $url = argv(2);
+
+ goaway (z_root() . '/' . $url);
+
+ }
+
+}
diff --git a/Zotlabs/Module/Zfinger.php b/Zotlabs/Module/Zfinger.php
new file mode 100644
index 000000000..2ff605fc9
--- /dev/null
+++ b/Zotlabs/Module/Zfinger.php
@@ -0,0 +1,18 @@
+<?php
+namespace Zotlabs\Module;
+
+
+class Zfinger extends \Zotlabs\Web\Controller {
+
+ function init() {
+
+ require_once('include/zot.php');
+ require_once('include/crypto.php');
+
+
+ $x = zotinfo($_REQUEST);
+ json_return_and_die($x);
+
+ }
+
+}
diff --git a/Zotlabs/Module/Zotfeed.php b/Zotlabs/Module/Zotfeed.php
new file mode 100644
index 000000000..28040149f
--- /dev/null
+++ b/Zotlabs/Module/Zotfeed.php
@@ -0,0 +1,52 @@
+<?php
+namespace Zotlabs\Module;
+
+require_once('include/items.php');
+require_once('include/zot.php');
+
+
+class Zotfeed extends \Zotlabs\Web\Controller {
+
+ function init() {
+
+ $result = array('success' => false);
+
+ $mindate = (($_REQUEST['mindate']) ? datetime_convert('UTC','UTC',$_REQUEST['mindate']) : '');
+ if(! $mindate)
+ $mindate = datetime_convert('UTC','UTC', 'now - 14 days');
+
+ if(get_config('system','block_public') && (! get_account_id()) && (! remote_channel())) {
+ $result['message'] = 'Public access denied';
+ json_return_and_die($result);
+ }
+
+ $observer = \App::get_observer();
+
+
+ $channel_address = ((argc() > 1) ? argv(1) : '');
+ if($channel_address) {
+ $r = q("select channel_id, channel_name from channel where channel_address = '%s' and channel_removed = 0 limit 1",
+ dbesc(argv(1))
+ );
+ }
+ else {
+ $x = get_sys_channel();
+ if($x)
+ $r = array($x);
+ $mindate = datetime_convert('UTC','UTC', 'now - 14 days');
+ }
+ if(! $r) {
+ $result['message'] = 'Channel not found.';
+ json_return_and_die($result);
+ }
+
+ logger('zotfeed request: ' . $r[0]['channel_name'], LOGGER_DEBUG);
+
+ $result['messages'] = zot_feed($r[0]['channel_id'],$observer['xchan_hash'],array('mindate' => $mindate));
+ $result['success'] = true;
+ json_return_and_die($result);
+
+
+ }
+
+}
diff --git a/Zotlabs/Module/Zping.php b/Zotlabs/Module/Zping.php
new file mode 100644
index 000000000..d6128fa66
--- /dev/null
+++ b/Zotlabs/Module/Zping.php
@@ -0,0 +1,33 @@
+<?php
+namespace Zotlabs\Module; /** @file */
+
+require_once('include/zot.php');
+
+
+class Zping extends \Zotlabs\Web\Controller {
+
+ function get() {
+
+ // This is just a test utility function and may go away once we build these tools into
+ // the address book and directory to do dead site discovery.
+
+ // The response packet include the current URL and key so we can discover if the server
+ // has been re-installed and clean up (e.g. get rid of) any old hublocs and xchans.
+
+ // Remember to add '/post' to the url
+
+ if(! local_channel())
+ return;
+
+ $url = $_REQUEST['url'];
+
+ if(! $url)
+ return;
+
+
+ $m = zot_build_packet(\App::get_channel(),'ping');
+ $r = zot_zot($url,$m);
+ return print_r($r,true);
+
+ }
+}
diff --git a/Zotlabs/Web/CheckJS.php b/Zotlabs/Web/CheckJS.php
index 3ad5fc1ed..5f9856a8c 100644
--- a/Zotlabs/Web/CheckJS.php
+++ b/Zotlabs/Web/CheckJS.php
@@ -10,14 +10,25 @@ class CheckJS {
function __construct($test = 0) {
if(intval($_REQUEST['jsdisabled']))
$this->jsdisabled = 1;
+ else
+ $this->jsdisabled = 0;
if(intval($_COOKIE['jsdisabled']))
$this->jsdisabled = 1;
+ else
+ $this->jsdisabled = 0;
if(! $this->jsdisabled) {
$page = urlencode(\App::$query_string);
if($test) {
- \App::$page['htmlhead'] .= "\r\n" . '<meta http-equiv="refresh" content="0; url=' . z_root() . '/nojs?f=&redir=' . $page . '">' . "\r\n";
+
+ if(! array_key_exists('jsdisabled',$_COOKIE)) {
+ \App::$page['htmlhead'] .= "\r\n" . '<script>document.cookie="jsdisabled=0; path=/"; var jsMatch = /\&jsdisabled=0/; if (!jsMatch.exec(location.href)) { location.href = "' . z_root() . '/nojs/0?f=&redir=' . $page . '" ; }</script>' . "\r\n";
+ /* emulate JS cookie if cookies are not accepted */
+ if (array_key_exists('jsdisabled',$_GET)) {
+ $_COOKIE['jsdisabled'] = $_GET['jsdisabled'];
+ }
+ }
}
else {
\App::$page['htmlhead'] .= "\r\n" . '<noscript><meta http-equiv="refresh" content="0; url=' . z_root() . '/nojs?f=&redir=' . $page . '"></noscript>' . "\r\n";
diff --git a/Zotlabs/Web/Controller.php b/Zotlabs/Web/Controller.php
new file mode 100644
index 000000000..ac835e008
--- /dev/null
+++ b/Zotlabs/Web/Controller.php
@@ -0,0 +1,12 @@
+<?php
+
+namespace Zotlabs\Web;
+
+
+class Controller {
+
+ function init() {}
+ function post() {}
+ function get() {}
+
+} \ No newline at end of file
diff --git a/Zotlabs/Web/Router.php b/Zotlabs/Web/Router.php
index 29f2b5206..e6733ffdb 100644
--- a/Zotlabs/Web/Router.php
+++ b/Zotlabs/Web/Router.php
@@ -5,20 +5,32 @@ namespace Zotlabs\Web;
class Router {
+ private $modname = '';
+ private $controller = null;
+
function __construct(&$a) {
/**
*
* We have already parsed the server path into App::$argc and App::$argv
*
- * App::$argv[0] is our module name. We will load the file mod/{App::$argv[0]}.php
- * and use it for handling our URL request.
+ * App::$argv[0] is our module name. Let's call it 'foo'. We will load the
+ * Zotlabs/Module/Foo.php (object) or file mod/foo.php (procedural)
+ * and use it for handling our URL request to 'https://ourgreatwebsite.something/foo' .
* The module file contains a few functions that we call in various circumstances
* and in the following order:
*
- * "module"_init
- * "module"_post (only called if there are $_POST variables)
- * "module"_content - the string return of this function contains our page body
+ * Object:
+ * class Foo extends Zotlabs\Web\Controller {
+ * function init() { init function }
+ * function post() { post function }
+ * function get() { normal page function }
+ * }
+ *
+ * Procedual interface:
+ * foo_init()
+ * foo_post() (only called if there are $_POST variables)
+ * foo_content() - the string return of this function contains our page body
*
* Modules which emit other serialisations besides HTML (XML,JSON, etc.) should do
* so within the module init and/or post functions and then invoke killme() to terminate
@@ -26,6 +38,7 @@ class Router {
*/
$module = \App::$module;
+ $modname = "Zotlabs\\Module\\" . ucfirst($module);
if(strlen($module)) {
@@ -38,8 +51,13 @@ class Router {
if(is_array(\App::$plugins) && in_array($module,\App::$plugins) && file_exists("addon/{$module}/{$module}.php")) {
include_once("addon/{$module}/{$module}.php");
- if(function_exists($module . '_module'))
+ if(class_exists($modname)) {
+ $this->controller = new $modname;
\App::$module_loaded = true;
+ }
+ elseif(function_exists($module . '_module')) {
+ \App::$module_loaded = true;
+ }
}
if((strpos($module,'admin') === 0) && (! is_site_admin())) {
@@ -50,33 +68,54 @@ class Router {
/**
* If the site has a custom module to over-ride the standard module, use it.
- * Otherwise, look for the standard program module in the 'mod' directory
+ * Otherwise, look for the standard program module
*/
if(! (\App::$module_loaded)) {
- if(file_exists("mod/site/{$module}.php")) {
- include_once("mod/site/{$module}.php");
- \App::$module_loaded = true;
+ try {
+ $filename = 'Zotlabs/SiteModule/'. ucfirst($module). '.php';
+ if(file_exists($filename)) {
+ // This won't be picked up by the autoloader, so load it explicitly
+ require_once($filename);
+ $this->controller = new $modname;
+ \App::$module_loaded = true;
+ }
+ else {
+ $filename = 'Zotlabs/Module/'. ucfirst($module). '.php';
+ if(file_exists($filename)) {
+ $this->controller = new $modname;
+ \App::$module_loaded = true;
+ }
+ }
+ if(! \App::$module_loaded)
+ throw new \Exception('Module not found');
}
- elseif(file_exists("mod/{$module}.php")) {
- include_once("mod/{$module}.php");
- \App::$module_loaded = true;
+ catch(\Exception $e) {
+ if(file_exists("mod/site/{$module}.php")) {
+ include_once("mod/site/{$module}.php");
+ \App::$module_loaded = true;
+ }
+ elseif(file_exists("mod/{$module}.php")) {
+ include_once("mod/{$module}.php");
+ \App::$module_loaded = true;
+ }
}
- else logger("mod/{$module}.php not found.");
}
-
-
+
/**
- * This provides a place for plugins to register module handlers which don't otherwise exist on the system.
+ * This provides a place for plugins to register module handlers which don't otherwise exist
+ * on the system, or to completely over-ride an existing module.
* If the plugin sets 'installed' to true we won't throw a 404 error for the specified module even if
* there is no specific module file or matching plugin name.
* The plugin should catch at least one of the module hooks for this URL.
*/
- $x = array('module' => $module, 'installed' => false);
+ $x = array('module' => $module, 'installed' => \App::$module_loaded, 'controller' => $this->controller);
call_hooks('module_loaded', $x);
- if($x['installed'])
+ if($x['installed']) {
\App::$module_loaded = true;
+ $this->controller = $x['controller'];
+ }
/**
* The URL provided does not resolve to a valid module.
@@ -96,6 +135,8 @@ class Router {
killme();
}
+ logger("Module {$module} not found.", LOGGER_DEBUG, LOG_WARNING);
+
if((x($_SERVER, 'QUERY_STRING')) && ($_SERVER['QUERY_STRING'] === 'q=internal_error.html') && \App::$config['system']['dreamhost_error_hack']) {
logger('index.php: dreamhost_error_hack invoked. Original URI =' . $_SERVER['REQUEST_URI']);
goaway(z_root() . $_SERVER['REQUEST_URI']);
@@ -133,17 +174,20 @@ class Router {
* to over-ride them.
*/
- if(function_exists(\App::$module . '_init')) {
- $arr = array('init' => true, 'replace' => false);
- call_hooks(\App::$module . '_mod_init', $arr);
- if(! $arr['replace']) {
+ $arr = array('init' => true, 'replace' => false);
+ call_hooks(\App::$module . '_mod_init', $arr);
+ if(! $arr['replace']) {
+ if($this->controller && method_exists($this->controller,'init')) {
+ $this->controller->init();
+ }
+ elseif(function_exists(\App::$module . '_init')) {
$func = \App::$module . '_init';
$func($a);
}
}
/**
- * Do all theme initialiasion here before calling any additional module functions.
+ * Do all theme initialisation here before calling any additional module functions.
* The module_init function may have changed the theme.
* Additionally any page with a Comanche template may alter the theme.
* So we'll check for those now.
@@ -179,21 +223,30 @@ class Router {
}
}
- if(($_SERVER['REQUEST_METHOD'] === 'POST') && (! \App::$error)
- && (function_exists(\App::$module . '_post'))
- && (! x($_POST, 'auth-params'))) {
+ if(($_SERVER['REQUEST_METHOD'] === 'POST') && (! \App::$error) && (! x($_POST, 'auth-params'))) {
call_hooks(\App::$module . '_mod_post', $_POST);
- $func = \App::$module . '_post';
- $func($a);
+
+ if($this->controller && method_exists($this->controller,'post')) {
+ $this->controller->post();
+ }
+ elseif(function_exists(\App::$module . '_post')) {
+ $func = \App::$module . '_post';
+ $func($a);
+ }
}
- if((! \App::$error) && (function_exists(\App::$module . '_content'))) {
+ if(! \App::$error) {
$arr = array('content' => \App::$page['content'], 'replace' => false);
call_hooks(\App::$module . '_mod_content', $arr);
\App::$page['content'] = $arr['content'];
if(! $arr['replace']) {
- $func = \App::$module . '_content';
- $arr = array('content' => $func($a));
+ if($this->controller && method_exists($this->controller,'get')) {
+ $arr = array('content' => $this->controller->get());
+ }
+ elseif(function_exists(\App::$module . '_content')) {
+ $func = \App::$module . '_content';
+ $arr = array('content' => $func($a));
+ }
}
call_hooks(\App::$module . '_mod_aftercontent', $arr);
\App::$page['content'] .= $arr['content'];
diff --git a/boot.php b/boot.php
index ef620e3ec..2a8bf0d17 100755
--- a/boot.php
+++ b/boot.php
@@ -47,10 +47,10 @@ require_once('include/account.php');
define ( 'PLATFORM_NAME', 'hubzilla' );
define ( 'RED_VERSION', trim(file_get_contents('version.inc')));
-define ( 'STD_VERSION', '1.4' );
+define ( 'STD_VERSION', '1.4.4' );
define ( 'ZOT_REVISION', 1 );
-define ( 'DB_UPDATE_VERSION', 1165 );
+define ( 'DB_UPDATE_VERSION', 1166 );
/**
@@ -860,6 +860,8 @@ class App {
if ((array_key_exists('0', self::$argv)) && strlen(self::$argv[0])) {
self::$module = str_replace(".", "_", self::$argv[0]);
self::$module = str_replace("-", "_", self::$module);
+ if(strpos(self::$module,'_') === 0)
+ self::$module = substr(self::$module,1);
} else {
self::$argc = 1;
self::$argv = array('home');
@@ -1541,6 +1543,19 @@ function fix_system_urls($oldurl, $newurl) {
intval($c[0]['channel_id'])
);
+ $m = q("select abook_id, abook_instance from abook where abook_instance like '%s' and abook_channel = %d",
+ dbesc('%' . $oldurl . '%'),
+ intval($c[0]['channel_id'])
+ );
+ if($m) {
+ foreach($m as $mm) {
+ q("update abook set abook_instance = '%s' where abook_id = %d",
+ dbesc(str_replace($oldurl,$newurl,$mm['abook_instance'])),
+ intval($mm['abook_id'])
+ );
+ }
+ }
+
proc_run('php', 'include/notifier.php', 'refresh_all', $c[0]['channel_id']);
}
}
@@ -1795,7 +1810,7 @@ function proc_run($cmd){
$arr = array('args' => $args, 'run_cmd' => true);
- call_hooks("proc_run", $arr);
+ call_hooks('proc_run', $arr);
if(! $arr['run_cmd'])
return;
diff --git a/doc/Webpages.md b/doc/Webpages.md
index dafd3661d..801a9a3a0 100644
--- a/doc/Webpages.md
+++ b/doc/Webpages.md
@@ -1,7 +1,7 @@
Creating Webpages
=================
-Red enables users to create static webpages. To activate this feature, enable the web pages feature in your Additional Features section.
+Hubzilla enables users to create static webpages. To activate this feature, enable the web pages feature in your Additional Features section.
Once enabled, a new tab will appear on your channel page labelled "Webpages". Clicking this link will take you to the webpage editor. Here you can create a post using either BBCode or the rich text editor.
diff --git a/doc/context/channel/help.html b/doc/context/channel/help.html
deleted file mode 100644
index 810913ff3..000000000
--- a/doc/context/channel/help.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<script>
- var contextualHelp1 = function (target, openSidePanel) {
- $("#help-content").removeClass('help-content-open'); // Close the help panel
- $("#navbar-collapse-1").removeClass('in'); // Collapse the navbar for small screens
- if (openSidePanel) {
- $("main").addClass('region_1-on'); // Open the side panel to highlight element
- } else {
- $("main").removeClass('region_1-on');
- }
- // Animate the page scroll to the element and then pulse the element to direct attention
- $('html,body').animate({scrollTop: $(target).offset().top - $('#navbar-collapse-1').height() - 20}, 'slow');
- for (i = 0; i < 3; i++) {
- $(target).fadeTo('slow', 0.1).fadeTo('slow', 1.0);
- }
- }
-</script>
-<dl class="dl-horizontal">
- <dt>General</dt>
- <dd>This is the home page of a channel. It is similar to someone's profile "wall" in a social network context. Posts created by the channel are displayed according to the observer's viewing permissions.</dd>
- <dt>Create a Post</dt>
- <dd>If you have permission to create posts on the channel page, then you will see the post editor at the top.</dd>
- <dt><a href='#' onclick='contextualHelp1("#tabs-collapse-1", 0); return false;' title="Click to highlight element...">Channel Content Tabs</a></dt>
- <dd>The channel content tabs are links to other content published by the channel. The <b>About</b> tab links to the channel profile. The <b>Photos</b> tab links to the channel photo galleries. The <b>Files</b> tab links to the general shared files published by the channel.</dd>
-</dl> \ No newline at end of file
diff --git a/doc/context/cloud/help.html b/doc/context/cloud/help.html
deleted file mode 100644
index 105947517..000000000
--- a/doc/context/cloud/help.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<script>
- var contextualHelp1 = function (target, openSidePanel) {
- $("#help-content").removeClass('help-content-open'); // Close the help panel
- $("#navbar-collapse-1").removeClass('in'); // Collapse the navbar for small screens
- if (openSidePanel) {
- $("main").addClass('region_1-on'); // Open the side panel to highlight element
- } else {
- $("main").removeClass('region_1-on');
- }
- // Animate the page scroll to the element and then pulse the element to direct attention
- $('html,body').animate({scrollTop: $(target).offset().top - $('#navbar-collapse-1').height() - 20}, 'slow');
- for (i = 0; i < 3; i++) {
- $(target).fadeTo('slow', 0.1).fadeTo('slow', 1.0);
- }
- }
-</script>
-<dl class="dl-horizontal">
- <dt>General</dt>
- <dd>This page displays a channel's "cloud" files. The files visible to the observer depend on the individual file permissions set by the channel owner. If you have permission to create/upload files you will see control buttons above the file list.</dd>
- <dt><a href='#' onclick='contextualHelp1("#tabs-collapse-1", 0); return false;' title="Click to highlight element...">Channel Content Tabs</a></dt>
- <dd>The channel content tabs are links to other content published by the channel. The <b>About</b> tab links to the channel profile. The <b>Photos</b> tab links to the channel photo galleries. The <b>Files</b> tab links to the general shared files published by the channel.</dd>
-</dl> \ No newline at end of file
diff --git a/doc/context/admin/security/help.html b/doc/context/en/admin/security/help.html
index e9a741a5e..e9a741a5e 100644
--- a/doc/context/admin/security/help.html
+++ b/doc/context/en/admin/security/help.html
diff --git a/doc/context/en/channel/help.html b/doc/context/en/channel/help.html
new file mode 100644
index 000000000..6e3181cbf
--- /dev/null
+++ b/doc/context/en/channel/help.html
@@ -0,0 +1,8 @@
+<dl class="dl-horizontal">
+ <dt>General</dt>
+ <dd>This is the home page of a channel. It is similar to someone's profile "wall" in a social network context. Posts created by the channel are displayed according to the observer's viewing permissions.</dd>
+ <dt>Create a Post</dt>
+ <dd>If you have permission to create posts on the channel page, then you will see the post editor at the top.</dd>
+ <dt><a href='#' onclick='contextualHelpFocus("#tabs-collapse-1", 0); return false;' title="Click to highlight element...">Channel Content Tabs</a></dt>
+ <dd>The channel content tabs are links to other content published by the channel. The <b>About</b> tab links to the channel profile. The <b>Photos</b> tab links to the channel photo galleries. The <b>Files</b> tab links to the general shared files published by the channel.</dd>
+</dl> \ No newline at end of file
diff --git a/doc/context/en/cloud/help.html b/doc/context/en/cloud/help.html
new file mode 100644
index 000000000..a8f193223
--- /dev/null
+++ b/doc/context/en/cloud/help.html
@@ -0,0 +1,6 @@
+<dl class="dl-horizontal">
+ <dt>General</dt>
+ <dd>This page displays a channel's "cloud" files. The files visible to the observer depend on the individual file permissions set by the channel owner. If you have permission to create/upload files you will see control buttons above the file list.</dd>
+ <dt><a href='#' onclick='contextualHelpFocus("#tabs-collapse-1", 0); return false;' title="Click to highlight element...">Channel Content Tabs</a></dt>
+ <dd>The channel content tabs are links to other content published by the channel. The <b>About</b> tab links to the channel profile. The <b>Photos</b> tab links to the channel photo galleries. The <b>Files</b> tab links to the general shared files published by the channel.</dd>
+</dl> \ No newline at end of file
diff --git a/doc/context/mail/help.html b/doc/context/en/mail/help.html
index a2361a135..a2361a135 100644
--- a/doc/context/mail/help.html
+++ b/doc/context/en/mail/help.html
diff --git a/doc/context/network/help.html b/doc/context/en/network/help.html
index 956af7380..53e993b69 100644
--- a/doc/context/network/help.html
+++ b/doc/context/en/network/help.html
@@ -1,25 +1,9 @@
-<script>
- var contextualHelp1 = function (target, openSidePanel) {
- $("#help-content").removeClass('help-content-open'); // Close the help panel
- $("#navbar-collapse-1").removeClass('in'); // Collapse the navbar for small screens
- if (openSidePanel) {
- $("main").addClass('region_1-on'); // Open the side panel to highlight element
- } else {
- $("main").removeClass('region_1-on');
- }
- // Animate the page scroll to the element and then pulse the element to direct attention
- $('html,body').animate({scrollTop: $(target).offset().top - $('#navbar-collapse-1').height() - 20}, 'slow');
- for (i = 0; i < 3; i++) {
- $(target).fadeTo('slow', 0.1).fadeTo('slow', 1.0);
- }
- }
-</script>
<dl class="dl-horizontal">
<dt>General</dt>
<dd>The network page displays a stream of posts and conversations, typically ordered by the most recently updated. This page is highly customizable.</dd>
- <dt><a href='#' onclick='contextualHelp1("#profile-jot-wrapper", 0); return false;' title="Click to highlight element...">Create a Post</a></dt>
+ <dt><a href='#' onclick='contextualHelpFocus("#profile-jot-wrapper", 0); return false;' title="Click to highlight element...">Create a Post</a></dt>
<dd>At the top of the page there is a text box that says "Share". Clicking this box opens a new post editor. The post editor is customizable, but the basic editor provides fields for a post body and an optional post <b>Title</b>. Buttons below the text area to the left provide shortcuts to text formatting and inserting links, images, and other data into the post. The buttons to the right provide a post preview, the post permissions setting, and a <b>Submit</b> button to send the post.</dd>
- <dt><a href='#' onclick='contextualHelp1("#group-sidebar", 1); return false;' title="Click to highlight element...">Privacy Groups</a></dt>
+ <dt><a href='#' onclick='contextualHelpFocus("#group-sidebar", 1); return false;' title="Click to highlight element...">Privacy Groups</a></dt>
<dd>The privacy groups you have created are displayed in the side panel. Selecting them filters posts to those created by channels in the chosen group.</dd>
<dt><a href='#' onclick='$("#dbtn-acl").click(); return false;' title="Click to highlight element...">Post Permissions</a></dt>
<dd>The access control list (ACL) is what you use to set who can see your new post. Pressing the ACL button beside the Submit button will display a dialog in which you can select what channels and/or privacy groups can see the post. You can also select who is explicitly denied access. For example, say you are planning a surprise party for a friend. You can send an invitation post to everyone in your <b>Friends</b> group <i>except</i> the friend you are surprising. In this case you "show" the <b>Friends</b> group but "don't show" that one person.</dd>
diff --git a/doc/context/en/photos/help.html b/doc/context/en/photos/help.html
new file mode 100644
index 000000000..78b442bb4
--- /dev/null
+++ b/doc/context/en/photos/help.html
@@ -0,0 +1,6 @@
+<dl class="dl-horizontal">
+ <dt>General</dt>
+ <dd>This page displays a channel's photo albums. The images visible to the observer depend on the individual image permissions.</dd>
+ <dt><a href='#' onclick='contextualHelpFocus("#tabs-collapse-1", 0); return false;' title="Click to highlight element...">Channel Content Tabs</a></dt>
+ <dd>The channel content tabs are links to other content published by the channel. The <b>About</b> tab links to the channel profile. The <b>Photos</b> tab links to the channel photo galleries. The <b>Files</b> tab links to the general shared files published by the channel.</dd>
+</dl> \ No newline at end of file
diff --git a/doc/context/en/profile/help.html b/doc/context/en/profile/help.html
new file mode 100644
index 000000000..563e0df99
--- /dev/null
+++ b/doc/context/en/profile/help.html
@@ -0,0 +1,6 @@
+<dl class="dl-horizontal">
+ <dt>General</dt>
+ <dd>This is the profile page of a channel. It typically displays information describing the channel. If the channel represents a person in a social network, for example, then the profile might provide contact information and other personal details about the person. Channels can have multiple profiles, where the displayed profile depends on the observer.</dd>
+ <dt><a href='#' onclick='contextualHelpFocus("#tabs-collapse-1", 0); return false;' title="Click to highlight element...">Channel Content Tabs</a></dt>
+ <dd>The channel content tabs are links to other content published by the channel. The <b>About</b> tab links to the channel profile. The <b>Photos</b> tab links to the channel photo galleries. The <b>Files</b> tab links to the general shared files published by the channel.</dd>
+</dl> \ No newline at end of file
diff --git a/doc/context/photos/help.html b/doc/context/photos/help.html
deleted file mode 100644
index f41611f8d..000000000
--- a/doc/context/photos/help.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<script>
- var contextualHelp1 = function (target, openSidePanel) {
- $("#help-content").removeClass('help-content-open'); // Close the help panel
- $("#navbar-collapse-1").removeClass('in'); // Collapse the navbar for small screens
- if (openSidePanel) {
- $("main").addClass('region_1-on'); // Open the side panel to highlight element
- } else {
- $("main").removeClass('region_1-on');
- }
- // Animate the page scroll to the element and then pulse the element to direct attention
- $('html,body').animate({scrollTop: $(target).offset().top - $('#navbar-collapse-1').height() - 20}, 'slow');
- for (i = 0; i < 3; i++) {
- $(target).fadeTo('slow', 0.1).fadeTo('slow', 1.0);
- }
- }
-</script>
-<dl class="dl-horizontal">
- <dt>General</dt>
- <dd>This page displays a channel's photo albums. The images visible to the observer depend on the individual image permissions.</dd>
- <dt><a href='#' onclick='contextualHelp1("#tabs-collapse-1", 0); return false;' title="Click to highlight element...">Channel Content Tabs</a></dt>
- <dd>The channel content tabs are links to other content published by the channel. The <b>About</b> tab links to the channel profile. The <b>Photos</b> tab links to the channel photo galleries. The <b>Files</b> tab links to the general shared files published by the channel.</dd>
-</dl> \ No newline at end of file
diff --git a/doc/context/profile/help.html b/doc/context/profile/help.html
deleted file mode 100644
index 0d4abb8cb..000000000
--- a/doc/context/profile/help.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<script>
- var contextualHelp1 = function (target, openSidePanel) {
- $("#help-content").removeClass('help-content-open'); // Close the help panel
- $("#navbar-collapse-1").removeClass('in'); // Collapse the navbar for small screens
- if (openSidePanel) {
- $("main").addClass('region_1-on'); // Open the side panel to highlight element
- } else {
- $("main").removeClass('region_1-on');
- }
- // Animate the page scroll to the element and then pulse the element to direct attention
- $('html,body').animate({scrollTop: $(target).offset().top - $('#navbar-collapse-1').height() - 20}, 'slow');
- for (i = 0; i < 3; i++) {
- $(target).fadeTo('slow', 0.1).fadeTo('slow', 1.0);
- }
- }
-</script>
-<dl class="dl-horizontal">
- <dt>General</dt>
- <dd>This is the profile page of a channel. It typically displays information describing the channel. If the channel represents a person in a social network, for example, then the profile might provide contact information and other personal details about the person. Channels can have multiple profiles, where the displayed profile depends on the observer.</dd>
- <dt><a href='#' onclick='contextualHelp1("#tabs-collapse-1", 0); return false;' title="Click to highlight element...">Channel Content Tabs</a></dt>
- <dd>The channel content tabs are links to other content published by the channel. The <b>About</b> tab links to the channel profile. The <b>Photos</b> tab links to the channel photo galleries. The <b>Files</b> tab links to the general shared files published by the channel.</dd>
-</dl> \ No newline at end of file
diff --git a/doc/hidden_configs.bb b/doc/hidden_configs.bb
index 520abc22b..5bb7454ec 100644
--- a/doc/hidden_configs.bb
+++ b/doc/hidden_configs.bb
@@ -4,9 +4,13 @@ $Projectname contains many configuration options hidden from the main admin pane
These are generally options considered too niche, confusing, or advanced for
the average member. These settings can be activated from the the top level web
-directory with the syntax [code]util/config cat key value[/code] for a site
-configuration, or [code]util/pconfig channel_id cat key value[/code] for a
-member configuration.
+directory with the syntax
+
+[code]util/config cat key value[/code]
+for a site configuration, or
+
+[code]util/pconfig channel_id cat key value[/code]
+for a member configuration.
This document assumes you're an administrator.
@@ -60,28 +64,31 @@ This document assumes you're an administrator.
Allow the @mention tagging of anyone whether you are connected or not.
[b]system.directorytags[/b]
Set the number of keyword tags displayed on the directory page. Default is 50 unless set to a
- positive integer.
- [b]system.disable_directory_keywords[/b]
- If '1', do not show directory keywords. If the hub is a directory server, prevent returning
- tags to any directory clients. Please do not set this for directory servers in the RED_GLOBAL realm.
- [b]system.disable_dreport[/b]
- If '1', don't store or link to delivery reports
+ positive integer.
+ [b]system.disable_directory_keywords[/b]
+ If '1', do not show directory keywords. If the hub is a directory server, prevent returning
+ tags to any directory clients. Please do not set this for directory servers in the RED_GLOBAL realm.
+ [b]system.disable_dreport[/b]
+ If '1', don't store or link to delivery reports
[b]system.startpage[/b]
Set the default page to be taken to after a login for all channels at
this website. Can be overwritten by user settings.
[b]system.projecthome[/b]
Set the project homepage as the homepage of your hub. (Obsolete)
- [b]system.auto_channel_create[/b]
- Add the necessary form elements to create the first channel on the account registration page, and create it
- (possibly following email validation or administrator approval). This precludes the ability to import a channel
- from another site as the first channel created on this site for a new account.
- Use with system.default_permissions_role to streamline registration.
- [b]system.default_permissions_role[/b]
- If set to a valid permissions role name, use that role for
- the first channel created by a new account and don't ask for the "Channel Type" on
- the channel creation form. Examples of valid names are: 'social', 'social_restricted', 'social_private',
- 'forum', 'forum_restricted' and 'forum_private'.
- Read more about permissions roles [zrl=[baseurl]/help/roles]here[/zrl].
+ [b]system.auto_channel_create[/b]
+ Add the necessary form elements to create the first channel on the account registration page, and create it
+ (possibly following email validation or administrator approval). This precludes the ability to import a channel
+ from another site as the first channel created on this site for a new account.
+ Use with system.default_permissions_role to streamline registration.
+ [b]system.default_permissions_role[/b]
+ If set to a valid permissions role name, use that role for
+ the first channel created by a new account and don't ask for the "Channel Type" on
+ the channel creation form. Examples of valid names are: 'social', 'social_restricted', 'social_private',
+ 'forum', 'forum_restricted' and 'forum_private'.
+ Read more about permissions roles [zrl=[baseurl]/help/roles]here[/zrl].
+ [b]system.default_photo_profile[/b]
+ Set the profile photo that new channels start with. This should contain the name of a directory located
+ under [font=courier]images/default_profile_photos/[/font], or be left unset. If not set then 'rainbow_man' is assumed.
[b]system.workflow_channel_next[/b]
The page to direct new members to immediately after creating a channel.
[b]system.workflow_register_next[/b]
@@ -96,28 +103,29 @@ This document assumes you're an administrator.
Similar to block_public, except only blocks public access to
search features. Useful for sites that want to be public, but
keep getting hammered by search engines.
- [b]system.proc_run_use_exec
- If 1, use the exec system call in proc_run to run background tasks. By default
- we use proc_open and proc_close. On some (currently rare) systems this does not work well.
+ [b]system.proc_run_use_exec[/b]
+ If 1, use the exec system call in proc_run to run background tasks. By default
+ we use proc_open and proc_close. On some (currently rare) systems this does not work well.
[b]system.paranoia[/b]
As the pconfig, but on a site-wide basis. Can be overwritten
by member settings.
- [b]system.transport_security_header[/b]
- if non-zero and SSL is being used, include a strict-transport-security header on webpages
- [b]system.poke_basic[/b]
- Reduce the number of poke verbs to exactly 1 ("poke"). Disable other verbs.
+ [b]system.transport_security_header[/b]
+ if non-zero and SSL is being used, include a strict-transport-security header on webpages
+ [b]system.poke_basic[/b]
+ Reduce the number of poke verbs to exactly 1 ("poke"). Disable other verbs.
[b]system.openssl_conf_file[/b]
- Specify a file containing OpenSSL configuration. Read the code first.
- If you can't read the code, don't play with it.
+ Specify a file containing OpenSSL configuration. Needed in some Windows installations to
+ locate the openssl configuration file on the system.
+ Read the code first. If you can't read the code, don't play with it.
[b]system.optimize_items[/b]
Runs optimise_table during some tasks to keep your database nice and
defragmented. This comes at a performance cost while the operations
are running, but also keeps things a bit faster while it's not.
There also exist CLI utilities for performing this operation, which you
may prefer, especially if you're a large site.
- [b]system.expire_limit
- Don't expire any more than this number of posts per channel per
- expiration run to keep from exhausting memory. Default 5000.
+ [b]system.expire_limit[/b]
+ Don't expire any more than this number of posts per channel per
+ expiration run to keep from exhausting memory. Default 5000.
[b]system.dlogfile[/b]
Logfile to use for logging development errors. Exactly the same as
logger otherwise. This isn't magic, and requires your own logging
@@ -138,13 +146,17 @@ This document assumes you're an administrator.
[b]system.cron_hour[/b]
Specify an hour in which to run cron_daily. By default with no config, this will run at midnight UTC.
[b]system.minimum_feedcheck_minutes[/b]
- The minimum interval between polling RSS feeds. If this is lower than the cron interval, feeds will be polled with each cronjob. Defaults to 60 if not set. The site setting can also be over-ridden on a channel by channel basis by a service class setting aptly named 'minimum_feedcheck_minutes'.
+ The minimum interval between polling RSS feeds. If this is lower than the cron interval, feeds
+ will be polled with each cronjob. Defaults to 60 if not set. The site setting can also be over-ridden
+ on a channel by channel basis by a service class setting aptly named 'minimum_feedcheck_minutes'.
[b]system.blacklisted_sites[/b]
An array of specific hubs to block from this hub completely.
[b]system.ignore_imagick[/b]
Ignore imagick and use GD, even if imagick is installed on the server. Prevents some issues with PNG files in older versions of imagick.
[b]system.no_age_restriction[/b]
- Do not restrict registration to people over the age of 13. This carries legal responsibilities in many countries to require that age be provided and to block all personal information from minors, so please check your local laws before changing.
+ Do not restrict registration to people over the age of 13. This carries legal responsibilities in
+ many countries to require that age be provided and to block all personal information from minors,
+ so please check your local laws before changing.
[b]system.override_poll_lockfile[/b]
Ignore the lock file in the poller process to allow more than one process to run at a time.
[b]system.projecthome[/b]
@@ -158,16 +170,23 @@ This document assumes you're an administrator.
[b]system.photo_cache_time[/b]
How long to cache photos, in seconds. Default is 86400 (1 day).
Longer time increases performance, but it also means it takes longer for changed permissions to apply.
- [b]system.poco_rating_enable[/b]
- Distributed reputation reporting and data collection may be disabled. If your site does not participate in distributed reputation you will also not be able to make use of the data from your connections on other sites. By default and in the absence of any setting it is enabled. Individual members can opt out by restricting who can see their connections or by not providing any reputation information for their connections.
- [b]system.register_link[/b]
- path to direct to from the "register" link on the login form. On closed sites this will direct to 'pubsites'. For open sites it will normally redirect to 'register' but you may change this to a custom site page offering subscriptions or whatever.
- [b]system.max_import_size[/b]
- If configured, the maximum length of an imported text message. This is normally left at 200Kbytes or more to accomodate Friendica private photos, which are embedded.
- [b]system.tempdir[/b]
- Place to store temporary files (currently unused), default is defined in the PHP configuration
- [b]system.uploaddir[/b]
- Location to upload files (default is system.tempdir, currently used only by js_upload plugin)
+ [b]system.poco_rating_enable[/b]
+ Distributed reputation reporting and data collection may be disabled. If your site does not participate
+ in distributed reputation you will also not be able to make use of the data from your connections on
+ other sites. By default and in the absence of any setting it is enabled. Individual members can opt out
+ by restricting who can see their connections or by not providing any reputation information for their
+ connections.
+ [b]system.register_link[/b]
+ path to direct to from the "register" link on the login form. On closed sites this will direct to
+ 'pubsites'. For open sites it will normally redirect to 'register' but you may change this to a
+ custom site page offering subscriptions or whatever.
+ [b]system.max_import_size[/b]
+ If configured, the maximum length of an imported text message. This is normally left at 200Kbytes
+ or more to accomodate Friendica private photos, which are embedded.
+ [b]system.tempdir[/b]
+ Place to store temporary files (currently unused), default is defined in the PHP configuration
+ [b]system.uploaddir[/b]
+ Location to upload files (default is system.tempdir, currently used only by js_upload plugin)
[b]system.disable_discover_tab[/b]
This allows you to completely disable the ability to discover public content from external sites.
[b]system.sys_expire_days[/b]
@@ -175,9 +194,8 @@ This document assumes you're an administrator.
[b]system.openssl_encrypt[/b]
Use openssl encryption engine, default is false (uses mcrypt for AES encryption)
[b]system.max_tagged_forums[/b]
- Spam prevention. Limits the number of tagged forums which are recognised in any post. Default is 2. Only the first 'n' tags will be delivered as forums, the others will not cause any delivery.
- [b]system.openssl_conf_file[/b]
- Needed in some Windows installations to locate the openssl configuration file on the system.
+ Spam prevention. Limits the number of tagged forums which are recognised in any post.
+ Default is 2. Only the first 'n' tags will be delivered as forums, the others will not cause any delivery.
[b]system.hide_help[/b]
Don't display help documentation link in nav bar
[b]system.expire_delivery_reports[/b]
@@ -187,7 +205,8 @@ This document assumes you're an administrator.
[b]system.hide_version[/b] *
If true, do not report the software version on webpages and tools. (*) Must be set in .htconfig.php
[b]system.hidden_version_siteinfo[/b]
- If true, do not report the software version on siteinfo pages (system.hide_version also hides the version on these pages, this setting *only* hides the version on siteinfo pages).
+ If true, do not report the software version on siteinfo pages (system.hide_version also hides
+ the version on these pages, this setting *only* hides the version on siteinfo pages).
[b]system.email_notify_icon_url[/b]
URL of image (32x32) to display in email notifications (HTML bodies).
diff --git a/doc/hooklist.bb b/doc/hooklist.bb
index bae641585..994d0dbb2 100644
--- a/doc/hooklist.bb
+++ b/doc/hooklist.bb
@@ -34,12 +34,18 @@ Hooks allow plugins/addons to "hook into" the code at many points and alter the
[zrl=[baseurl]/help/hook/activity_received]activity_received[/zrl]
Called when an activity (post, comment, like, etc.) has been received from a zot source
+[zrl=[baseurl]/help/hook/admin_aside]admin_aside[/zrl]
+ Called when generating the admin page sidebar widget
+
[zrl=[baseurl]/help/hook/affinity_labels]affinity_labels[/zrl]
Used to generate alternate labels for the affinity slider.
[zrl=[baseurl]/help/hook/api_perm_is_allowed]api_perm_is_allowed[/zrl]
Called when perm_is_allowed() is executed from an API call.
+[zrl=[baseurl]/help/hook/app_menu]app_menu[/zrl]
+ Called when generating the app_menu dropdown (may be obsolete)
+
[zrl=[baseurl]/help/hook/atom_author]atom_author[/zrl]
Called when generating an author or owner element for an Atom ActivityStream feed
@@ -88,6 +94,9 @@ Hooks allow plugins/addons to "hook into" the code at many points and alter the
[zrl=[baseurl]/help/hook/check_siteallowed]check_siteallowed[/zrl]
Used to over-ride or bypass the site black/white block lists
+[zrl=[baseurl]/help/hook/comment_buttons]comment_buttons[/zrl]
+ Called when rendering the edit buttons for comments
+
[zrl=[baseurl]/help/hook/connect_premium]connect_premium[/zrl]
Called when connecting to a premium channel
@@ -112,6 +121,9 @@ Hooks allow plugins/addons to "hook into" the code at many points and alter the
[zrl=[baseurl]/help/hook/conversation_start]conversation_start[/zrl]
Called in the beginning of rendering a conversation (message or message collection or stream)
+[zrl=[baseurl]/help/hook/cover_photo_content_end]cover_photo_content_end[/zrl]
+ Called after a cover photo has been uplaoded
+
[zrl=[baseurl]/help/hook/create_identity]create_identity[/zrl]
Called when creating a channel
@@ -184,6 +196,9 @@ Hooks allow plugins/addons to "hook into" the code at many points and alter the
[zrl=[baseurl]/help/hook/follow]follow[/zrl]
called when a follow operation takes place
+[zrl=[baseurl]/help/hook/follow_from_feed]follow_from_feed[/zrl]
+ called when a follow operation takes place on an RSS feed
+
[zrl=[baseurl]/help/hook/follow_allow]follow_allow[/zrl]
called before storing the results of a follow operation
@@ -206,6 +221,9 @@ Hooks allow plugins/addons to "hook into" the code at many points and alter the
[zrl=[baseurl]/help/hook/get_all_perms]get_all_perms[/zrl]
called when get_all_perms() is used
+[zrl=[baseurl]/help/hook/get_best_language]get_best_language[/zrl]
+ called when choosing the preferred language for the page
+
[zrl=[baseurl]/help/hook/get_features]get_features[/zrl]
Called when get_features() is called
@@ -266,6 +284,9 @@ Hooks allow plugins/addons to "hook into" the code at many points and alter the
[zrl=[baseurl]/help/hook/local_dir_update]local_dir_update[/zrl]
Called when processing a directory update from a channel on the directory server
+[zrl=[baseurl]/help/hook/location_move]location_move[/zrl]
+ Called when a new location has been provided to a UNO channel (indicating a move rather than a clone)
+
[zrl=[baseurl]/help/hook/logged_in]logged_in[/zrl]
Called when authentication by any means has succeeeded
@@ -281,6 +302,9 @@ Hooks allow plugins/addons to "hook into" the code at many points and alter the
[zrl=[baseurl]/help/hook/magic_auth]magic_auth[/zrl]
Called when processing a magic-auth sequence
+[zrl=[baseurl]/help/hook/match_webfinger_location]match_webfinger_location[/zrl]
+ Called when processing webfinger requests
+
[zrl=[baseurl]/help/hook/magic_auth_openid_success]magic_auth_openid_success[/zrl]
Called when a magic-auth was successful due to openid credentials
@@ -324,7 +348,10 @@ Hooks allow plugins/addons to "hook into" the code at many points and alter the
Called when a hub is delivered
[zrl=[baseurl]/help/hook/notifier_normal]notifier_normal[/zrl]
- Called when the notofoer is invoked for a 'normal' delivery
+ Called when the notifier is invoked for a 'normal' delivery
+
+[zrl=[baseurl]/help/hook/notifier_process]notifier_process[/zrl]
+ Called when the notifier is processing a message/event
[zrl=[baseurl]/help/hook/obj_verbs]obj_verbs[/zrl]
Called when creating the list of verbs available for profile "things".
@@ -445,6 +472,9 @@ Hooks allow plugins/addons to "hook into" the code at many points and alter the
[zrl=[baseurl]/help/hook/profile_tabs]profile_tabs[/zrl]
Called when generating the tabs for channel related pages (channel,profile,files,etc.)
+
+[zrl=[baseurl]/help/hook/queue_deliver]queue_deliver[/zrl]
+ Called when delivering a queued message
[zrl=[baseurl]/help/hook/register_account]register_account[/zrl]
Called when an account has been created
@@ -458,6 +488,9 @@ Hooks allow plugins/addons to "hook into" the code at many points and alter the
[zrl=[baseurl]/help/hook/reverse_magic_auth]reverse_magic_auth[/zrl]
Called before invoking reverse magic auth to send you to your own site to authenticate on this site
+[zrl=[baseurl]/help/hook/settings_account]settings_account[/zrl]
+ Called when generating the account settings form
+
[zrl=[baseurl]/help/hook/settings_form]settings_form[/zrl]
Called when generating the channel settings form
diff --git a/doc/plugins.bb b/doc/plugins.bb
index f74276038..f2f0b04e8 100644
--- a/doc/plugins.bb
+++ b/doc/plugins.bb
@@ -1,6 +1,6 @@
[b]Plugins[/b]
-So you want to make the $Projectname do something it doesn't already do. There are lots of ways. But let's learn how to write a plugin or addon.
+So you want to make $Projectname do something it doesn't already do. There are lots of ways. But let's learn how to write a plugin or addon.
In your $Projectname folder/directory, you will probably see a sub-directory called 'addon'. If you don't have one already, go ahead and create it.
@@ -45,16 +45,16 @@ In our case, we'll call them randplace_load() and randplace_unload(), as that is
pluginname_uninstall()
[/code]
-Next we'll talk about **hooks**. Hooks are places in the $Projectname code where we allow plugins to do stuff. There are a [lot of these](help/Hooks), and they each have a name. What we normally do is use the pluginname_load() function to register a &quot;handler function&quot; for any hooks you are interested in. Then when any of these hooks are triggered, your code will be called.
+Next we'll talk about [b]hooks[/b]. Hooks are places in the $Projectname code where we allow plugins to do stuff. There are a [url=[baseurl]/help/hooklist]lot of these[/url], and they each have a name. What we normally do is use the pluginname_load() function to register a &quot;handler function&quot; for any hooks you are interested in. Then when any of these hooks are triggered, your code will be called.
-We register hook handlers with the 'register_hook()' function. It takes 3 arguments. The first is the hook we wish to catch, the second is the filename of the file to find our handler function (relative to the base of your $Projectname installation), and the third is the function name of your handler function. So let's create our randplace_load() function right now.
+We register hook handlers with the 'Zotlabs\Extend\Hook::register()' function. It typically takes 3 arguments. The first is the hook we wish to catch, the second is the filename of the file to find our handler function (relative to the base of your $Projectname installation), and the third is the function name of your handler function. So let's create our randplace_load() function right now.
[code]
function randplace_load() {
- register_hook('post_local', 'addon/randplace/randplace.php', 'randplace_post_hook');
+ Zotlabs\Extend\Hook::register('post_local', 'addon/randplace/randplace.php', 'randplace_post_hook');
- register_hook('feature_settings', 'addon/randplace/randplace.php', 'randplace_settings');
- register_hook('feature_settings_post', 'addon/randplace/randplace.php', 'randplace_settings_post');
+ Zotlabs\Extend\Hook::register('feature_settings', 'addon/randplace/randplace.php', 'randplace_settings');
+ Zotlabs\Extend\Hook::register('feature_settings_post', 'addon/randplace/randplace.php', 'randplace_settings_post');
}
[/code]
@@ -64,21 +64,18 @@ So we're going to catch three events, 'post_local' which is triggered when a pos
Next we'll create an unload function. This is easy, as it just unregisters our hooks. It takes exactly the same arguments.
[code]
function randplace_unload() {
- unregister_hook('post_local', 'addon/randplace/randplace.php', 'randplace_post_hook');
-
- unregister_hook('feature_settings', 'addon/randplace/randplace.php', 'randplace_settings');
- unregister_hook('feature_settings_post', 'addon/randplace/randplace.php', 'randplace_settings_post');
+ Zotlabs\Extend\Hook::unregister('post_local', 'addon/randplace/randplace.php', 'randplace_post_hook');
+ Zotlabs\Extend\Hook::unregister('feature_settings', 'addon/randplace/randplace.php', 'randplace_settings');
+ Zotlabs\Extend\Hook::unregister('feature_settings_post', 'addon/randplace/randplace.php', 'randplace_settings_post');
}
[/code]
-Hooks are called with two arguments. The first is always $a, which is our global App structure and contains a huge amount of information about the state of the web request we are processing; as well as who the viewer is, and what our login state is, and the current contents of the web page we're probably constructing.
-
-The second argument is specific to the hook you're calling. It contains information relevant to that particular place in the program, and often allows you to look at, and even change it. In order to change it, you need to add '&amp;' to the variable name so it is passed to your function by reference. Otherwise it will create a copy and any changes you make will be lost when the hook process returns. Usually (but not always) the second argument is a named array of data structures. Please see the &quot;hook reference&quot; (not yet written as of this date) for details on any specific hook. Occasionally you may need to view the program source to see precisely how a given hook is called and how the results are processed.
+Hooks are always called with one argument which is specific to the hook you're calling. It contains information relevant to that particular place in the program, and often allows you to look at, and even change it. In order to change it, you need to add '&amp;' to the variable name so it is passed to your function by reference. Otherwise it will create a copy and any changes you make will be lost when the hook process returns. Usually (but not always) the passed data is a named array of data structures. Please see the &quot;hook reference&quot; (not yet written as of this date) for details on any specific hook. Occasionally you may need to view the program source to see precisely how a given hook is called and how the results are processed.
Let's go ahead and add some code to implement our post_local hook handler.
[code]
- function randplace_post_hook($a, &amp;$item) {
+ function randplace_post_hook(&amp;$item) {
/**
*
@@ -145,7 +142,7 @@ Now let's add our functions to create and store preference settings.
*
*/
- function randplace_settings_post($a,$post) {
+ function randplace_settings_post($post) {
if(! local_channel())
return;
if($_POST['randplace-submit'])
@@ -171,7 +168,7 @@ Now let's add our functions to create and store preference settings.
- function randplace_settings(&amp;$a,&amp;$s) {
+ function randplace_settings(&amp;$s) {
if(! local_channel())
return;
@@ -205,19 +202,46 @@ Now let's add our functions to create and store preference settings.
-***Advanced Plugins***
+[h2]Advanced Plugins[/h2]
Sometimes your plugins want to provide a range of new functionality which isn't provided at all or is clumsy to provide using hooks. In this case your plugin can also act as a 'module'. A module in our case refers to a structured webpage handler which responds to a given URL. Then anything which accesses that URL will be handled completely by your plugin.
-The key to this is to create a simple function named pluginname_module() which does nothing.
+There are two ways to accomplish this. To create a module object use the following model:
+[code]
+<?php /* file: addon/randplace/Mod_Randplace.php */
+namespace Zotlabs\Module;
+
+ // Your module will consist of the name of your addon with an uppercase first character, within the Zotlabs\Module namespace
+ // To avoid namespace conflicts with your plugin, the convention we're using is to name the module file Mod_Addonname.php
+ // In this case 'Mod_Randplace.php' and then include it from within your main plugin file 'randplace.php' with the line:
+ //
+ // require_once('addon/randplace/Mod_Randplace.php');
+
+ class Randplace extends \Zotlabs\Web\Controller {
+ function init() {
+ // init method is always called first if it exists
+ }
+ function post() {
+ // the post method is only called if there are $_POST variables present (e.g. the page request method is "post")
+ }
+ function get() {
+ // The get method is used to display normal content on the page
+ // whatever this function returns will be displayed in the page body
+ }
+ }
+[/code]
+
+The other option is to use a procedural interface. The $a argument to these function is obsolete, but must be present.
+The key to this is to create a simple function named pluginname_module() which does nothing. These lines and this interface
+can be used inside your addon file without causing a namespace conflict, as the object method will.
+
[code]
function randplace_module() { return; }
[/code]
-Once this function exists, the URL #^[url=https://yoursite/randplace]https://yoursite/randplace[/url] will access your plugin as a module. Then you can define functions which are called at various points to build a webpage just like the modules in the mod/ directory. The typical functions and the order which they are called is
+Once this function exists, the URL #^[url=https://yoursite/randplace]https://yoursite/randplace[/url] will access your plugin as a module. Then you can define functions which are called at various points to return or process a structured webpage just like system modules. The typical functions and the order which they are called is
[code]
modulename_init($a) // (e.g. randplace_init($a);) called first - if you wish to emit json or xml,
// you should do it here, followed by killme() which will avoid the default action of building a webpage
- modulename_aside($a) // Often used to create sidebar content
modulename_post($a) // Called whenever the page is accessed via the &quot;post&quot; method
modulename_content($a) // called to generate the central page content. This function should return a string
// consisting of the central page content.
@@ -228,7 +252,7 @@ Your module functions have access to the URL path as if they were standalone pro
[/code]
we will create an argc/argv list for use by your module functions
[code]
- $x = argc(); $x will be 4, the number of path arguments after the sitename
+ $x = argc(); // $x will be 4, the number of path arguments after the sitename
for($x = 0; $x &lt; argc(); $x ++)
echo $x . ' ' . argv($x);
@@ -240,6 +264,30 @@ we will create an argc/argv list for use by your module functions
3 whatever
[/code]
+[h3]Using class methods as hook handler functions[/h3]
+
+To register a hook using a class method as a callback, a couple of things need to be considered. The first is that the functions need to be declared static public so that they are available from all contexts, and they need to have a namespace attached because they can be called from within multiple namespaces. You can then register them as strings or arrays (using the PHP internal calling method).
+
+[code]
+<?php
+/*
+ * plugin info block goes here
+ */
+
+function myplugin_load() {
+ Zotlabs\Extend\Hook::register('hook_name','addon/myplugin/myplugin.php','\\Myplugin::foo');
+[b]or[/b]
+ Zotlabs\Extend\Hook::register('hook_name','addon/myplugin/myplugin.php',array('\\Myplugin','foo'));
+}
+
+class Myplugin {
+
+ public static function foo($params) {
+ // handler for 'hook_name'
+ }
+}
+[/code]
+
If you want to keep your plugin hidden from the siteinfo page, simply create a file called '.hidden' in your addon directory
[code]
touch addon/<addon name>/.hidden
@@ -259,6 +307,6 @@ The $Projectname has _install and _uninstall functions but these are used differ
[li] Friendica's &quot;plugin_settings_post&quot; hook is called &quot;feature_settings_post&quot;[/li]
-Changing these will often allow your plugin to function, but please double check all your permission and identity code because the concepts behind it are completely different in the $Projectname. Many structured data names (especially DB schema columns) are also quite different.
+Changing these will often allow your plugin to function, but please double check all your permission and identity code because the concepts behind it are completely different in $Projectname. Many structured data names (especially DB schema columns) are also quite different.
#include doc/macros/main_footer.bb;
diff --git a/doc/webpages.bb b/doc/webpages.bb
index 040ad0c5c..6b3a800cb 100644
--- a/doc/webpages.bb
+++ b/doc/webpages.bb
@@ -1,6 +1,6 @@
[b]Creating Web Pages[/b]
-Red enables users to create static webpages. To activate this feature, enable the web pages feature in your Additional Features section.
+Hubzilla enables users to create static webpages. To activate this feature, enable the web pages feature in your Additional Features section.
Once enabled, a new tab will appear on your channel page labelled &quot;Webpages&quot;. Clicking this link will take you to the webpage editor.
Pages will be accessible at mydomain/page/username/pagelinktitle
diff --git a/include/api.php b/include/api.php
index fd644947c..e64c86695 100644
--- a/include/api.php
+++ b/include/api.php
@@ -772,13 +772,15 @@ require_once('include/api_auth.php');
$_REQUEST['silent']='1'; //tell wall_upload function to return img info instead of echo
$_FILES['userfile'] = $_FILES['media'];
- require_once('mod/wall_attach.php');
- $posted = wall_attach_post($a);
-
- //now that we have the img url in bbcode we can add it to the status and insert the wall item.
+
+ $mod = new Zotlabs\Module\Wall_attach();
+ $mod->post();
+
+
$_REQUEST['body']=$txt."\n\n".$posted;
- require_once('mod/item.php');
- item_post($a);
+
+ $mod = new Zotlabs\Module\Item();
+ $mod->post();
// this should output the last post (the one we just posted).
return api_status_show($a,$type);
@@ -871,9 +873,9 @@ require_once('include/api_auth.php');
// upload each image if we have any
$_REQUEST['silent']='1'; //tell wall_upload function to return img info instead of echo
- require_once('mod/wall_attach.php');
+ $mod = new Zotlabs\Module\Wall_attach();
App::$data['api_info'] = $user_info;
- $media = wall_attach_post($a);
+ $media = $mod->post();
if(strlen($media)>0)
$_REQUEST['body'] .= "\n\n" . $media;
@@ -884,9 +886,9 @@ require_once('include/api_auth.php');
$_FILES['userfile'] = $_FILES['media'];
// upload each image if we have any
$_REQUEST['silent']='1'; //tell wall_upload function to return img info instead of echo
- require_once('mod/wall_attach.php');
+ $mod = new Zotlabs\Module\Wall_attach();
App::$data['api_info'] = $user_info;
- $media = wall_attach_post($a);
+ $media = $mod->post();
if(strlen($media)>0)
$_REQUEST['body'] .= "\n\n" . $media;
@@ -896,8 +898,8 @@ require_once('include/api_auth.php');
// call out normal post function
- require_once('mod/item.php');
- item_post($a);
+ $mod = new Zotlabs\Module\Item();
+ $mod->post();
// this should output the last post (the one we just posted).
return api_status_show($a,$type);
@@ -926,14 +928,14 @@ require_once('include/api_auth.php');
$_FILES['userfile'] = $_FILES['media'];
// upload the image if we have one
$_REQUEST['silent']='1'; //tell wall_upload function to return img info instead of echo
- require_once('mod/wall_upload.php');
- $media = wall_upload_post($a);
+ $mod = new Zotlabs\Module\Wall_upload();
+ $media = $mod->post();
if(strlen($media)>0)
$_REQUEST['body'] .= "\n\n".$media;
}
- require_once('mod/item.php');
- $x = item_post($a);
+ $mod = new Zotlabs\Module\Item();
+ $x = $mod->post();
json_return_and_die($x);
}
@@ -1423,9 +1425,8 @@ require_once('include/api_auth.php');
$_REQUEST['profile_uid'] = api_user();
$_REQUEST['type'] = 'wall';
$_REQUEST['api_source'] = true;
-
- require_once('mod/item.php');
- item_post($a);
+ $mod = new Zotlabs\Module\Item();
+ $mod->post();
}
}
else
diff --git a/include/bb2diaspora.php b/include/bb2diaspora.php
index 1ed57bfd4..9167cb5ad 100644
--- a/include/bb2diaspora.php
+++ b/include/bb2diaspora.php
@@ -270,7 +270,14 @@ function bb2dmention_callback($match) {
function bb2diaspora_itemwallwall(&$item) {
+ // We will provide wallwall (embedded author on the Diaspora side) if
+ // 1. It is a wall-to-wall post
+ // 2. A comment arrived which has no Diaspora signature info
+
+
+ $wallwall = false;
$author_exists = true;
+
if(! array_key_exists('author',$item)) {
$author_exists = false;
logger('bb2diaspora_itemwallwall: no author');
@@ -281,11 +288,21 @@ function bb2diaspora_itemwallwall(&$item) {
$item['author'] = $r[0];
}
- if(($item['mid'] == $item['parent_mid']) && ($item['author_xchan'] != $item['owner_xchan']) && (is_array($item['author']))) {
- logger('bb2diaspora_itemwallwall: author: ' . print_r($item['author'],true), LOGGER_DATA);
+ $has_meta = false;
+ if($item['diaspora_meta'] || get_iconfig($item,'diaspora','fields'))
+ $has_meta = true;
+
+ if($item['author_xchan'] != $item['owner_xchan']) {
+ if($item['mid'] == $item['parent_mid'])
+ $wallwall = true;
+ else {
+ if(! $has_meta) {
+ $wallwall = true;
+ }
+ }
}
- if(($item['mid'] == $item['parent_mid']) && ($item['author_xchan'] != $item['owner_xchan']) && (is_array($item['author'])) && $item['author']['xchan_url'] && $item['author']['xchan_name'] && $item['author']['xchan_photo_m']) {
+ if(($wallwall) && (is_array($item['author'])) && $item['author']['xchan_url'] && $item['author']['xchan_name'] && $item['author']['xchan_photo_m']) {
logger('bb2diaspora_itemwallwall: wall to wall post',LOGGER_DEBUG);
// post will come across with the owner's identity. Throw a preamble onto the post to indicate the true author.
$item['body'] = "\n\n"
@@ -301,7 +318,12 @@ function bb2diaspora_itemwallwall(&$item) {
}
-function bb2diaspora_itembody($item, $force_update = false) {
+function bb2diaspora_itembody($item, $force_update = false, $have_channel = false) {
+
+
+ if(! get_iconfig($item,'diaspora','fields')) {
+ $force_update = true;
+ }
$matches = array();
@@ -339,8 +361,8 @@ function bb2diaspora_itembody($item, $force_update = false) {
}
}
-
- bb2diaspora_itemwallwall($newitem);
+ if(! $have_channel)
+ bb2diaspora_itemwallwall($newitem);
$title = $newitem['title'];
$body = preg_replace('/\#\^http/i', 'http', $newitem['body']);
diff --git a/include/bbcode.php b/include/bbcode.php
index 78a2759c1..b8cd23f59 100644
--- a/include/bbcode.php
+++ b/include/bbcode.php
@@ -330,8 +330,19 @@ function bb_map_location($match) {
}
function bb_opentag($match) {
+ $openclose = (($match[2]) ? '<span class="bb-open" title="' . t('Click to open/close') . '">' . $match[1] . '</span>' : t('Click to open/close'));
+ $text = (($match[2]) ? $match[2] : $match[1]);
$rnd = mt_rand();
- return "<br /><div onclick=\"openClose('opendiv-" . $rnd . "');return false;\" class=\"fakelink\">" . $match[1] . "</div><div id=\"opendiv-" . $rnd . "\" style=\"display: none;\">" . $match[2] . "</div>";
+
+ return '<div onclick="openClose(\'opendiv-' . $rnd . '\'); return false;" class="fakelink">' . $openclose . '</div><div id="opendiv-' . $rnd . '" style="display: none;">' . $text . '</div>';
+}
+
+function bb_spoilertag($match) {
+ $openclose = (($match[2]) ? '<span class="bb-spoiler" title="' . t('Click to open/close') . '">' . $match[1] . ' ' . t('spoiler') . '</span>' : t('Click to open/close'));
+ $text = (($match[2]) ? $match[2] : $match[1]);
+ $rnd = mt_rand();
+
+ return '<div onclick="openClose(\'opendiv-' . $rnd . '\'); return false;" class="fakelink">' . $openclose . '</div><blockquote id="opendiv-' . $rnd . '" style="display: none;">' . $text . '</blockquote>';
}
/**
@@ -748,33 +759,34 @@ function bbcode($Text, $preserve_nl = false, $tryoembed = true, $cache = false)
$Text = preg_replace("/\[code\](.*?)\[\/code\]/ism", "$CodeLayout", $Text);
}
- // Declare the format for [spoiler] layout
- $SpoilerLayout = '<blockquote class="spoiler">$1</blockquote>';
-
// Check for [spoiler] text
- // handle nested quotes
$endlessloop = 0;
- while ((strpos($Text, "[/spoiler]") !== false) and (strpos($Text, "[spoiler]") !== false) and (++$endlessloop < 20))
- $Text = preg_replace("/\[spoiler\](.*?)\[\/spoiler\]/ism", "$SpoilerLayout", $Text);
+ while ((strpos($Text, "[/spoiler]")!== false) and (strpos($Text, "[spoiler]") !== false) and (++$endlessloop < 20)) {
+ $Text = preg_replace_callback("/\[spoiler\](.*?)\[\/spoiler\]/ism", 'bb_spoilertag', $Text);
+ }
// Check for [spoiler=Author] text
-
- $t_wrote = t('$1 spoiler');
-
- // handle nested quotes
$endlessloop = 0;
- while ((strpos($Text, "[/spoiler]")!== false) and (strpos($Text, "[spoiler=") !== false) and (++$endlessloop < 20))
- $Text = preg_replace("/\[spoiler=[\"\']*(.*?)[\"\']*\](.*?)\[\/spoiler\]/ism",
- "<br /><strong class=".'"spoiler"'.">" . $t_wrote . "</strong><blockquote class=".'"spoiler"'.">$2</blockquote>",
- $Text);
+ while ((strpos($Text, "[/spoiler]")!== false) and (strpos($Text, "[spoiler=") !== false) and (++$endlessloop < 20)) {
+ $Text = preg_replace_callback("/\[spoiler=(.*?)\](.*?)\[\/spoiler\]/ism", 'bb_spoilertag', $Text);
+ }
+ // Check for [open] text
+ $endlessloop = 0;
+ while ((strpos($Text, "[/open]")!== false) and (strpos($Text, "[open]") !== false) and (++$endlessloop < 20)) {
+ $Text = preg_replace_callback("/\[open\](.*?)\[\/open\]/ism", 'bb_opentag', $Text);
+ }
+ // Check for [open=Title] text
$endlessloop = 0;
while ((strpos($Text, "[/open]")!== false) and (strpos($Text, "[open=") !== false) and (++$endlessloop < 20)) {
$Text = preg_replace_callback("/\[open=(.*?)\](.*?)\[\/open\]/ism", 'bb_opentag', $Text);
}
+
+
+
// Declare the format for [quote] layout
$QuoteLayout = '<blockquote>$1</blockquote>';
@@ -792,7 +804,7 @@ function bbcode($Text, $preserve_nl = false, $tryoembed = true, $cache = false)
$endlessloop = 0;
while ((strpos($Text, "[/quote]")!== false) and (strpos($Text, "[quote=") !== false) and (++$endlessloop < 20))
$Text = preg_replace("/\[quote=[\"\']*(.*?)[\"\']*\](.*?)\[\/quote\]/ism",
- "<br /><strong class=".'"author"'.">" . $t_wrote . "</strong><blockquote>$2</blockquote>",
+ "<span class=".'"bb-quote"'.">" . $t_wrote . "</span><blockquote>$2</blockquote>",
$Text);
// Images
diff --git a/include/config.php b/include/config.php
index 712b4ca11..12768f4da 100644
--- a/include/config.php
+++ b/include/config.php
@@ -625,3 +625,160 @@ function del_abconfig($chash,$xhash,$family,$key) {
return $r;
}
+
+
+
+
+
+
+function get_iconfig(&$item, $family, $key) {
+
+ $is_item = false;
+ if(is_array($item)) {
+ $is_item = true;
+ if((! array_key_exists('iconfig',$item)) || (! is_array($item['iconfig'])))
+ $item['iconfig'] = array();
+
+ if(array_key_exists('item_id',$item))
+ $iid = $item['item_id'];
+ else
+ $iid = $item['id'];
+ }
+ elseif(intval($item))
+ $iid = $item;
+
+ if(! $iid)
+ return false;
+
+ if(is_array($item) && array_key_exists('iconfig',$item) && is_array($item['iconfig'])) {
+ foreach($item['iconfig'] as $c) {
+ if($c['iid'] == $iid && $c['cat'] == $family && $c['k'] == $key)
+ return $c['v'];
+ }
+ }
+
+ $r = q("select * from iconfig where iid = %d and cat = '%s' and k = '%s' limit 1",
+ intval($iid),
+ dbesc($family),
+ dbesc($key)
+ );
+ if($r) {
+ $r[0]['v'] = ((preg_match('|^a:[0-9]+:{.*}$|s',$r[0]['v'])) ? unserialize($r[0]['v']) : $r[0]['v']);
+ if($is_item)
+ $item['iconfig'][] = $r[0];
+ return $r[0]['v'];
+ }
+ return false;
+
+}
+
+/**
+ * set_iconfig(&$item, $family, $key, $value, $sharing = false);
+ *
+ * $item - item array or item id. If passed an array the iconfig meta information is
+ * added to the item structure (which will need to be saved with item_store eventually).
+ * If passed an id, the DB is updated, but may not be federated and/or cloned.
+ * $family - namespace of meta variable
+ * $key - key of meta variable
+ * $value - value of meta variable
+ * $sharing - boolean (default false); if true the meta information is propagated with the item
+ * to other sites/channels, mostly useful when $item is an array and has not yet been stored/delivered.
+ * If the meta information is added after delivery and you wish it to be shared, it may be necessary to
+ * alter the item edited timestamp and invoke the delivery process on the updated item. The edited
+ * timestamp needs to be altered in order to trigger an item_store_update() at the receiving end.
+ */
+
+
+function set_iconfig(&$item, $family, $key, $value, $sharing = false) {
+
+ $dbvalue = ((is_array($value)) ? serialize($value) : $value);
+ $dbvalue = ((is_bool($dbvalue)) ? intval($dbvalue) : $dbvalue);
+
+ $is_item = false;
+ $idx = null;
+
+ if(is_array($item)) {
+ $is_item = true;
+ if((! array_key_exists('iconfig',$item)) || (! is_array($item['iconfig'])))
+ $item['iconfig'] = array();
+ elseif($item['iconfig']) {
+ for($x = 0; $x < count($item['iconfig']); $x ++) {
+ if($item['iconfig'][$x]['cat'] == $family && $item['iconfig'][$x]['k'] == $key) {
+ $idx = $x;
+ }
+ }
+ }
+ $entry = array('cat' => $family, 'k' => $key, 'v' => $value, 'sharing' => $sharing);
+
+ if(is_null($idx))
+ $item['iconfig'][] = $entry;
+ else
+ $item['iconfig'][$idx] = $entry;
+ return $value;
+ }
+
+ if(intval($item))
+ $iid = intval($item);
+
+ if(! $iid)
+ return false;
+
+ if(get_iconfig($item, $family, $key) === false) {
+ $r = q("insert into iconfig( iid, cat, k, v, sharing ) values ( %d, '%s', '%s', '%s', %d ) ",
+ intval($iid),
+ dbesc($family),
+ dbesc($key),
+ dbesc($dbvalue),
+ intval($sharing)
+ );
+ }
+ else {
+ $r = q("update iconfig set v = '%s', sharing = %d where iid = %d and cat = '%s' and k = '%s' ",
+ dbesc($dbvalue),
+ intval($sharing),
+ intval($iid),
+ dbesc($family),
+ dbesc($key)
+ );
+ }
+
+ if(! $r)
+ return false;
+
+ return $value;
+}
+
+
+
+function del_iconfig(&$item, $family, $key) {
+
+
+ $is_item = false;
+ $idx = null;
+
+ if(is_array($item)) {
+ $is_item = true;
+ if(is_array($item['iconfig'])) {
+ for($x = 0; $x < count($item['iconfig']); $x ++) {
+ if($item['iconfig'][$x]['cat'] == $family && $item['iconfig'][$x]['k'] == $key) {
+ unset($item['iconfig'][$x]);
+ }
+ }
+ }
+ return true;
+ }
+
+ if(intval($item))
+ $iid = intval($item);
+
+ if(! $iid)
+ return false;
+
+ return q("delete from iconfig where iid = %d and cat = '%s' and k = '%s' ",
+ intval($iid),
+ dbesc($family),
+ dbesc($key)
+ );
+
+}
+
diff --git a/include/dba/dba_mysqli.php b/include/dba/dba_mysqli.php
index 6986d4586..57a7559a1 100755
--- a/include/dba/dba_mysqli.php
+++ b/include/dba/dba_mysqli.php
@@ -4,20 +4,26 @@ require_once('include/dba/dba_driver.php');
class dba_mysqli extends dba_driver {
- function connect($server, $port, $user,$pass,$db) {
+ function connect($server,$port,$user,$pass,$db) {
if($port)
$this->db = new mysqli($server,$user,$pass,$db, $port);
else
$this->db = new mysqli($server,$user,$pass,$db);
- if(! mysqli_connect_errno()) {
- $this->connected = true;
+ if($this->db->connect_error) {
+ $this->connected = false;
+ $this->error = $this->db->connect_error;
+
+ if(file_exists('dbfail.out')) {
+ file_put_contents('dbfail.out', datetime_convert() . "\nConnect: " . $this->error . "\n", FILE_APPEND);
+ }
+
+ return false;
}
- if($this->connected) {
+ else {
+ $this->connected = true;
return true;
}
- $this->error = $this->db->connect_error;
- return false;
}
function q($sql) {
diff --git a/include/help.php b/include/help.php
new file mode 100644
index 000000000..13473164d
--- /dev/null
+++ b/include/help.php
@@ -0,0 +1,150 @@
+<?php
+
+function load_doc_file($s) {
+ $lang = \App::$language;
+ if(! isset($lang))
+ $lang = 'en';
+ $b = basename($s);
+ $d = dirname($s);
+
+ $c = find_doc_file("$d/$lang/$b");
+ if($c)
+ return $c;
+ $c = find_doc_file($s);
+ if($c)
+ return $c;
+ return '';
+}
+
+function find_doc_file($s) {
+ if(file_exists($s))
+ return file_get_contents($s);
+ return '';
+}
+
+function search_doc_files($s) {
+
+ $a = get_app();
+
+ $itemspage = get_pconfig(local_channel(),'system','itemspage');
+ \App::set_pager_itemspage(((intval($itemspage)) ? $itemspage : 20));
+ $pager_sql = sprintf(" LIMIT %d OFFSET %d ", intval(\App::$pager['itemspage']), intval(\App::$pager['start']));
+
+ $regexop = db_getfunc('REGEXP');
+
+ $r = q("select item_id.sid, item.* from item left join item_id on item.id = item_id.iid where service = 'docfile' and
+ body $regexop '%s' and item_type = %d $pager_sql",
+ dbesc($s),
+ intval(ITEM_TYPE_DOC)
+ );
+
+ $r = fetch_post_tags($r,true);
+
+ for($x = 0; $x < count($r); $x ++) {
+
+ $r[$x]['text'] = $r[$x]['body'];
+
+ $r[$x]['rank'] = 0;
+ if($r[$x]['term']) {
+ foreach($r[$x]['term'] as $t) {
+ if(stristr($t['term'],$s)) {
+ $r[$x]['rank'] ++;
+ }
+ }
+ }
+ if(stristr($r[$x]['sid'],$s))
+ $r[$x]['rank'] ++;
+ $r[$x]['rank'] += substr_count(strtolower($r[$x]['text']),strtolower($s));
+ // bias the results to the observer's native language
+ if($r[$x]['lang'] === \App::$language)
+ $r[$x]['rank'] = $r[$x]['rank'] + 10;
+
+ }
+ usort($r,'doc_rank_sort');
+ return $r;
+}
+
+
+function doc_rank_sort($s1,$s2) {
+ if($s1['rank'] == $s2['rank'])
+ return 0;
+ return (($s1['rank'] < $s2['rank']) ? 1 : (-1));
+}
+
+
+function load_context_help() {
+
+ $path = App::$cmd;
+ $args = App::$argv;
+ $lang = App::$language;
+
+ if(! isset($lang) || !is_dir('doc/context/' . $lang . '/')) {
+ $lang = 'en';
+ }
+ while($path) {
+ $context_help = load_doc_file('doc/context/' . $lang . '/' . $path . '/help.html');
+ if(!$context_help) {
+ // Fallback to English if the translation is absent
+ $context_help = load_doc_file('doc/context/en/' . $path . '/help.html');
+ }
+ if($context_help)
+ break;
+ array_pop($args);
+ $path = implode($args,'/');
+ }
+
+ return $context_help;
+}
+
+
+function store_doc_file($s) {
+
+ if(is_dir($s))
+ return;
+
+ $item = array();
+ $sys = get_sys_channel();
+
+ $item['aid'] = 0;
+ $item['uid'] = $sys['channel_id'];
+
+
+ if(strpos($s,'.md'))
+ $mimetype = 'text/markdown';
+ elseif(strpos($s,'.html'))
+ $mimetype = 'text/html';
+ else
+ $mimetype = 'text/bbcode';
+
+ require_once('include/html2plain.php');
+
+ $item['body'] = html2plain(prepare_text(file_get_contents($s),$mimetype, true));
+ $item['mimetype'] = 'text/plain';
+
+ $item['plink'] = z_root() . '/' . str_replace('doc','help',$s);
+ $item['owner_xchan'] = $item['author_xchan'] = $sys['channel_hash'];
+ $item['item_type'] = ITEM_TYPE_DOC;
+
+ $r = q("select item.* from item left join item_id on item.id = item_id.iid where service = 'docfile' and
+ sid = '%s' and item_type = %d limit 1",
+ dbesc($s),
+ intval(ITEM_TYPE_DOC)
+ );
+
+ if($r) {
+ $item['id'] = $r[0]['id'];
+ $item['mid'] = $item['parent_mid'] = $r[0]['mid'];
+ $x = item_store_update($item);
+ }
+ else {
+ $item['mid'] = $item['parent_mid'] = item_message_id();
+ $x = item_store($item);
+ }
+
+ if($x['success']) {
+ update_remote_id($sys,$x['item_id'],ITEM_TYPE_DOC,$s,'docfile',0,$item['mid']);
+ }
+
+
+}
+
diff --git a/include/import.php b/include/import.php
index 3b5c8508c..f6e62f9e0 100644
--- a/include/import.php
+++ b/include/import.php
@@ -482,7 +482,7 @@ function sync_chatrooms($channel,$chatrooms) {
-function import_items($channel,$items) {
+function import_items($channel,$items,$sync = false) {
if($channel && $items) {
$allow_code = false;
@@ -499,6 +499,7 @@ function import_items($channel,$items) {
$deliver = false; // Don't deliver any messages or notifications when importing
foreach($items as $i) {
+ $item_result = false;
$item = get_item_elements($i,$allow_code);
if(! $item)
continue;
@@ -511,7 +512,13 @@ function import_items($channel,$items) {
if($item['edited'] > $r[0]['edited']) {
$item['id'] = $r[0]['id'];
$item['uid'] = $channel['channel_id'];
- item_store_update($item,$allow_code,$deliver);
+ $item_result = item_store_update($item,$allow_code,$deliver);
+ if($sync && $item['item_wall']) {
+ // deliver singletons if we have any
+ if($item_result && $item_result['success']) {
+ proc_run('php','include/notifier.php','single_activity',$item_result['item_id']);
+ }
+ }
continue;
}
}
@@ -520,13 +527,19 @@ function import_items($channel,$items) {
$item['uid'] = $channel['channel_id'];
$item_result = item_store($item,$allow_code,$deliver);
}
+ if($sync && $item['item_wall']) {
+ // deliver singletons if we have any
+ if($item_result && $item_result['success']) {
+ proc_run('php','include/notifier.php','single_activity',$item_result['item_id']);
+ }
+ }
}
}
}
function sync_items($channel,$items) {
- import_items($channel,$items);
+ import_items($channel,$items,true);
}
@@ -839,7 +852,7 @@ function import_conv($channel,$convs) {
-function import_mail($channel,$mails) {
+function import_mail($channel,$mails,$sync = false) {
if($channel && $mails) {
foreach($mails as $mail) {
if(array_key_exists('flags',$mail) && in_array('deleted',$mail['flags'])) {
@@ -863,12 +876,17 @@ function import_mail($channel,$mails) {
$m['aid'] = $channel['channel_account_id'];
$m['uid'] = $channel['channel_id'];
- mail_store($m);
+ $mail_id = mail_store($m);
+ if($sync && $mail_id) {
+ proc_run('php','include/notifier.php','single_mail',$mail_id);
+ }
}
}
}
-
+function sync_mail($channel,$mails) {
+ import_mail($channel,$mails,true);
+}
function sync_files($channel,$files) {
diff --git a/include/importdoc.php b/include/importdoc.php
index 10f868697..90dfb2fc4 100755
--- a/include/importdoc.php
+++ b/include/importdoc.php
@@ -9,7 +9,7 @@ function importdoc_run($argv, $argc){
cli_startup();
- require_once('mod/help.php');
+ require_once('include/help.php');
update_docs_dir('doc/*');
diff --git a/include/items.php b/include/items.php
index 95822c0ba..7947f64a2 100755
--- a/include/items.php
+++ b/include/items.php
@@ -555,8 +555,8 @@ function get_public_feed($channel, $params) {
// put a sane lower limit on feed requests if not specified
- if($params['begin'] === NULL_DATE)
- $params['begin'] = datetime_convert('UTC','UTC','now - 1 month');
+// if($params['begin'] === NULL_DATE)
+// $params['begin'] = datetime_convert('UTC','UTC','now - 1 month');
switch($params['type']) {
case 'json':
@@ -4235,10 +4235,10 @@ function atom_entry($item,$type,$author,$owner,$comment = false,$cid = 0) {
$obj = ((is_array($item['obj'])) ? $item['object'] : json_decode($item['object'],true));
$o .= '<title>' . xmlify($item['title']) . '</title>' . "\r\n";
- $o .= '<summary>' . xmlify(bbcode($obj['title'])) . '</summary>' . "\r\n";
+ $o .= '<summary xmlns="urn:ietf:params:xml:ns:xcal">' . xmlify(bbcode($obj['title'])) . '</summary>' . "\r\n";
$o .= '<dtstart xmlns="urn:ietf:params:xml:ns:xcal">' . datetime_convert('UTC','UTC', $obj['start'],'Ymd\\THis' . (($obj['adjust']) ? '\\Z' : '')) . '</dtstart>' . "\r\n";
$o .= '<dtend xmlns="urn:ietf:params:xml:ns:xcal">' . datetime_convert('UTC','UTC', $obj['finish'],'Ymd\\THis' . (($obj['adjust']) ? '\\Z' : '')) . '</dtend>' . "\r\n";
- $o .= '<location>' . bbcode($obj['location']) . '</location>' . "\r\n";
+ $o .= '<location xmlns="urn:ietf:params:xml:ns:xcal">' . xmlify(bbcode($obj['location'])) . '</location>' . "\r\n";
$o .= '<content type="' . $type . '" >' . xmlify(bbcode($obj['description'])) . '</content>' . "\r\n";
}
else {
@@ -5616,158 +5616,3 @@ function send_profile_photo_activity($channel,$photo,$profile) {
}
-
-
-
-
-function get_iconfig(&$item, $family, $key) {
-
- $is_item = false;
- if(is_array($item)) {
- $is_item = true;
- if((! array_key_exists('iconfig',$item)) || (! is_array($item['iconfig'])))
- $item['iconfig'] = array();
-
- if(array_key_exists('item_id',$item))
- $iid = $item['item_id'];
- else
- $iid = $item['id'];
- }
- elseif(intval($item))
- $iid = $item;
-
- if(! $iid)
- return false;
-
- if(is_array($item) && array_key_exists('iconfig',$item) && is_array($item['iconfig'])) {
- foreach($item['iconfig'] as $c) {
- if($c['iid'] == $iid && $c['cat'] == $family && $c['k'] == $key)
- return $c['v'];
- }
- }
-
- $r = q("select * from iconfig where iid = %d and cat = '%s' and k = '%s' limit 1",
- intval($iid),
- dbesc($family),
- dbesc($key)
- );
- if($r) {
- $r[0]['v'] = ((preg_match('|^a:[0-9]+:{.*}$|s',$r[0]['v'])) ? unserialize($r[0]['v']) : $r[0]['v']);
- if($is_item)
- $item['iconfig'][] = $r[0];
- return $r[0]['v'];
- }
- return false;
-
-}
-
-/**
- * set_iconfig(&$item, $family, $key, $value, $sharing = false);
- *
- * $item - item array or item id. If passed an array the iconfig meta information is
- * added to the item structure (which will need to be saved with item_store eventually).
- * If passed an id, the DB is updated, but may not be federated and/or cloned.
- * $family - namespace of meta variable
- * $key - key of meta variable
- * $value - value of meta variable
- * $sharing - boolean (default false); if true the meta information is propagated with the item
- * to other sites/channels, mostly useful when $item is an array and has not yet been stored/delivered.
- * If the meta information is added after delivery and you wish it to be shared, it may be necessary to
- * alter the item edited timestamp and invoke the delivery process on the updated item. The edited
- * timestamp needs to be altered in order to trigger an item_store_update() at the receiving end.
- */
-
-
-function set_iconfig(&$item, $family, $key, $value, $sharing = false) {
-
- $dbvalue = ((is_array($value)) ? serialize($value) : $value);
- $dbvalue = ((is_bool($dbvalue)) ? intval($dbvalue) : $dbvalue);
-
- $is_item = false;
- $idx = null;
-
- if(is_array($item)) {
- $is_item = true;
- if((! array_key_exists('iconfig',$item)) || (! is_array($item['iconfig'])))
- $item['iconfig'] = array();
- elseif($item['iconfig']) {
- for($x = 0; $x < count($item['iconfig']); $x ++) {
- if($item['iconfig'][$x]['cat'] == $family && $item['iconfig'][$x]['k'] == $key) {
- $idx = $x;
- }
- }
- }
- $entry = array('cat' => $family, 'k' => $key, 'v' => $value, 'sharing' => $sharing);
-
- if(is_null($idx))
- $item['iconfig'][] = $entry;
- else
- $item['iconfig'][$idx] = $entry;
- return $value;
- }
-
- if(intval($item))
- $iid = intval($item);
-
- if(! $iid)
- return false;
-
- if(get_iconfig($item, $family, $key) === false) {
- $r = q("insert into iconfig( iid, cat, k, v, sharing ) values ( %d, '%s', '%s', '%s', %d ) ",
- intval($iid),
- dbesc($family),
- dbesc($key),
- dbesc($dbvalue),
- intval($sharing)
- );
- }
- else {
- $r = q("update iconfig set v = '%s', sharing = %d where iid = %d and cat = '%s' and k = '%s' ",
- dbesc($dbvalue),
- intval($sharing),
- intval($iid),
- dbesc($family),
- dbesc($key)
- );
- }
-
- if(! $r)
- return false;
-
- return $value;
-}
-
-
-
-function del_iconfig(&$item, $family, $key) {
-
-
- $is_item = false;
- $idx = null;
-
- if(is_array($item)) {
- $is_item = true;
- if(is_array($item['iconfig'])) {
- for($x = 0; $x < count($item['iconfig']); $x ++) {
- if($item['iconfig'][$x]['cat'] == $family && $item['iconfig'][$x]['k'] == $key) {
- unset($item['iconfig'][$x]);
- }
- }
- }
- return true;
- }
-
- if(intval($item))
- $iid = intval($item);
-
- if(! $iid)
- return false;
-
- return q("delete from iconfig where iid = %d and cat = '%s' and k = '%s' ",
- intval($iid),
- dbesc($family),
- dbesc($key)
- );
-
-}
-
diff --git a/include/nav.php b/include/nav.php
index 541ab3aed..70faec598 100644
--- a/include/nav.php
+++ b/include/nav.php
@@ -143,16 +143,20 @@ EOT;
if((App::$module != 'home') && (! (local_channel())))
$nav['home'] = array($homelink, t('Home'), "", t('Home Page'),'home_nav_btn');
-
if((App::$config['system']['register_policy'] == REGISTER_OPEN) && (! local_channel()) && (! remote_channel()))
$nav['register'] = array('register',t('Register'), "", t('Create an account'),'register_nav_btn');
- $help_url = z_root() . '/help?f=&cmd=' . App::$cmd;
-
if(! get_config('system','hide_help')) {
- require_once('mod/help.php');
- $context_help = load_context_help();
- $nav['help'] = array($help_url, t('Help'), "", t('Help and documentation'),'help_nav_btn',$context_help);
+ $help_url = z_root() . '/help?f=&cmd=' . App::$cmd;
+ $context_help = '';
+ $enable_context_help = ((intval(get_config('system','enable_context_help')) === 1 || get_config('system','enable_context_help') === false) ? true : false);
+ if($enable_context_help === true) {
+ require_once('include/help.php');
+ $context_help = load_context_help();
+ //point directly to /help if $context_help is empty - this can be removed once we have context help for all modules
+ $enable_context_help = (($context_help) ? true : false);
+ }
+ $nav['help'] = array($help_url, t('Help'), "", t('Help and documentation'), 'help_nav_btn', $context_help, $enable_context_help);
}
if(! UNO)
@@ -160,7 +164,6 @@ EOT;
$nav['search'] = array('search', t('Search'), "", t('Search site @name, #tag, ?docs, content'));
-
$nav['directory'] = array('directory', t('Directory'), "", t('Channel Directory'),'directory_nav_btn');
@@ -237,7 +240,7 @@ $powered_by = '';
$tpl = get_markup_template('nav.tpl');
App::$page['nav'] .= replace_macros($tpl, array(
- '$baseurl' => z_root(),
+ '$baseurl' => z_root(),
'$sitelocation' => $sitelocation,
'$nav' => $x['nav'],
'$banner' => $banner,
diff --git a/include/network.php b/include/network.php
index ec255581d..395641b73 100644
--- a/include/network.php
+++ b/include/network.php
@@ -2114,8 +2114,9 @@ function check_channelallowed($hash) {
return $retvalue;
}
-function deliverable_singleton($xchan) {
- $r = q("select abook_instance from abook where abook_xchan = '%s' limit 1",
+function deliverable_singleton($channel_id,$xchan) {
+ $r = q("select abook_instance from abook where abook_channel = %d and abook_xchan = '%s' limit 1",
+ intval($channel_id),
dbesc($xchan['xchan_hash'])
);
if($r) {
diff --git a/include/notifier.php b/include/notifier.php
index 628847d54..f0c6d7275 100644
--- a/include/notifier.php
+++ b/include/notifier.php
@@ -118,7 +118,7 @@ function notifier_run($argv, $argc){
$normal_mode = true;
$packet_type = 'undefined';
- if($cmd === 'mail') {
+ if($cmd === 'mail' || $cmd === 'single_mail') {
$normal_mode = false;
$mail = true;
$private = true;
@@ -280,7 +280,7 @@ function notifier_run($argv, $argc){
logger('notifier: target item not forwardable: type ' . $target_item['item_type'], LOGGER_DEBUG);
return;
}
- if(intval($target_item['item_unpublished']) || intval($target_item['item_delayed'])) {
+ if(intval($target_item['item_unpublished']) || intval($target_item['item_delayed']) || intval($target_item['item_hidden'])) {
logger('notifier: target item not published, so not forwardable', LOGGER_DEBUG);
return;
}
@@ -450,11 +450,11 @@ function notifier_run($argv, $argc){
'target_item' => $target_item,
'top_level_post' => $top_level_post,
'private' => $private,
- 'followup' => $followup,
'relay_to_owner' => $relay_to_owner,
'uplink' => $uplink,
'cmd' => $cmd,
'mail' => $mail,
+ 'single' => (($cmd === 'single_mail' || $cmd === 'single_activity') ? true : false),
'location' => $location,
'request' => $request,
'normal_mode' => $normal_mode,
@@ -547,11 +547,11 @@ function notifier_run($argv, $argc){
'hub' => $hub,
'top_level_post' => $top_level_post,
'private' => $private,
- 'followup' => $followup,
'relay_to_owner' => $relay_to_owner,
'uplink' => $uplink,
'cmd' => $cmd,
'mail' => $mail,
+ 'single' => (($cmd === 'single_mail' || $cmd === 'single_activity') ? true : false),
'location' => $location,
'request' => $request,
'normal_mode' => $normal_mode,
@@ -570,6 +570,19 @@ function notifier_run($argv, $argc){
}
+ // singleton deliveries by definition 'not got zot'.
+ // Single deliveries are other federated networks (plugins) and we're essentially
+ // delivering only to those that have this site url in their abook_instance
+ // and only from within a sync operation. This means if you post from a clone,
+ // and a connection is connected to one of your other clones; assuming that hub
+ // is running it will receive a sync packet. On receipt of this sync packet it
+ // will invoke a delivery to those connections which are connected to just that
+ // hub instance.
+
+ if($cmd === 'single_mail' || $cmd === 'single_activity') {
+ continue;
+ }
+
// default: zot protocol
$hash = random_string();
diff --git a/include/photos.php b/include/photos.php
index 943d7d503..24e872890 100644
--- a/include/photos.php
+++ b/include/photos.php
@@ -706,3 +706,43 @@ function gps2Num($coordPart) {
return floatval($parts[0]) / floatval($parts[1]);
}
+
+function profile_photo_set_profile_perms($profileid = '') {
+
+ $allowcid = '';
+ if (x($profileid)) {
+
+ $r = q("SELECT photo, profile_guid, id, is_default, uid FROM profile WHERE profile.id = %d OR profile.profile_guid = '%s' LIMIT 1", intval($profileid), dbesc($profileid));
+
+ } else {
+
+ logger('Resetting permissions on default-profile-photo for user'.local_channel());
+ $r = q("SELECT photo, profile_guid, id, is_default, uid FROM profile WHERE profile.uid = %d AND is_default = 1 LIMIT 1", intval(local_channel()) ); //If no profile is given, we update the default profile
+ }
+
+ $profile = $r[0];
+ if(x($profile['id']) && x($profile['photo'])) {
+ preg_match("@\w*(?=-\d*$)@i", $profile['photo'], $resource_id);
+ $resource_id = $resource_id[0];
+
+ if (intval($profile['is_default']) != 1) {
+ $r0 = q("SELECT channel_hash FROM channel WHERE channel_id = %d LIMIT 1", intval(local_channel()) );
+ $r1 = q("SELECT abook.abook_xchan FROM abook WHERE abook_profile = '%d' ", intval($profile['id'])); //Should not be needed in future. Catches old int-profile-ids.
+ $r2 = q("SELECT abook.abook_xchan FROM abook WHERE abook_profile = '%s'", dbesc($profile['profile_guid']));
+ $allowcid = "<" . $r0[0]['channel_hash'] . ">";
+ foreach ($r1 as $entry) {
+ $allowcid .= "<" . $entry['abook_xchan'] . ">";
+ }
+ foreach ($r2 as $entry) {
+ $allowcid .= "<" . $entry['abook_xchan'] . ">";
+ }
+
+ q("UPDATE `photo` SET allow_cid = '%s' WHERE resource_id = '%s' AND uid = %d",dbesc($allowcid),dbesc($resource_id),intval($profile['uid']));
+
+ } else {
+ q("UPDATE `photo` SET allow_cid = '' WHERE profile = 1 AND uid = %d",intval($profile['uid'])); //Reset permissions on default profile picture to public
+ }
+ }
+
+ return;
+ }
diff --git a/include/plugin.php b/include/plugin.php
index 8dceb8fb1..8dd67bb0c 100755
--- a/include/plugin.php
+++ b/include/plugin.php
@@ -185,7 +185,7 @@ function register_hook($hook, $file, $function, $priority = 0) {
dbesc($file),
dbesc($function)
);
- if(count($r))
+ if($r)
return true;
$r = q("INSERT INTO `hook` (`hook`, `file`, `function`, `priority`) VALUES ( '%s', '%s', '%s', '%s' )",
@@ -226,9 +226,8 @@ function unregister_hook($hook, $file, $function) {
function load_hooks() {
- $a = get_app();
-// if(! is_array(App::$hooks))
- App::$hooks = array();
+
+ App::$hooks = array();
$r = q("SELECT * FROM hook WHERE true ORDER BY priority DESC");
if($r) {
@@ -236,10 +235,10 @@ function load_hooks() {
if(! array_key_exists($rr['hook'],App::$hooks))
App::$hooks[$rr['hook']] = array();
- App::$hooks[$rr['hook']][] = array($rr['file'],$rr['function']);
+ App::$hooks[$rr['hook']][] = array($rr['file'],$rr['function'],$rr['priority'],$rr['hook_version']);
}
}
-//logger('hooks: ' . print_r(App::$hooks,true));
+ //logger('hooks: ' . print_r(App::$hooks,true));
}
/**
@@ -259,15 +258,15 @@ function load_hooks() {
* @param string $fn
* function name of callback handler
*/
-function insert_hook($hook, $fn) {
- $a = get_app();
+function insert_hook($hook, $fn, $version = 0, $priority = 0) {
+
if(! is_array(App::$hooks))
App::$hooks = array();
if(! array_key_exists($hook, App::$hooks))
App::$hooks[$hook] = array();
- App::$hooks[$hook][] = array('', $fn);
+ App::$hooks[$hook][] = array('', $fn, $priority, $version);
}
/**
@@ -280,22 +279,34 @@ function insert_hook($hook, $fn) {
* @param string|array &$data to transmit to the callback handler
*/
function call_hooks($name, &$data = null) {
- $a = get_app();
-
+ $a = 0;
if((is_array(App::$hooks)) && (array_key_exists($name, App::$hooks))) {
foreach(App::$hooks[$name] as $hook) {
+ $origfn = $hook[1];
if($hook[0])
@include_once($hook[0]);
+ if(preg_match('|^a:[0-9]+:{.*}$|s', $hook[1])) {
+ $hook[1] = unserialize($hook[1]);
+ }
+ elseif(strpos($hook[1],'::')) {
+ // We shouldn't need to do this, but it appears that PHP
+ // isn't able to directly execute a string variable with a class
+ // method in the manner we are attempting it, so we'll
+ // turn it into an array.
+ $hook[1] = explode('::',$hook[1]);
+ }
- if(function_exists($hook[1])) {
+ if(is_callable($hook[1])) {
$func = $hook[1];
- $func($a, $data);
+ if($hook[3])
+ $func($data);
+ else
+ $func($a, $data);
} else {
-
q("DELETE FROM hook WHERE hook = '%s' AND file = '%s' AND function = '%s'",
dbesc($name),
dbesc($hook[0]),
- dbesc($hook[1])
+ dbesc($origfn)
);
}
}
@@ -535,8 +546,11 @@ function format_css_if_exists($source) {
else
$path = theme_include($source[0]);
- if($path)
- return '<link rel="stylesheet" href="' . script_path() . '/' . $path . '" type="text/css" media="' . $source[1] . '">' . "\r\n";
+ if($path) {
+ $path = script_path() . '/' . $path;
+ $qstring = ((parse_url($path, PHP_URL_QUERY)) ? '&' : '?') . 'v=' . STD_VERSION;
+ return '<link rel="stylesheet" href="' . $path . $qstring . '" type="text/css" media="' . $source[1] . '">' . "\r\n";
+ }
}
/*
@@ -612,8 +626,11 @@ function format_js_if_exists($source) {
$path = $source;
else
$path = theme_include($source);
- if($path)
- return '<script src="' . script_path() . '/' . $path . '" ></script>' . "\r\n" ;
+ if($path) {
+ $path = script_path() . '/' . $path;
+ $qstring = ((parse_url($path, PHP_URL_QUERY)) ? '&' : '?') . 'v=' . STD_VERSION;
+ return '<script src="' . $path . $qstring . '" ></script>' . "\r\n" ;
+ }
}
@@ -678,4 +695,4 @@ function folder_exists($folder)
// If it exist, check if it's a directory
return (($path !== false) && is_dir($path)) ? $path : false;
-} \ No newline at end of file
+}
diff --git a/include/text.php b/include/text.php
index 0a7f84b01..926e2eed6 100644
--- a/include/text.php
+++ b/include/text.php
@@ -1532,35 +1532,6 @@ function prepare_body(&$item,$attach = false) {
$s = sslify($s);
- // Look for spoiler
- $spoilersearch = '<blockquote class="spoiler">';
-
- // Remove line breaks before the spoiler
- while ((strpos($s, "\n".$spoilersearch) !== false))
- $s = str_replace("\n".$spoilersearch, $spoilersearch, $s);
- while ((strpos($s, "<br />".$spoilersearch) !== false))
- $s = str_replace("<br />".$spoilersearch, $spoilersearch, $s);
-
- while ((strpos($s, $spoilersearch) !== false)) {
-
- $pos = strpos($s, $spoilersearch);
- $rnd = random_string(8);
- $spoilerreplace = '<br /> <span id="spoiler-wrap-'.$rnd.'" style="white-space:nowrap;" class="fakelink" onclick="openClose(\'spoiler-'.$rnd.'\');">'.sprintf(t('Click to open/close')).'</span>'.
- '<blockquote class="spoiler" id="spoiler-'.$rnd.'" style="display: none;">';
- $s = substr($s, 0, $pos).$spoilerreplace.substr($s, $pos+strlen($spoilersearch));
- }
-
- // Look for quote with author
- $authorsearch = '<blockquote class="author">';
-
- while ((strpos($s, $authorsearch) !== false)) {
- $pos = strpos($s, $authorsearch);
- $rnd = random_string(8);
- $authorreplace = '<br /> <span id="author-wrap-'.$rnd.'" style="white-space:nowrap;" class="fakelink" onclick="openClose(\'author-'.$rnd.'\');">'.sprintf(t('Click to open/close')).'</span>'.
- '<blockquote class="author" id="author-'.$rnd.'" style="display: block;">';
- $s = substr($s, 0, $pos).$authorreplace.substr($s, $pos+strlen($authorsearch));
- }
-
$prep_arr = array(
'item' => $item,
'photo' => $photo,
diff --git a/include/zot.php b/include/zot.php
index 0cdf7fc87..1ca1b862b 100644
--- a/include/zot.php
+++ b/include/zot.php
@@ -3121,7 +3121,7 @@ function process_channel_sync_delivery($sender, $arr, $deliveries) {
import_conv($channel,$arr['conv']);
if(array_key_exists('mail',$arr) && $arr['mail'])
- import_mail($channel,$arr['mail']);
+ sync_mail($channel,$arr['mail']);
if(array_key_exists('event',$arr) && $arr['event'])
sync_events($channel,$arr['event']);
@@ -4048,6 +4048,17 @@ function delivery_report_is_storable($dr) {
if(($dr['location'] !== z_root()) && ($dr['sender'] === $rxchan) && ($dr['status'] === 'recipient_not_found'))
return false;
+ // If you have a private post with a recipient list, every single site is going to report
+ // back a failed delivery for anybody on that list that isn't local to them. We're only
+ // concerned about this if we have a local hubloc record which says we expected them to
+ // have a channel on that site.
+
+ $r = q("select hubloc_id from hubloc where hubloc_hash = '%s' and hubloc_url = '%s'",
+ dbesc($rxchan),
+ dbesc($dr['location'])
+ );
+ if((! $r) && ($dr['status'] === 'recipient_not_found'))
+ return false;
$r = q("select abook_id from abook where abook_xchan = '%s' and abook_channel = %d limit 1",
dbesc($rxchan),
diff --git a/install/schema_mysql.sql b/install/schema_mysql.sql
index 01cf97674..c36bfaa57 100644
--- a/install/schema_mysql.sql
+++ b/install/schema_mysql.sql
@@ -517,8 +517,10 @@ CREATE TABLE IF NOT EXISTS `hook` (
`file` char(255) NOT NULL DEFAULT '',
`function` char(255) NOT NULL DEFAULT '',
`priority` int(11) unsigned NOT NULL DEFAULT '0',
+ `hook_version` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
- KEY `hook` (`hook`)
+ KEY `hook` (`hook`),
+ KEY `hook_version` (`hook_version`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `hubloc` (
diff --git a/install/schema_postgres.sql b/install/schema_postgres.sql
index a7cd5875c..d4bb54b1e 100644
--- a/install/schema_postgres.sql
+++ b/install/schema_postgres.sql
@@ -512,10 +512,12 @@ CREATE TABLE "hook" (
"file" text NOT NULL,
"function" text NOT NULL,
"priority" bigint NOT NULL DEFAULT '0',
+ "hook_version" smallint NOT NULL DEFAULT '0',
PRIMARY KEY ("id")
);
create index "hook_idx" on hook ("hook");
+create index "hook_version_idx" on hook ("hook_version");
CREATE TABLE "hubloc" (
"hubloc_id" serial NOT NULL,
"hubloc_guid" text NOT NULL DEFAULT '',
diff --git a/install/update.php b/install/update.php
index bfd01494f..2dc4a6db3 100644
--- a/install/update.php
+++ b/install/update.php
@@ -1,6 +1,6 @@
<?php
-define( 'UPDATE_VERSION' , 1165 );
+define( 'UPDATE_VERSION' , 1166 );
/**
*
@@ -2058,3 +2058,16 @@ function update_r1164() {
return UPDATE_FAILED;
}
+function update_r1165() {
+
+ $r1 = q("alter table hook add hook_version int not null default '0' ");
+
+ if(ACTIVE_DBTYPE == DBTYPE_POSTGRES)
+ $r2 = q("create index \"hook_version_idx\" on hook (\"hook_version\") ");
+ else
+ $r2 = q("alter table hook add index ( hook_version ) ");
+ if($r1 && $r2)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
diff --git a/library/Smarty/NEW_FEATURES.txt b/library/Smarty/NEW_FEATURES.txt
index 595dc4d3c..1a51c71d9 100644
--- a/library/Smarty/NEW_FEATURES.txt
+++ b/library/Smarty/NEW_FEATURES.txt
@@ -21,17 +21,17 @@ Smarty 3.1.28
fetch() and display()
=====================
The fetch() and display() methods of the template object accept now optionally the same parameter
- as the corresponding Smarty methods to get tne content of another template.
+ as the corresponding Smarty methods to get the content of another template.
Example:
$template->display(); Does display template of template object
- $template->dispaly('foo.tpl'); Does display template 'foo.bar'
+ $template->display('foo.tpl'); Does display template 'foo.bar'
File: resource
==============
Multiple template_dir entries can now be selected by a comma separated list of indices.
The template_dir array is searched in the order of the indices. (Could be used to change the default search order)
Example:
- $smarty->display([1],[0]foo.bar');
+ $smarty->display('[1],[0]foo.bar');
Filter support
==============
@@ -130,4 +130,4 @@ Smarty 3.1.22
Smarty::DEBUG_INDIVIDUAL will create for each display() and fetch() call an individual debug window.
.
- \ No newline at end of file
+
diff --git a/library/Smarty/change_log.txt b/library/Smarty/change_log.txt
index cecda63d1..dadc5d17d 100644
--- a/library/Smarty/change_log.txt
+++ b/library/Smarty/change_log.txt
@@ -1,14 +1,50 @@
- ===== 3.1.28 ===== (13.12.2015)
+ ===== 3.1.29 ===== (21.12.2015)
+ 21.12.2015
+ - optimization improve speed of filetime checks on extends and extendsall resource
+
+ 20.12.2015
+ - bugfix failure when the default resource type was set to 'extendsall' https://github.com/smarty-php/smarty/issues/123
+ - update compilation of Smarty special variables
+ - bugfix add addition check for OS type on normalizaition of file path https://github.com/smarty-php/smarty/issues/134
+ - bugfix the source uid of the extendsall resource must contain $template_dir settings https://github.com/smarty-php/smarty/issues/123
+
+ 19.12.2015
+ - bugfix using $smarty.capture.foo in expressions could fail https://github.com/smarty-php/smarty/pull/138
+ - bugfix broken PHP 5.2 compatibility https://github.com/smarty-php/smarty/issues/139
+ - remove no longer used code
+ - improvement make sure that compiled and cache templates never can contain a trailing '?>?
+
+ 18.12.2015
+ - bugfix regression when modifier parameter was follow by math https://github.com/smarty-php/smarty/issues/132
+
+ 17.12.2015
+ - bugfix {$smarty.capture.nameFail} did lowercase capture name https://github.com/smarty-php/smarty/issues/135
+ - bugfix using {block append/prepend} on same block in multiple levels of inheritance templates could fail (forum topic 25827)
+ - bugfix text content consisting of just a single '0' like in {if true}0{/if} was suppressed (forum topic 25834)
+
+ 16.12.2015
+ - bugfix {foreach} did fail if from atrribute is a Generator class https://github.com/smarty-php/smarty/issues/128
+ - bugfix direct access $smarty->template_dir = 'foo'; should call Smarty::setTemplateDir() https://github.com/smarty-php/smarty/issues/121
+
+ 15.12.2015
+ - bugfix {$smarty.cookies.foo} did return the $_COOKIE array not the 'foo' value https://github.com/smarty-php/smarty/issues/122
+ - bugfix a call to clearAllCache() and other should clear all internal template object caches (forum topic 25828)
+
+ 14.12.2015
+ - bugfix {$smarty.config.foo} broken in 3.1.28 https://github.com/smarty-php/smarty/issues/120
+ - bugfix multiple calls of {section} with same name droped E_NOTICE error https://github.com/smarty-php/smarty/issues/118
+
+ ===== 3.1.28 ===== (13.12.2015)
13.12.2015
- bugfix {foreach} and {section} with uppercase characters in name attribute did not work (forum topic 25819)
- bugfix $smarty->debugging_ctrl = 'URL' did not work (forum topic 25811)
- bugfix Debug Console could display incorrect data when using subtemplates
09.12.2015
- - bugix Smarty did fail under PHP 7.0.0 with use_include_path = true;
+ - bugfix Smarty did fail under PHP 7.0.0 with use_include_path = true;
09.12.2015
- -bugfix {strip} should exclude some html tags from stripping, related to fix for https://github.com/smarty-php/smarty/issues/111
+ - bugfix {strip} should exclude some html tags from stripping, related to fix for https://github.com/smarty-php/smarty/issues/111
08.12.2015
- bugfix internal template function data got stored in wrong compiled file https://github.com/smarty-php/smarty/issues/114
diff --git a/library/Smarty/libs/Smarty.class.php b/library/Smarty/libs/Smarty.class.php
index 17457131c..a029f942e 100644
--- a/library/Smarty/libs/Smarty.class.php
+++ b/library/Smarty/libs/Smarty.class.php
@@ -27,7 +27,7 @@
* @author Uwe Tews
* @author Rodney Rehm
* @package Smarty
- * @version 3.1.28
+ * @version 3.1.29
*/
/**
@@ -118,7 +118,7 @@ class Smarty extends Smarty_Internal_TemplateBase
/**
* smarty version
*/
- const SMARTY_VERSION = '3.1.28';
+ const SMARTY_VERSION = '3.1.29';
/**
* define variable scopes
@@ -677,15 +677,20 @@ class Smarty extends Smarty_Internal_TemplateBase
/**
* removed properties
*
- * @var array
+ * @var string[]
*/
private static $obsoleteProperties = array('resource_caching', 'template_resource_caching',
'direct_access_security', '_dir_perms', '_file_perms',
'plugin_search_order', 'inheritance_merge_compiled_includes');
- private static $accessMap = array('template_dir' => 'getTemplateDir', 'config_dir' => 'getConfigDir',
- 'plugins_dir' => 'getPluginsDir', 'compile_dir' => 'getCompileDir',
- 'cache_dir' => 'getCacheDir',);
+ /**
+ * List of private properties which will call getter/setter ona direct access
+ *
+ * @var array
+ */
+ private static $accessMap = array('template_dir' => 'TemplateDir', 'config_dir' => 'ConfigDir',
+ 'plugins_dir' => 'PluginsDir', 'compile_dir' => 'CompileDir',
+ 'cache_dir' => 'CacheDir',);
/**#@-*/
@@ -1173,7 +1178,7 @@ class Smarty extends Smarty_Internal_TemplateBase
$path = str_replace($nds, DS, $path);
}
- if ($realpath === true && $path[0] !== '/' && $path[1] !== ':') {
+ if ($realpath === true && (($path[0] !== '/' && DS == '/') || ($path[1] !== ':' && DS != '/'))) {
$path = getcwd() . DS . $path;
}
while ((strpos($path, '.' . DS) !== false) || (strpos($path, DS . DS) !== false)) {
@@ -1344,7 +1349,8 @@ class Smarty extends Smarty_Internal_TemplateBase
{
if (isset(self::$accessMap[$name])) {
- return $this->{self::$accessMap[$name]}();
+ $method = 'get' . self::$accessMap[$name];
+ return $this->{$method}();
} elseif (in_array($name, self::$obsoleteProperties)) {
return null;
} else {
@@ -1363,7 +1369,8 @@ class Smarty extends Smarty_Internal_TemplateBase
public function __set($name, $value)
{
if (isset(self::$accessMap[$name])) {
- $this->{self::$accessMap[$name]}($value);
+ $method = 'set' . self::$accessMap[$name];
+ $this->{$method}($value);
} elseif (in_array($name, self::$obsoleteProperties)) {
return;
} else {
diff --git a/library/Smarty/libs/sysplugins/smarty_cacheresource.php b/library/Smarty/libs/sysplugins/smarty_cacheresource.php
index 8cd2805a5..14ab62fd9 100644
--- a/library/Smarty/libs/sysplugins/smarty_cacheresource.php
+++ b/library/Smarty/libs/sysplugins/smarty_cacheresource.php
@@ -215,12 +215,9 @@ abstract class Smarty_CacheResource
*/
public function invalidLoadedCache(Smarty $smarty)
{
- if (isset($smarty->_cache['template_objects'])) {
- foreach ($smarty->_cache['template_objects'] as $key => $tpl) {
- if (isset($tpl->cached)) {
- unset ($smarty->_cache['template_objects'][$key]);
- }
- }
+ $smarty->_cache['isCached'] = array();
+ if (isset($smarty->ext->_subtemplate)) {
+ $smarty->ext->_subtemplate->tplObjects = array();
}
}
}
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_compile_block.php b/library/Smarty/libs/sysplugins/smarty_internal_compile_block.php
index 52a541ebd..ab1fc6e00 100644
--- a/library/Smarty/libs/sysplugins/smarty_internal_compile_block.php
+++ b/library/Smarty/libs/sysplugins/smarty_internal_compile_block.php
@@ -142,7 +142,7 @@ class Smarty_Internal_Compile_Block extends Smarty_Internal_Compile_Shared_Inher
}
$compiler->suppressNocacheProcessing = true;
$compiler->has_code = true;
- $output = "<?php \n\$_smarty_tpl->ext->_inheritance->processBlock(\$_smarty_tpl, 3, {$compiler->_cache['blockName'][$compiler->_cache['blockNesting']]}, null, \$_blockParentStack);\n?>\n";
+ $output = "<?php \n\$_smarty_tpl->ext->_inheritance->processBlock(\$_smarty_tpl, 4, {$compiler->_cache['blockName'][$compiler->_cache['blockNesting']]}, null, \$_blockParentStack);\n?>\n";
return $output;
}
}
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_compile_capture.php b/library/Smarty/libs/sysplugins/smarty_internal_compile_capture.php
index 95c75a4b1..be45f3e94 100644
--- a/library/Smarty/libs/sysplugins/smarty_internal_compile_capture.php
+++ b/library/Smarty/libs/sysplugins/smarty_internal_compile_capture.php
@@ -69,13 +69,12 @@ class Smarty_Internal_Compile_Capture extends Smarty_Internal_CompileBase
*/
public static function compileSpecialVariable($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter)
{
- // make all lower case
- $parameter = array_map('strtolower', $parameter);
- $tag = trim($parameter[0], '"\'');
- if (!isset($parameter[1]) || false === $name = $compiler->getId($parameter[1])) {
+ $tag = strtolower(trim($parameter[ 0 ], '"\''));
+ $name = isset($parameter[ 1 ]) ? $compiler->getId($parameter[ 1 ]) : false;
+ if (!$name) {
$compiler->trigger_template_error("missing or illegal \$smarty.{$tag} name attribute", null, true);
}
- return "isset(\$_smarty_tpl->_cache['__smarty_capture']['{$name}']) ? \$_smarty_tpl->_cache['__smarty_capture']['{$name}'] : null";
+ return "(isset(\$_smarty_tpl->_cache['__smarty_capture']['{$name}']) ? \$_smarty_tpl->_cache['__smarty_capture']['{$name}'] : null)";
}
}
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_compile_foreach.php b/library/Smarty/libs/sysplugins/smarty_internal_compile_foreach.php
index 876ed026a..178a0a52c 100644
--- a/library/Smarty/libs/sysplugins/smarty_internal_compile_foreach.php
+++ b/library/Smarty/libs/sysplugins/smarty_internal_compile_foreach.php
@@ -59,7 +59,7 @@ class Smarty_Internal_Compile_Foreach extends Smarty_Internal_Compile_Private_Fo
*
* @var array
*/
- public static $nameProperties = array('first', 'last', 'index', 'iteration', 'show', 'total');
+ public $nameProperties = array('first', 'last', 'index', 'iteration', 'show', 'total');
/**
* Valid properties of $item@xxx variable
@@ -183,8 +183,10 @@ class Smarty_Internal_Compile_Foreach extends Smarty_Internal_Compile_Private_Fo
foreach ($saveVars as $k => $code) {
$output .= "{$local}{$k} = {$code}\n";
}
+ if (isset($itemAttr['show']) || isset($itemAttr['total']) || isset($namedAttr['total']) || isset($namedAttr['show']) || isset($itemAttr['last']) || isset($namedAttr['last'])) {
+ $output .= "{$local}total = \$_smarty_tpl->smarty->ext->_foreach->count(\$_from);\n";
+ }
$output .= "{$itemVar} = new Smarty_Variable();\n";
- $output .= "{$local}total = \$_smarty_tpl->smarty->ext->_foreach->count(\$_from);\n";
if (isset($itemAttr['show'])) {
$output .= "{$itemVar}->show = ({$local}total > 0);\n";
}
@@ -210,7 +212,6 @@ class Smarty_Internal_Compile_Foreach extends Smarty_Internal_Compile_Private_Fo
$output .= "{$foreachVar} = new Smarty_Variable({$_vars});\n";
}
}
- $output .= "if ({$local}total) {\n";
if (isset($attributes['key'])) {
$output .= "\$_smarty_tpl->tpl_vars['{$key}'] = new Smarty_Variable();\n";
}
@@ -226,7 +227,9 @@ class Smarty_Internal_Compile_Foreach extends Smarty_Internal_Compile_Private_Fo
if ($needIteration) {
$output .= "{$local}iteration=0;\n";
}
+ $output .= "{$itemVar}->_loop = false;\n";
$output .= "foreach (\$_from as {$keyTerm}{$itemVar}->value) {\n";
+ $output .= "{$itemVar}->_loop = true;\n";
if (isset($attributes['key']) && isset($itemAttr['key'])) {
$output .= "\$_smarty_tpl->tpl_vars['{$key}']->value = {$itemVar}->key;\n";
}
@@ -296,7 +299,7 @@ class Smarty_Internal_Compile_Foreachelse extends Smarty_Internal_CompileBase
$output = "<?php\n";
$output .= "{$itemVar} = {$local}saved_local_item;\n";
$output .= "}\n";
- $output .= "} else {\n?>";
+ $output .= "if (!{$itemVar}->_loop) {\n?>";
return $output;
}
}
@@ -332,7 +335,6 @@ class Smarty_Internal_Compile_Foreachclose extends Smarty_Internal_CompileBase
if ($restore) {
$output .= "{$itemVar} = {$local}saved_local_item;\n";
- $output .= "}\n";
}
$output .= "}\n";
foreach ($restoreVars as $restore) {
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_compile_private_foreachsection.php b/library/Smarty/libs/sysplugins/smarty_internal_compile_private_foreachsection.php
index 50c25bdb6..16f233359 100644
--- a/library/Smarty/libs/sysplugins/smarty_internal_compile_private_foreachsection.php
+++ b/library/Smarty/libs/sysplugins/smarty_internal_compile_private_foreachsection.php
@@ -50,7 +50,7 @@ class Smarty_Internal_Compile_Private_ForeachSection extends Smarty_Internal_Com
*
* @var array
*/
- public static $nameProperties = array();
+ public $nameProperties = array();
/**
* {section} tag has no item properties
@@ -112,8 +112,7 @@ class Smarty_Internal_Compile_Private_ForeachSection extends Smarty_Internal_Com
if ($named) {
$this->resultOffsets['named'] = $this->startOffset + 3;
$this->propertyPreg .= "([\$]smarty[.]{$this->tagName}[.]{$attributes['name']}[.](";
- $className = get_class($this);
- $properties = $className::$nameProperties;
+ $properties = $this->nameProperties;
} else {
$this->resultOffsets['item'] = $this->startOffset + 3;
$this->propertyPreg .= "([\$]{$attributes['item']}[@](";
@@ -204,17 +203,15 @@ class Smarty_Internal_Compile_Private_ForeachSection extends Smarty_Internal_Com
* @return string compiled code
* @throws \SmartyCompilerException
*/
- public static function compileSpecialVariable($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter)
+ public function compileSpecialVariable($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter)
{
$tag = strtolower(trim($parameter[ 0 ], '"\''));
$name = isset($parameter[ 1 ]) ? $compiler->getId($parameter[ 1 ]) : false;
if (!$name) {
$compiler->trigger_template_error("missing or illegal \$smarty.{$tag} name attribute", null, true);
}
- /* @var Smarty_Internal_Compile_Foreach|Smarty_Internal_Compile_Section $className */
- $className = 'Smarty_Internal_Compile_' . ucfirst($tag);
$property = isset($parameter[ 2 ]) ? strtolower($compiler->getId($parameter[ 2 ])) : false;
- if (!$property || !in_array($property, $className::$nameProperties)) {
+ if (!$property || !in_array($property, $this->nameProperties)) {
$compiler->trigger_template_error("missing or illegal \$smarty.{$tag} property attribute", null, true);
}
$tagVar = "'__smarty_{$tag}_{$name}'";
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_compile_private_special_variable.php b/library/Smarty/libs/sysplugins/smarty_internal_compile_private_special_variable.php
index 5a8c54faa..b83e824af 100644
--- a/library/Smarty/libs/sysplugins/smarty_internal_compile_private_special_variable.php
+++ b/library/Smarty/libs/sysplugins/smarty_internal_compile_private_special_variable.php
@@ -29,7 +29,7 @@ class Smarty_Internal_Compile_Private_Special_Variable extends Smarty_Internal_C
public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter)
{
$_index = preg_split("/\]\[/", substr($parameter, 1, strlen($parameter) - 2));
- $variable = strtolower($compiler->getId($_index[0]));
+ $variable = strtolower($compiler->getId($_index[ 0 ]));
if ($variable === false) {
$compiler->trigger_template_error("special \$Smarty variable name index can not be variable", null, true);
}
@@ -39,7 +39,11 @@ class Smarty_Internal_Compile_Private_Special_Variable extends Smarty_Internal_C
switch ($variable) {
case 'foreach':
case 'section':
- return Smarty_Internal_Compile_Private_ForeachSection::compileSpecialVariable(array(), $compiler, $_index);
+ if (!isset($compiler->_tag_objects[ $variable ])) {
+ $class = 'Smarty_Internal_Compile_' . ucfirst($variable);
+ $compiler->_tag_objects[ $variable ] = new $class;
+ }
+ return $compiler->_tag_objects[ $variable ]->compileSpecialVariable(array(), $compiler, $_index);
case 'capture':
if (class_exists('Smarty_Internal_Compile_Capture')) {
return Smarty_Internal_Compile_Capture::compileSpecialVariable(array(), $compiler, $_index);
@@ -54,7 +58,8 @@ class Smarty_Internal_Compile_Private_Special_Variable extends Smarty_Internal_C
$compiler->trigger_template_error("(secure mode) super globals not permitted");
break;
}
- return '$_COOKIE';
+ $compiled_ref = '$_COOKIE';
+ break;
case 'get':
case 'post':
case 'env':
@@ -80,9 +85,7 @@ class Smarty_Internal_Compile_Private_Special_Variable extends Smarty_Internal_C
return 'dirname($_smarty_tpl->source->filepath)';
case 'version':
- $_version = Smarty::SMARTY_VERSION;
-
- return "'$_version'";
+ return "Smarty::SMARTY_VERSION";
case 'const':
if (isset($compiler->smarty->security_policy) &&
@@ -91,33 +94,27 @@ class Smarty_Internal_Compile_Private_Special_Variable extends Smarty_Internal_C
$compiler->trigger_template_error("(secure mode) constants not permitted");
break;
}
- if (strpos($_index[1], '$') === false && strpos($_index[1], '\'') === false) {
+ if (strpos($_index[ 1 ], '$') === false && strpos($_index[ 1 ], '\'') === false) {
return "@constant('{$_index[1]}')";
} else {
return "@constant({$_index[1]})";
}
case 'config':
- if (isset($_index[2])) {
- return "(is_array(\$tmp = \$_smarty_tpl->smarty->ext->_config->_getConfigVariable(\$_smarty_tpl, $_index[1])) ? \$tmp[$_index[2]] : null)";
+ if (isset($_index[ 2 ])) {
+ return "(is_array(\$tmp = \$_smarty_tpl->smarty->ext->configload->_getConfigVariable(\$_smarty_tpl, $_index[1])) ? \$tmp[$_index[2]] : null)";
} else {
- return "\$_smarty_tpl->smarty->ext->_config->_getConfigVariable(\$_smarty_tpl, $_index[1])";
+ return "\$_smarty_tpl->smarty->ext->configload->_getConfigVariable(\$_smarty_tpl, $_index[1])";
}
case 'ldelim':
- $_ldelim = $compiler->smarty->left_delimiter;
-
- return "'$_ldelim'";
-
+ return "\$_smarty_tpl->smarty->left_delimiter";
case 'rdelim':
- $_rdelim = $compiler->smarty->right_delimiter;
-
- return "'$_rdelim'";
-
+ return "\$_smarty_tpl->smarty->right_delimiter";
default:
- $compiler->trigger_template_error('$smarty.' . trim($_index[0], "'") . ' is invalid');
+ $compiler->trigger_template_error('$smarty.' . trim($_index[ 0 ], "'") . ' is not defined');
break;
}
- if (isset($_index[1])) {
+ if (isset($_index[ 1 ])) {
array_shift($_index);
foreach ($_index as $_ind) {
$compiled_ref = $compiled_ref . "[$_ind]";
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_compile_section.php b/library/Smarty/libs/sysplugins/smarty_internal_compile_section.php
index 079903c2b..40b297a64 100644
--- a/library/Smarty/libs/sysplugins/smarty_internal_compile_section.php
+++ b/library/Smarty/libs/sysplugins/smarty_internal_compile_section.php
@@ -59,7 +59,7 @@ class Smarty_Internal_Compile_Section extends Smarty_Internal_Compile_Private_Fo
*
* @var array
*/
- public static $nameProperties = array('first', 'last', 'index', 'iteration', 'show', 'total', 'rownum',
+ public $nameProperties = array('first', 'last', 'index', 'iteration', 'show', 'total', 'rownum',
'index_prev', 'index_next');
/**
@@ -103,7 +103,7 @@ class Smarty_Internal_Compile_Section extends Smarty_Internal_Compile_Private_Fo
// maybe nocache because of nocache variables
$compiler->nocache = $compiler->nocache | $compiler->tag_nocache;
- $initLocal = array('saved' => "isset(\$_smarty_tpl->tpl_vars['__smarty_section_{$attributes['name']}']) ? \$_smarty_tpl->tpl_vars['__section_{$attributes['name']}'] : false",);
+ $initLocal = array('saved' => "isset(\$_smarty_tpl->tpl_vars['__smarty_section_{$attributes['name']}']) ? \$_smarty_tpl->tpl_vars['__smarty_section_{$attributes['name']}'] : false",);
$initNamedProperty = array();
$initFor = array();
$incFor = array();
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_data.php b/library/Smarty/libs/sysplugins/smarty_internal_data.php
index 53f351b41..bba95d303 100644
--- a/library/Smarty/libs/sysplugins/smarty_internal_data.php
+++ b/library/Smarty/libs/sysplugins/smarty_internal_data.php
@@ -188,6 +188,21 @@ class Smarty_Internal_Data
}
/**
+ * gets the object of a Smarty variable
+ *
+ * @param string $variable the name of the Smarty variable
+ * @param Smarty_Internal_Data $_ptr optional pointer to data object
+ * @param boolean $searchParents search also in parent data
+ * @param bool $error_enable
+ *
+ * @return Smarty_Variable|Smarty_Undefined_Variable the object of the variable
+ * @deprecated since 3.1.28 please use Smarty_Internal_Data::getTemplateVars() instead.
+ */
+ public function getVariable($variable = null, Smarty_Internal_Data $_ptr = null, $searchParents = true, $error_enable = true){
+ return $this->ext->getTemplateVars->_getVariable($this, $variable, $_ptr, $searchParents, $error_enable);
+ }
+
+ /**
* Follow the parent chain an merge template and config variables
*
* @param \Smarty_Internal_Data|null $data
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_extension_clear.php b/library/Smarty/libs/sysplugins/smarty_internal_extension_clear.php
index c595214d8..00edc5abf 100644
--- a/library/Smarty/libs/sysplugins/smarty_internal_extension_clear.php
+++ b/library/Smarty/libs/sysplugins/smarty_internal_extension_clear.php
@@ -114,14 +114,6 @@ class Smarty_Internal_Extension_Clear
}
}
}
- // remove from template cache
- if (isset($smarty->_cache['template_objects'])) {
- foreach ($smarty->_cache['template_objects'] as $key => $tpl) {
- if (isset($tpl->cached) && $tpl->cached->filepath == (string) $_file) {
- unset($smarty->_cache['template_objects'][$key]);
- }
- }
- }
$_count += @unlink((string) $_file) ? 1 : 0;
if (function_exists('opcache_invalidate')) {
opcache_invalidate((string) $_file);
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_method_clearallcache.php b/library/Smarty/libs/sysplugins/smarty_internal_method_clearallcache.php
index 1fe37892e..6ae0af15f 100644
--- a/library/Smarty/libs/sysplugins/smarty_internal_method_clearallcache.php
+++ b/library/Smarty/libs/sysplugins/smarty_internal_method_clearallcache.php
@@ -34,10 +34,7 @@ class Smarty_Internal_Method_ClearAllCache
{
// load cache resource and call clearAll
$_cache_resource = Smarty_CacheResource::load($smarty, $type);
- if ($smarty->caching_type != 'file') {
- $_cache_resource->invalidLoadedCache($smarty);
- }
-
+ $_cache_resource->invalidLoadedCache($smarty);
return $_cache_resource->clearAll($smarty, $exp_time);
}
} \ No newline at end of file
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_method_clearcache.php b/library/Smarty/libs/sysplugins/smarty_internal_method_clearcache.php
index a923b3ae1..063c57cde 100644
--- a/library/Smarty/libs/sysplugins/smarty_internal_method_clearcache.php
+++ b/library/Smarty/libs/sysplugins/smarty_internal_method_clearcache.php
@@ -37,10 +37,7 @@ class Smarty_Internal_Method_ClearCache
{
// load cache resource and call clear
$_cache_resource = Smarty_CacheResource::load($smarty, $type);
- if ($smarty->caching_type != 'file' && !isset($template_name)) {
- $_cache_resource->invalidLoadedCache($smarty);
- }
-
+ $_cache_resource->invalidLoadedCache($smarty);
return $_cache_resource->clear($smarty, $template_name, $cache_id, $compile_id, $exp_time);
}
} \ No newline at end of file
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_method_clearcompiledtemplate.php b/library/Smarty/libs/sysplugins/smarty_internal_method_clearcompiledtemplate.php
index ae1003238..cce8553f5 100644
--- a/library/Smarty/libs/sysplugins/smarty_internal_method_clearcompiledtemplate.php
+++ b/library/Smarty/libs/sysplugins/smarty_internal_method_clearcompiledtemplate.php
@@ -107,13 +107,6 @@ class Smarty_Internal_Method_ClearCompiledTemplate
}
if ($unlink && @unlink($_filepath)) {
- if (isset($smarty->_cache['template_objects'])) {
- foreach ($smarty->_cache['template_objects'] as $key => $tpl) {
- if (isset($tpl->compiled) && $tpl->compiled->filepath == $_filepath) {
- unset($smarty->_cache['template_objects'][$key]);
- }
- }
- }
$_count ++;
if (function_exists('opcache_invalidate')) {
opcache_invalidate($_filepath);
@@ -121,11 +114,10 @@ class Smarty_Internal_Method_ClearCompiledTemplate
}
}
}
- // clear compiled cache
- if (!isset($resource_name) && isset($smarty->_cache['source_objects'])) {
- foreach ($smarty->_cache['source_objects'] as $source) {
- $source->compileds = array();
- }
+ // clear template objects cache
+ $smarty->_cache['isCached'] = array();
+ if (isset($smarty->ext->_subtemplate)) {
+ $smarty->ext->_subtemplate->tplObjects = array();
}
return $_count;
}
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_method_configload.php b/library/Smarty/libs/sysplugins/smarty_internal_method_configload.php
index ec023ec8f..7b99e35c6 100644
--- a/library/Smarty/libs/sysplugins/smarty_internal_method_configload.php
+++ b/library/Smarty/libs/sysplugins/smarty_internal_method_configload.php
@@ -162,7 +162,7 @@ class Smarty_Internal_Method_ConfigLoad
*
* @return mixed the value of the config variable
*/
- public function _getConfigVariable(\Smarty_Internal_Template $tpl, $varName, $errorEnable = true)
+ public function _getConfigVariable(Smarty_Internal_Template $tpl, $varName, $errorEnable = true)
{
$_ptr = $tpl;
while ($_ptr !== null) {
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_resource_extends.php b/library/Smarty/libs/sysplugins/smarty_internal_resource_extends.php
index 0c0802d62..3d687dca8 100644
--- a/library/Smarty/libs/sysplugins/smarty_internal_resource_extends.php
+++ b/library/Smarty/libs/sysplugins/smarty_internal_resource_extends.php
@@ -44,7 +44,7 @@ class Smarty_Internal_Resource_Extends extends Smarty_Resource
if ($_s->type == 'php') {
throw new SmartyException("Resource type {$_s->type} cannot be used with the extends resource type");
}
- $sources[$_s->uid] = $_s;
+ $sources[ $_s->uid ] = $_s;
$uid .= $_s->filepath;
if ($_template) {
$exists = $exists && $_s->exists;
@@ -110,4 +110,15 @@ class Smarty_Internal_Resource_Extends extends Smarty_Resource
{
return str_replace(':', '.', basename($source->filepath));
}
+
+ /*
+ * Disable timestamp checks for extends resource.
+ * The individual source components will be checked.
+ *
+ * @return bool
+ */
+ public function checkTimestamps()
+ {
+ return false;
+ }
}
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_runtime_codeframe.php b/library/Smarty/libs/sysplugins/smarty_internal_runtime_codeframe.php
index 21e6e5221..ce6749770 100644
--- a/library/Smarty/libs/sysplugins/smarty_internal_runtime_codeframe.php
+++ b/library/Smarty/libs/sysplugins/smarty_internal_runtime_codeframe.php
@@ -89,6 +89,6 @@ class Smarty_Internal_Runtime_CodeFrame
$output .= $functions;
$output .= "<?php }\n";
// remove unneeded PHP tags
- return preg_replace('/\s*\?>[\n]?<\?php\s*/', "\n", $output);
+ return preg_replace(array('/\s*\?>[\n]?<\?php\s*/', '/\?>\s*$/'), array("\n", ''), $output);
}
} \ No newline at end of file
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_runtime_foreach.php b/library/Smarty/libs/sysplugins/smarty_internal_runtime_foreach.php
index 87bb0cf4a..689636adb 100644
--- a/library/Smarty/libs/sysplugins/smarty_internal_runtime_foreach.php
+++ b/library/Smarty/libs/sysplugins/smarty_internal_runtime_foreach.php
@@ -27,6 +27,9 @@ class Smarty_Internal_Runtime_Foreach
// thus rewind() and valid() methods may not be present
return iterator_count($value->getIterator());
} elseif ($value instanceof Iterator) {
+ if ($value instanceof Generator) {
+ return 1;
+ }
return iterator_count($value);
} elseif ($value instanceof PDOStatement) {
return $value->rowCount();
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_runtime_inheritance.php b/library/Smarty/libs/sysplugins/smarty_internal_runtime_inheritance.php
index ed21281d0..08a560606 100644
--- a/library/Smarty/libs/sysplugins/smarty_internal_runtime_inheritance.php
+++ b/library/Smarty/libs/sysplugins/smarty_internal_runtime_inheritance.php
@@ -127,8 +127,11 @@ class Smarty_Internal_Runtime_Inheritance
* - search in inheritance template hierarchy for child blocks
* if found call it, otherwise ignore
*
- * $type 3 = {$smarty.block.parent}:
- * - get block id from parent stack and call parent block
+ * $type 3 = {block append} {block prepend}:
+ * - call parent block
+ *
+ * $type 4 = {$smarty.block.parent}:
+ * - call parent block
*
* @param \Smarty_Internal_Template $tpl template object of caller
* @param int $type call type see above
@@ -140,17 +143,23 @@ class Smarty_Internal_Runtime_Inheritance
*/
public function processBlock(Smarty_Internal_Template $tpl, $type = 0, $name, $block, $callStack = array())
{
- if (!isset($this->blockParameter[$name])) {
- $this->blockParameter[$name] = array();
+ if (!isset($this->blockParameter[ $name ])) {
+ $this->blockParameter[ $name ] = array();
}
if ($this->state == 1) {
- $block[2] = count($this->blockParameter[$name]);
- $block[3] = $this->tplIndex;
- $this->blockParameter[$name][] = $block;
+ $block[ 2 ] = count($this->blockParameter[ $name ]);
+ $block[ 3 ] = $this->tplIndex;
+ $this->blockParameter[ $name ][] = $block;
return;
}
if ($type == 3) {
if (!empty($callStack)) {
+ $block = array_shift($callStack);
+ } else {
+ return;
+ }
+ } elseif ($type == 4) {
+ if (!empty($callStack)) {
array_shift($callStack);
if (empty($callStack)) {
throw new SmartyException("inheritance: tag {\$smarty.block.parent} used in parent template block '{$name}'");
@@ -160,23 +169,23 @@ class Smarty_Internal_Runtime_Inheritance
return;
}
} else {
- $blockParameter = &$this->blockParameter[$name];
+ $index = 0;
+ $blockParameter = &$this->blockParameter[ $name ];
if ($type == 0) {
- $index = $block[2] = count($blockParameter);
- $block[3] = $this->tplIndex;
+ $index = $block[ 2 ] = count($blockParameter);
+ $block[ 3 ] = $this->tplIndex;
$callStack = array(&$block);
} elseif ($type == 1) {
- $block[3] = $callStack[0][3];
- $index = 0;
+ $block[ 3 ] = $callStack[ 0 ][ 3 ];
for ($i = 0; $i < count($blockParameter); $i ++) {
- if ($blockParameter[$i][3] <= $block[3]) {
- $index = $blockParameter[$i][2];
+ if ($blockParameter[ $i ][ 3 ] <= $block[ 3 ]) {
+ $index = $blockParameter[ $i ][ 2 ];
}
}
- $block[2] = $index;
+ $block[ 2 ] = $index;
$callStack = array(&$block);
- } else {
- $index = $callStack[0][2];
+ } elseif ($type == 2) {
+ $index = $callStack[ 0 ][ 2 ];
if ($index == 0) {
return;
}
@@ -184,29 +193,40 @@ class Smarty_Internal_Runtime_Inheritance
}
$index --;
// find lowest level child block
- while ($index >= 0 && ($type || !$block[1])) {
- $block = &$blockParameter[$index];
+ while ($index >= 0 && ($type || !$block[ 1 ])) {
+ $block = &$blockParameter[ $index ];
array_unshift($callStack, $block);
- if ($block[1]) {
+ if ($block[ 1 ]) {
break;
}
$index --;
}
- if (isset($block['hide']) && $index <= 0) {
+ if (isset($block[ 'hide' ]) && $index <= 0) {
return;
}
}
$this->blockNesting ++;
- if (isset($block['append'])) {
- $this->processBlock($tpl, 3, $name, null, $callStack);
+ // {block append} ?
+ if (isset($block[ 'append' ])) {
+ $appendStack = $callStack;
+ if ($type == 0) {
+ array_shift($appendStack);
+ }
+ $this->processBlock($tpl, 3, $name, null, $appendStack);
}
+ // call block of current stack level
if (isset($block[6])) {
$block[6]($tpl, $callStack);
} else {
$block[0]($tpl, $callStack);
}
- if (isset($block['prepend'])) {
- $this->processBlock($tpl, 3, $name, null, $callStack);
+ // {block prepend} ?
+ if (isset($block[ 'prepend' ])) {
+ $prependStack = $callStack;
+ if ($type == 0) {
+ array_shift($prependStack);
+ }
+ $this->processBlock($tpl, 3, $name, null, $prependStack);
}
$this->blockNesting --;
}
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_runtime_tplfunction.php b/library/Smarty/libs/sysplugins/smarty_internal_runtime_tplfunction.php
index cc529c633..634ed5dc6 100644
--- a/library/Smarty/libs/sysplugins/smarty_internal_runtime_tplfunction.php
+++ b/library/Smarty/libs/sysplugins/smarty_internal_runtime_tplfunction.php
@@ -20,7 +20,7 @@ class Smarty_Internal_Runtime_TplFunction
*
* @throws \SmartyException
*/
- public function callTemplateFunction(\Smarty_Internal_Template $tpl, $name, $params, $nocache)
+ public function callTemplateFunction(Smarty_Internal_Template $tpl, $name, $params, $nocache)
{
if (isset($tpl->tpl_function[$name])) {
if (!$tpl->caching || ($tpl->caching && $nocache)) {
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_runtime_updatecache.php b/library/Smarty/libs/sysplugins/smarty_internal_runtime_updatecache.php
index 73de954f3..a895a3070 100644
--- a/library/Smarty/libs/sysplugins/smarty_internal_runtime_updatecache.php
+++ b/library/Smarty/libs/sysplugins/smarty_internal_runtime_updatecache.php
@@ -73,7 +73,7 @@ class Smarty_Internal_Runtime_UpdateCache
/**
* Cache was invalid , so render from compiled and write to cache
- *
+ *
* @param \Smarty_Template_Cached $cached
* @param \Smarty_Internal_Template $_template
* @param $no_output_filter
@@ -129,20 +129,6 @@ class Smarty_Internal_Runtime_UpdateCache
return false;
}
$content = $_template->smarty->ext->_codeFrame->create($_template, $content, '', true);
- if (!empty($_template->cached->tpl_function)) {
- foreach ($_template->cached->tpl_function as $funcParam) {
- if (is_file($funcParam['compiled_filepath'])) {
- // read compiled file
- $code = file_get_contents($funcParam['compiled_filepath']);
- // grab template function
- if (preg_match("/\/\* {$funcParam['call_name']} \*\/([\S\s]*?)\/\*\/ {$funcParam['call_name']} \*\//",
- $code, $match)) {
- unset($code);
- $content .= "<?php " . $match[0] . "?>\n";
- }
- }
- }
- }
return $this->write($cached, $_template, $content);
}
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_runtime_updatescope.php b/library/Smarty/libs/sysplugins/smarty_internal_runtime_updatescope.php
index 3d80c859a..5a125a4a7 100644
--- a/library/Smarty/libs/sysplugins/smarty_internal_runtime_updatescope.php
+++ b/library/Smarty/libs/sysplugins/smarty_internal_runtime_updatescope.php
@@ -17,7 +17,7 @@ class Smarty_Internal_Runtime_UpdateScope
* @param string $varName variable name
* @param int $scope scope to which bubble up variable value
*/
- public function updateScope(\Smarty_Internal_Template $tpl, $varName, $scope = Smarty::SCOPE_LOCAL)
+ public function updateScope(Smarty_Internal_Template $tpl, $varName, $scope = Smarty::SCOPE_LOCAL)
{
if (!$scope && !$tpl->scope) {
return;
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_runtime_validatecompiled.php b/library/Smarty/libs/sysplugins/smarty_internal_runtime_validatecompiled.php
index 6624eb0bf..7defd6c92 100644
--- a/library/Smarty/libs/sysplugins/smarty_internal_runtime_validatecompiled.php
+++ b/library/Smarty/libs/sysplugins/smarty_internal_runtime_validatecompiled.php
@@ -43,8 +43,13 @@ class Smarty_Internal_Runtime_ValidateCompiled
} elseif ($_file_to_check[2] == 'string') {
continue;
} else {
- $source = Smarty_Template_Source::load(null, $tpl->smarty, $_file_to_check[0]);
- $mtime = $source->getTimeStamp();
+ $handler = Smarty_Resource::load($tpl->smarty, $_file_to_check[2]);
+ if ($handler->checkTimestamps()) {
+ $source = Smarty_Template_Source::load($tpl, $tpl->smarty, $_file_to_check[ 0 ]);
+ $mtime = $source->getTimeStamp();
+ } else {
+ continue;
+ }
}
if (!$mtime || $mtime > $_file_to_check[1]) {
$is_valid = false;
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_runtime_var.php b/library/Smarty/libs/sysplugins/smarty_internal_runtime_var.php
index fe4f94d91..8e09108fe 100644
--- a/library/Smarty/libs/sysplugins/smarty_internal_runtime_var.php
+++ b/library/Smarty/libs/sysplugins/smarty_internal_runtime_var.php
@@ -17,7 +17,7 @@ class Smarty_Internal_Runtime_Var
* @param string $varName template variable name
* @param bool $nocache cache mode of variable
*/
- public function createLocalArrayVariable(\Smarty_Internal_Template $tpl, $varName, $nocache = false)
+ public function createLocalArrayVariable(Smarty_Internal_Template $tpl, $varName, $nocache = false)
{
if (!isset($tpl->tpl_vars[$varName])) {
$tpl->tpl_vars[$varName] = new Smarty_Variable(array(), $nocache);
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_templatecompilerbase.php b/library/Smarty/libs/sysplugins/smarty_internal_templatecompilerbase.php
index 04584a40f..6c3ea5f5d 100644
--- a/library/Smarty/libs/sysplugins/smarty_internal_templatecompilerbase.php
+++ b/library/Smarty/libs/sysplugins/smarty_internal_templatecompilerbase.php
@@ -328,7 +328,8 @@ abstract class Smarty_Internal_TemplateCompilerBase
$this->compileTemplateSource($template, $nocache,
$parent_compiler),
$this->postFilter($this->blockOrFunctionCode) .
- join('', $this->mergedSubTemplatesCode), false, $this);
+ join('', $this->mergedSubTemplatesCode), false,
+ $this);
return $_compiled_code;
}
@@ -374,7 +375,7 @@ abstract class Smarty_Internal_TemplateCompilerBase
$this->has_variable_string = false;
$this->prefix_code = array();
// add file dependency
- $this->parent_compiler->template->compiled->file_dependency[$this->template->source->uid] =
+ $this->parent_compiler->template->compiled->file_dependency[ $this->template->source->uid ] =
array($this->template->source->filepath, $this->template->source->getTimeStamp(),
$this->template->source->type);
$this->smarty->_current_file = $this->template->source->filepath;
@@ -423,7 +424,7 @@ abstract class Smarty_Internal_TemplateCompilerBase
{
// run post filter if on code
if (!empty($code) &&
- (isset($this->smarty->autoload_filters['post']) || isset($this->smarty->registered_filters['post']))
+ (isset($this->smarty->autoload_filters[ 'post' ]) || isset($this->smarty->registered_filters[ 'post' ]))
) {
return $this->smarty->ext->_filterHandler->runFilter('post', $code, $this->template);
} else {
@@ -443,7 +444,7 @@ abstract class Smarty_Internal_TemplateCompilerBase
{
// run pre filter if required
if ($_content != '' &&
- ((isset($this->smarty->autoload_filters['pre']) || isset($this->smarty->registered_filters['pre'])))
+ ((isset($this->smarty->autoload_filters[ 'pre' ]) || isset($this->smarty->registered_filters[ 'pre' ])))
) {
return $this->smarty->ext->_filterHandler->runFilter('pre', $_content, $this->template);
} else {
@@ -496,8 +497,8 @@ abstract class Smarty_Internal_TemplateCompilerBase
$this->has_code = true;
$this->has_output = false;
// log tag/attributes
- if (isset($this->smarty->_cache['get_used_tags'])) {
- $this->template->_cache['used_tags'][] = array($tag, $args);
+ if (isset($this->smarty->_cache[ 'get_used_tags' ])) {
+ $this->template->_cache[ 'used_tags' ][] = array($tag, $args);
}
// check nocache option flag
if (in_array("'nocache'", $args) || in_array(array('nocache' => 'true'), $args) ||
@@ -507,9 +508,9 @@ abstract class Smarty_Internal_TemplateCompilerBase
}
// compile the smarty tag (required compile classes to compile the tag are auto loaded)
if (($_output = $this->callTagCompiler($tag, $args, $parameter)) === false) {
- if (isset($this->parent_compiler->template->tpl_function[$tag])) {
+ if (isset($this->parent_compiler->template->tpl_function[ $tag ])) {
// template defined by {template} tag
- $args['_attr']['name'] = "'" . $tag . "'";
+ $args[ '_attr' ][ 'name' ] = "'" . $tag . "'";
$_output = $this->callTagCompiler('call', $args, $parameter);
}
}
@@ -529,8 +530,8 @@ abstract class Smarty_Internal_TemplateCompilerBase
return null;
} else {
// map_named attributes
- if (isset($args['_attr'])) {
- foreach ($args['_attr'] as $key => $attribute) {
+ if (isset($args[ '_attr' ])) {
+ foreach ($args[ '_attr' ] as $key => $attribute) {
if (is_array($attribute)) {
$args = array_merge($args, $attribute);
}
@@ -539,14 +540,14 @@ abstract class Smarty_Internal_TemplateCompilerBase
// not an internal compiler tag
if (strlen($tag) < 6 || substr($tag, - 5) != 'close') {
// check if tag is a registered object
- if (isset($this->smarty->registered_objects[$tag]) && isset($parameter['object_method'])) {
- $method = $parameter['object_method'];
- if (!in_array($method, $this->smarty->registered_objects[$tag][3]) &&
- (empty($this->smarty->registered_objects[$tag][1]) ||
- in_array($method, $this->smarty->registered_objects[$tag][1]))
+ if (isset($this->smarty->registered_objects[ $tag ]) && isset($parameter[ 'object_method' ])) {
+ $method = $parameter[ 'object_method' ];
+ if (!in_array($method, $this->smarty->registered_objects[ $tag ][ 3 ]) &&
+ (empty($this->smarty->registered_objects[ $tag ][ 1 ]) ||
+ in_array($method, $this->smarty->registered_objects[ $tag ][ 1 ]))
) {
return $this->callTagCompiler('private_object_function', $args, $parameter, $tag, $method);
- } elseif (in_array($method, $this->smarty->registered_objects[$tag][3])) {
+ } elseif (in_array($method, $this->smarty->registered_objects[ $tag ][ 3 ])) {
return $this->callTagCompiler('private_object_block_function', $args, $parameter, $tag,
$method);
} else {
@@ -558,7 +559,7 @@ abstract class Smarty_Internal_TemplateCompilerBase
// check if tag is registered
foreach (array(Smarty::PLUGIN_COMPILER, Smarty::PLUGIN_FUNCTION, Smarty::PLUGIN_BLOCK) as $plugin_type)
{
- if (isset($this->smarty->registered_plugins[$plugin_type][$tag])) {
+ if (isset($this->smarty->registered_plugins[ $plugin_type ][ $tag ])) {
// if compiler function plugin call it now
if ($plugin_type == Smarty::PLUGIN_COMPILER) {
$new_args = array();
@@ -566,18 +567,18 @@ abstract class Smarty_Internal_TemplateCompilerBase
if (is_array($mixed)) {
$new_args = array_merge($new_args, $mixed);
} else {
- $new_args[$key] = $mixed;
+ $new_args[ $key ] = $mixed;
}
}
- if (!$this->smarty->registered_plugins[$plugin_type][$tag][1]) {
+ if (!$this->smarty->registered_plugins[ $plugin_type ][ $tag ][ 1 ]) {
$this->tag_nocache = true;
}
- $function = $this->smarty->registered_plugins[$plugin_type][$tag][0];
+ $function = $this->smarty->registered_plugins[ $plugin_type ][ $tag ][ 0 ];
if (!is_array($function)) {
return $function($new_args, $this);
- } elseif (is_object($function[0])) {
- return $this->smarty->registered_plugins[$plugin_type][$tag][0][0]->{$function[1]}($new_args,
- $this);
+ } elseif (is_object($function[ 0 ])) {
+ return $this->smarty->registered_plugins[ $plugin_type ][ $tag ][ 0 ][ 0 ]->{$function[ 1 ]}($new_args,
+ $this);
} else {
return call_user_func_array($function, array($new_args, $this));
}
@@ -604,7 +605,7 @@ abstract class Smarty_Internal_TemplateCompilerBase
if (is_array($mixed)) {
$new_args = array_merge($new_args, $mixed);
} else {
- $new_args[$key] = $mixed;
+ $new_args[ $key ] = $mixed;
}
}
@@ -632,7 +633,7 @@ abstract class Smarty_Internal_TemplateCompilerBase
$found = false;
// look for already resolved tags
foreach ($this->plugin_search_order as $plugin_type) {
- if (isset($this->default_handler_plugins[$plugin_type][$tag])) {
+ if (isset($this->default_handler_plugins[ $plugin_type ][ $tag ])) {
$found = true;
break;
}
@@ -653,12 +654,12 @@ abstract class Smarty_Internal_TemplateCompilerBase
foreach ($args as $mixed) {
$new_args = array_merge($new_args, $mixed);
}
- $function = $this->default_handler_plugins[$plugin_type][$tag][0];
+ $function = $this->default_handler_plugins[ $plugin_type ][ $tag ][ 0 ];
if (!is_array($function)) {
return $function($new_args, $this);
- } elseif (is_object($function[0])) {
- return $this->default_handler_plugins[$plugin_type][$tag][0][0]->$function[1]($new_args,
- $this);
+ } elseif (is_object($function[ 0 ])) {
+ return $this->default_handler_plugins[ $plugin_type ][ $tag ][ 0 ][ 0 ]->$function[ 1 ]($new_args,
+ $this);
} else {
return call_user_func_array($function, array($new_args, $this));
}
@@ -672,9 +673,9 @@ abstract class Smarty_Internal_TemplateCompilerBase
// compile closing tag of block function
$base_tag = substr($tag, 0, - 5);
// check if closing tag is a registered object
- if (isset($this->smarty->registered_objects[$base_tag]) && isset($parameter['object_method'])) {
- $method = $parameter['object_method'];
- if (in_array($method, $this->smarty->registered_objects[$base_tag][3])) {
+ if (isset($this->smarty->registered_objects[ $base_tag ]) && isset($parameter[ 'object_method' ])) {
+ $method = $parameter[ 'object_method' ];
+ if (in_array($method, $this->smarty->registered_objects[ $base_tag ][ 3 ])) {
return $this->callTagCompiler('private_object_block_function', $args, $parameter, $tag,
$method);
} else {
@@ -684,13 +685,13 @@ abstract class Smarty_Internal_TemplateCompilerBase
}
}
// registered block tag ?
- if (isset($this->smarty->registered_plugins[Smarty::PLUGIN_BLOCK][$base_tag]) ||
- isset($this->default_handler_plugins[Smarty::PLUGIN_BLOCK][$base_tag])
+ if (isset($this->smarty->registered_plugins[ Smarty::PLUGIN_BLOCK ][ $base_tag ]) ||
+ isset($this->default_handler_plugins[ Smarty::PLUGIN_BLOCK ][ $base_tag ])
) {
return $this->callTagCompiler('private_registered_block', $args, $parameter, $tag);
}
// registered function tag ?
- if (isset($this->smarty->registered_plugins[Smarty::PLUGIN_FUNCTION][$tag])) {
+ if (isset($this->smarty->registered_plugins[ Smarty::PLUGIN_FUNCTION ][ $tag ])) {
return $this->callTagCompiler('private_registered_function', $args, $parameter, $tag);
}
// block plugin?
@@ -706,18 +707,18 @@ abstract class Smarty_Internal_TemplateCompilerBase
}
}
// registered compiler plugin ?
- if (isset($this->smarty->registered_plugins[Smarty::PLUGIN_COMPILER][$tag])) {
+ if (isset($this->smarty->registered_plugins[ Smarty::PLUGIN_COMPILER ][ $tag ])) {
// if compiler function plugin call it now
$args = array();
- if (!$this->smarty->registered_plugins[Smarty::PLUGIN_COMPILER][$tag][1]) {
+ if (!$this->smarty->registered_plugins[ Smarty::PLUGIN_COMPILER ][ $tag ][ 1 ]) {
$this->tag_nocache = true;
}
- $function = $this->smarty->registered_plugins[Smarty::PLUGIN_COMPILER][$tag][0];
+ $function = $this->smarty->registered_plugins[ Smarty::PLUGIN_COMPILER ][ $tag ][ 0 ];
if (!is_array($function)) {
return $function($args, $this);
- } elseif (is_object($function[0])) {
- return $this->smarty->registered_plugins[Smarty::PLUGIN_COMPILER][$tag][0][0]->$function[1]($args,
- $this);
+ } elseif (is_object($function[ 0 ])) {
+ return $this->smarty->registered_plugins[ Smarty::PLUGIN_COMPILER ][ $tag ][ 0 ][ 0 ]->$function[ 1 ]($args,
+ $this);
} else {
return call_user_func_array($function, array($args, $this));
}
@@ -783,58 +784,57 @@ abstract class Smarty_Internal_TemplateCompilerBase
*/
public function processText($text)
{
- $store = array();
- $_store = 0;
- $_offset = 0;
- if ($this->parser->strip) {
- if (strpos($text, '<') !== false) {
- // capture html elements not to be messed with
- $_offset = 0;
- if (preg_match_all('#(<script[^>]*>.*?</script[^>]*>)|(<textarea[^>]*>.*?</textarea[^>]*>)|(<pre[^>]*>.*?</pre[^>]*>)#is',
- $text, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER)) {
- foreach ($matches as $match) {
- $store[] = $match[ 0 ][ 0 ];
- $_length = strlen($match[ 0 ][ 0 ]);
- $replace = '@!@SMARTY:' . $_store . ':SMARTY@!@';
- $text = substr_replace($text, $replace, $match[ 0 ][ 1 ] - $_offset, $_length);
-
- $_offset += $_length - strlen($replace);
- $_store ++;
+ if ((string) $text != '') {
+ $store = array();
+ $_store = 0;
+ $_offset = 0;
+ if ($this->parser->strip) {
+ if (strpos($text, '<') !== false) {
+ // capture html elements not to be messed with
+ $_offset = 0;
+ if (preg_match_all('#(<script[^>]*>.*?</script[^>]*>)|(<textarea[^>]*>.*?</textarea[^>]*>)|(<pre[^>]*>.*?</pre[^>]*>)#is',
+ $text, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER)) {
+ foreach ($matches as $match) {
+ $store[] = $match[ 0 ][ 0 ];
+ $_length = strlen($match[ 0 ][ 0 ]);
+ $replace = '@!@SMARTY:' . $_store . ':SMARTY@!@';
+ $text = substr_replace($text, $replace, $match[ 0 ][ 1 ] - $_offset, $_length);
+
+ $_offset += $_length - strlen($replace);
+ $_store ++;
+ }
}
- }
- $expressions = array(// replace multiple spaces between tags by a single space
- // can't remove them entirely, becaue that might break poorly implemented CSS display:inline-block elements
- '#(:SMARTY@!@|>)\s+(?=@!@SMARTY:|<)#s' => '\1 \2',
- // remove spaces between attributes (but not in attribute values!)
- '#(([a-z0-9]\s*=\s*("[^"]*?")|(\'[^\']*?\'))|<[a-z0-9_]+)\s+([a-z/>])#is' => '\1 \5',
- '#^\s+<#Ss' => '<',
- '#>\s+$#Ss' => '>',
- $this->stripRegEx => ''
- );
-
- $text = preg_replace(array_keys($expressions), array_values($expressions), $text);
- $_offset = 0;
- if (preg_match_all('#@!@SMARTY:([0-9]+):SMARTY@!@#is', $text, $matches,
- PREG_OFFSET_CAPTURE | PREG_SET_ORDER)) {
- foreach ($matches as $match) {
- $_length = strlen($match[ 0 ][ 0 ]);
- $replace = $store[ $match[ 1 ][ 0 ] ];
- $text = substr_replace($text, $replace, $match[ 0 ][ 1 ] + $_offset, $_length);
-
- $_offset += strlen($replace) - $_length;
- $_store ++;
+ $expressions = array(// replace multiple spaces between tags by a single space
+ // can't remove them entirely, becaue that might break poorly implemented CSS display:inline-block elements
+ '#(:SMARTY@!@|>)\s+(?=@!@SMARTY:|<)#s' => '\1 \2',
+ // remove spaces between attributes (but not in attribute values!)
+ '#(([a-z0-9]\s*=\s*("[^"]*?")|(\'[^\']*?\'))|<[a-z0-9_]+)\s+([a-z/>])#is' => '\1 \5',
+ '#^\s+<#Ss' => '<',
+ '#>\s+$#Ss' => '>',
+ $this->stripRegEx => '');
+
+ $text = preg_replace(array_keys($expressions), array_values($expressions), $text);
+ $_offset = 0;
+ if (preg_match_all('#@!@SMARTY:([0-9]+):SMARTY@!@#is', $text, $matches,
+ PREG_OFFSET_CAPTURE | PREG_SET_ORDER)) {
+ foreach ($matches as $match) {
+ $_length = strlen($match[ 0 ][ 0 ]);
+ $replace = $store[ $match[ 1 ][ 0 ] ];
+ $text = substr_replace($text, $replace, $match[ 0 ][ 1 ] + $_offset, $_length);
+
+ $_offset += strlen($replace) - $_length;
+ $_store ++;
+ }
}
+ } else {
+ $text = preg_replace($this->stripRegEx, '', $text);
}
- } else {
- $text = preg_replace($this->stripRegEx, '', $text);
}
- }
- if ($text) {
return new Smarty_Internal_ParseTree_Text($text);
}
return null;
- }
+ }
/**
* lazy loads internal compile plugin for tag and calls the compile method
@@ -853,7 +853,7 @@ abstract class Smarty_Internal_TemplateCompilerBase
public function callTagCompiler($tag, $args, $param1 = null, $param2 = null, $param3 = null)
{
// re-use object if already exists
- if (!isset($this->_tag_objects[$tag])) {
+ if (!isset($this->_tag_objects[ $tag ])) {
// lazy load internal compiler plugin
$_tag = explode('_', $tag);
$_tag = array_map('ucfirst', $_tag);
@@ -861,15 +861,15 @@ abstract class Smarty_Internal_TemplateCompilerBase
if (class_exists($class_name) &&
(!isset($this->smarty->security_policy) || $this->smarty->security_policy->isTrustedTag($tag, $this))
) {
- $this->_tag_objects[$tag] = new $class_name;
+ $this->_tag_objects[ $tag ] = new $class_name;
} else {
- $this->_tag_objects[$tag] = false;
+ $this->_tag_objects[ $tag ] = false;
return false;
}
}
// compile this tag
- return $this->_tag_objects[$tag] === false ? false :
- $this->_tag_objects[$tag]->compile($args, $this, $param1, $param2, $param3);
+ return $this->_tag_objects[ $tag ] === false ? false :
+ $this->_tag_objects[ $tag ]->compile($args, $this, $param1, $param2, $param3);
}
/**
@@ -884,29 +884,29 @@ abstract class Smarty_Internal_TemplateCompilerBase
{
$function = null;
if ($this->template->caching && ($this->nocache || $this->tag_nocache)) {
- if (isset($this->parent_compiler->template->compiled->required_plugins['nocache'][$plugin_name][$plugin_type])) {
+ if (isset($this->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ])) {
$function =
- $this->parent_compiler->template->compiled->required_plugins['nocache'][$plugin_name][$plugin_type]['function'];
- } elseif (isset($this->parent_compiler->template->compiled->required_plugins['compiled'][$plugin_name][$plugin_type])) {
- $this->parent_compiler->template->compiled->required_plugins['nocache'][$plugin_name][$plugin_type] =
- $this->parent_compiler->template->compiled->required_plugins['compiled'][$plugin_name][$plugin_type];
+ $this->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ][ 'function' ];
+ } elseif (isset($this->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ $plugin_name ][ $plugin_type ])) {
+ $this->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ] =
+ $this->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ $plugin_name ][ $plugin_type ];
$function =
- $this->parent_compiler->template->compiled->required_plugins['nocache'][$plugin_name][$plugin_type]['function'];
+ $this->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ][ 'function' ];
}
} else {
- if (isset($this->parent_compiler->template->compiled->required_plugins['compiled'][$plugin_name][$plugin_type])) {
+ if (isset($this->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ $plugin_name ][ $plugin_type ])) {
$function =
- $this->parent_compiler->template->compiled->required_plugins['compiled'][$plugin_name][$plugin_type]['function'];
- } elseif (isset($this->parent_compiler->template->compiled->required_plugins['nocache'][$plugin_name][$plugin_type])) {
- $this->parent_compiler->template->compiled->required_plugins['compiled'][$plugin_name][$plugin_type] =
- $this->parent_compiler->template->compiled->required_plugins['nocache'][$plugin_name][$plugin_type];
+ $this->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ $plugin_name ][ $plugin_type ][ 'function' ];
+ } elseif (isset($this->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ])) {
+ $this->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ $plugin_name ][ $plugin_type ] =
+ $this->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ];
$function =
- $this->parent_compiler->template->compiled->required_plugins['compiled'][$plugin_name][$plugin_type]['function'];
+ $this->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ $plugin_name ][ $plugin_type ][ 'function' ];
}
}
if (isset($function)) {
if ($plugin_type == 'modifier') {
- $this->modifier_plugins[$plugin_name] = true;
+ $this->modifier_plugins[ $plugin_name ] = true;
}
return $function;
@@ -917,18 +917,18 @@ abstract class Smarty_Internal_TemplateCompilerBase
if (is_string($file)) {
if ($this->template->caching && ($this->nocache || $this->tag_nocache)) {
- $this->parent_compiler->template->compiled->required_plugins['nocache'][$plugin_name][$plugin_type]['file'] =
+ $this->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ][ 'file' ] =
$file;
- $this->parent_compiler->template->compiled->required_plugins['nocache'][$plugin_name][$plugin_type]['function'] =
+ $this->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ][ 'function' ] =
$function;
} else {
- $this->parent_compiler->template->compiled->required_plugins['compiled'][$plugin_name][$plugin_type]['file'] =
+ $this->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ $plugin_name ][ $plugin_type ][ 'file' ] =
$file;
- $this->parent_compiler->template->compiled->required_plugins['compiled'][$plugin_name][$plugin_type]['function'] =
+ $this->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ $plugin_name ][ $plugin_type ][ 'function' ] =
$function;
}
if ($plugin_type == 'modifier') {
- $this->modifier_plugins[$plugin_name] = true;
+ $this->modifier_plugins[ $plugin_name ] = true;
}
return $function;
@@ -961,14 +961,14 @@ abstract class Smarty_Internal_TemplateCompilerBase
if ($script !== null) {
if (is_file($script)) {
if ($this->template->caching && ($this->nocache || $this->tag_nocache)) {
- $this->parent_compiler->template->compiled->required_plugins['nocache'][$tag][$plugin_type]['file'] =
+ $this->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ $tag ][ $plugin_type ][ 'file' ] =
$script;
- $this->parent_compiler->template->compiled->required_plugins['nocache'][$tag][$plugin_type]['function'] =
+ $this->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ $tag ][ $plugin_type ][ 'function' ] =
$callback;
} else {
- $this->parent_compiler->template->compiled->required_plugins['compiled'][$tag][$plugin_type]['file'] =
+ $this->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ $tag ][ $plugin_type ][ 'file' ] =
$script;
- $this->parent_compiler->template->compiled->required_plugins['compiled'][$tag][$plugin_type]['function'] =
+ $this->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ $tag ][ $plugin_type ][ 'function' ] =
$callback;
}
require_once $script;
@@ -976,11 +976,13 @@ abstract class Smarty_Internal_TemplateCompilerBase
$this->trigger_template_error("Default plugin handler: Returned script file \"{$script}\" for \"{$tag}\" not found");
}
}
- if (!is_string($callback) && !(is_array($callback) && is_string($callback[0]) && is_string($callback[1]))) {
+ if (!is_string($callback) &&
+ !(is_array($callback) && is_string($callback[ 0 ]) && is_string($callback[ 1 ]))
+ ) {
$this->trigger_template_error("Default plugin handler: Returned callback for \"{$tag}\" must be a static function name or array of class and function name");
}
if (is_callable($callback)) {
- $this->default_handler_plugins[$plugin_type][$tag] = array($callback, true, array());
+ $this->default_handler_plugins[ $plugin_type ][ $tag ] = array($callback, true, array());
return true;
} else {
@@ -1036,9 +1038,9 @@ abstract class Smarty_Internal_TemplateCompilerBase
"/*/%%SmartyNocache:{$this->nocache_hash}%%*/';?>\n";
// make sure we include modifier plugins for nocache code
foreach ($this->modifier_plugins as $plugin_name => $dummy) {
- if (isset($this->parent_compiler->template->compiled->required_plugins['compiled'][$plugin_name]['modifier'])) {
- $this->parent_compiler->template->compiled->required_plugins['nocache'][$plugin_name]['modifier'] =
- $this->parent_compiler->template->compiled->required_plugins['compiled'][$plugin_name]['modifier'];
+ if (isset($this->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ $plugin_name ][ 'modifier' ])) {
+ $this->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ $plugin_name ][ 'modifier' ] =
+ $this->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ $plugin_name ][ 'modifier' ];
}
}
} else {
@@ -1064,7 +1066,7 @@ abstract class Smarty_Internal_TemplateCompilerBase
public function getId($input)
{
if (preg_match('~^[\'"]*([0-9]*[a-zA-Z_]\w*)[\'"]*$~', $input, $match)) {
- return $match[1];
+ return $match[ 1 ];
}
return false;
}
@@ -1079,7 +1081,7 @@ abstract class Smarty_Internal_TemplateCompilerBase
public function getVariableName($input)
{
if (preg_match('~^[$]_smarty_tpl->tpl_vars\[[\'"]*([0-9]*[a-zA-Z_]\w*)[\'"]*\]->value$~', $input, $match)) {
- return $match[1];
+ return $match[ 1 ];
}
return false;
}
@@ -1136,7 +1138,7 @@ abstract class Smarty_Internal_TemplateCompilerBase
$error_text =
'Syntax error in template "' . (empty($this->trace_filepath) ? $templateName : $this->trace_filepath) .
'" on line ' . ($line + $this->trace_line_offset) . ' "' .
- trim(preg_replace('![\t\r\n]+!', ' ', $match[$line - 1])) . '" ';
+ trim(preg_replace('![\t\r\n]+!', ' ', $match[ $line - 1 ])) . '" ';
if (isset($args)) {
// individual error message
$error_text .= $args;
@@ -1146,13 +1148,13 @@ abstract class Smarty_Internal_TemplateCompilerBase
$error_text .= ' - Unexpected "' . $lex->value . '"';
if (count($this->parser->yy_get_expected_tokens($this->parser->yymajor)) <= 4) {
foreach ($this->parser->yy_get_expected_tokens($this->parser->yymajor) as $token) {
- $exp_token = $this->parser->yyTokenName[$token];
- if (isset($lex->smarty_token_names[$exp_token])) {
+ $exp_token = $this->parser->yyTokenName[ $token ];
+ if (isset($lex->smarty_token_names[ $exp_token ])) {
// token type from lexer
- $expect[] = '"' . $lex->smarty_token_names[$exp_token] . '"';
+ $expect[] = '"' . $lex->smarty_token_names[ $exp_token ] . '"';
} else {
// otherwise internal token name
- $expect[] = $this->parser->yyTokenName[$token];
+ $expect[] = $this->parser->yyTokenName[ $token ];
}
}
$error_text .= ', expected one of: ' . implode(' , ', $expect);
@@ -1160,7 +1162,7 @@ abstract class Smarty_Internal_TemplateCompilerBase
}
$e = new SmartyCompilerException($error_text);
$e->line = $line;
- $e->source = trim(preg_replace('![\t\r\n]+!', ' ', $match[$line - 1]));
+ $e->source = trim(preg_replace('![\t\r\n]+!', ' ', $match[ $line - 1 ]));
$e->desc = $args;
$e->template = $this->template->source->filepath;
throw $e;
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_templateparser.php b/library/Smarty/libs/sysplugins/smarty_internal_templateparser.php
index 57dbf61a3..a745d1dc2 100644
--- a/library/Smarty/libs/sysplugins/smarty_internal_templateparser.php
+++ b/library/Smarty/libs/sysplugins/smarty_internal_templateparser.php
@@ -28,18 +28,18 @@ class TP_yyToken implements ArrayAccess
public function offsetExists($offset)
{
- return isset($this->metadata[$offset]);
+ return isset($this->metadata[ $offset ]);
}
public function offsetGet($offset)
{
- return $this->metadata[$offset];
+ return $this->metadata[ $offset ];
}
public function offsetSet($offset, $value)
{
if ($offset === null) {
- if (isset($value[0])) {
+ if (isset($value[ 0 ])) {
$x = ($value instanceof TP_yyToken) ? $value->metadata : $value;
$this->metadata = array_merge($this->metadata, $x);
@@ -52,16 +52,16 @@ class TP_yyToken implements ArrayAccess
}
if ($value instanceof TP_yyToken) {
if ($value->metadata) {
- $this->metadata[$offset] = $value->metadata;
+ $this->metadata[ $offset ] = $value->metadata;
}
} elseif ($value) {
- $this->metadata[$offset] = $value;
+ $this->metadata[ $offset ] = $value;
}
}
public function offsetUnset($offset)
{
- unset($this->metadata[$offset]);
+ unset($this->metadata[ $offset ]);
}
}
@@ -382,291 +382,282 @@ class Smarty_Internal_Templateparser
const TP_BACKTICK = 59;
- const YY_NO_ACTION = 535;
-
- const YY_ACCEPT_ACTION = 534;
-
- const YY_ERROR_ACTION = 533;
-
- const YY_SZ_ACTTAB = 2082;
-
- static public $yy_action = array(278, 8, 134, 451, 281, 68, 207, 7, 85, 248, 29, 98, 168, 114, 252, 451, 367, 230,
- 315, 245, 235, 249, 233, 36, 28, 145, 38, 42, 140, 36, 27, 39, 41, 322, 222, 300,
- 27, 213, 195, 82, 1, 31, 265, 92, 164, 181, 53, 278, 8, 133, 97, 281, 201, 249, 7,
- 85, 35, 307, 35, 307, 114, 226, 227, 215, 230, 108, 245, 235, 265, 208, 195, 28,
- 195, 5, 42, 184, 268, 277, 39, 41, 322, 222, 218, 258, 213, 120, 82, 1, 333, 265,
- 181, 175, 3, 53, 278, 8, 135, 105, 281, 206, 249, 7, 85, 35, 307, 207, 24, 114, 16,
- 103, 305, 230, 17, 245, 235, 404, 233, 195, 28, 288, 15, 42, 96, 265, 20, 39, 41,
- 322, 222, 300, 404, 213, 450, 82, 1, 6, 265, 404, 52, 113, 53, 278, 8, 135, 450,
- 281, 206, 289, 7, 85, 261, 463, 228, 244, 114, 122, 296, 463, 230, 102, 245, 235,
- 236, 198, 182, 28, 262, 122, 42, 143, 274, 102, 39, 41, 322, 222, 300, 33, 213,
- 314, 82, 1, 274, 265, 207, 86, 311, 53, 278, 8, 136, 195, 281, 206, 362, 7, 85,
- 283, 285, 287, 229, 114, 33, 228, 309, 230, 326, 245, 235, 36, 233, 291, 28, 479,
- 479, 42, 27, 147, 479, 39, 41, 322, 222, 300, 159, 213, 249, 82, 1, 193, 265, 94,
- 169, 249, 53, 278, 8, 135, 251, 281, 197, 249, 7, 85, 248, 29, 91, 150, 114, 252,
- 193, 479, 230, 207, 245, 235, 249, 233, 195, 28, 288, 191, 42, 407, 450, 207, 39,
- 41, 322, 222, 300, 179, 213, 195, 82, 1, 450, 265, 407, 52, 249, 53, 278, 8, 135,
- 407, 281, 204, 195, 7, 85, 313, 251, 93, 155, 114, 226, 225, 12, 230, 108, 245,
- 235, 249, 233, 247, 28, 479, 479, 42, 282, 189, 479, 39, 41, 322, 222, 300, 161,
- 213, 195, 82, 1, 25, 265, 103, 177, 249, 53, 278, 8, 132, 142, 281, 206, 249, 7,
- 85, 195, 244, 34, 249, 114, 103, 193, 103, 230, 251, 245, 235, 207, 233, 289, 4,
- 237, 113, 42, 228, 146, 138, 39, 41, 322, 222, 300, 10, 213, 249, 82, 1, 148, 265,
- 251, 113, 99, 53, 278, 8, 137, 251, 281, 206, 288, 7, 85, 294, 103, 186, 246, 114,
- 237, 335, 33, 230, 319, 245, 235, 329, 233, 255, 23, 52, 331, 42, 188, 246, 264,
- 39, 41, 322, 222, 300, 167, 213, 138, 82, 1, 34, 265, 288, 10, 249, 53, 278, 8,
- 135, 153, 281, 199, 207, 7, 85, 234, 226, 250, 249, 114, 108, 193, 190, 230, 308,
- 245, 235, 337, 209, 232, 28, 128, 160, 42, 128, 193, 207, 39, 41, 322, 222, 300,
- 11, 213, 463, 82, 1, 158, 265, 27, 463, 108, 53, 278, 8, 137, 176, 281, 206, 180,
- 7, 85, 220, 14, 276, 249, 114, 269, 207, 172, 230, 251, 245, 235, 106, 233, 286,
- 23, 407, 115, 42, 259, 193, 141, 39, 41, 322, 222, 300, 267, 213, 312, 82, 407,
- 144, 265, 207, 207, 38, 53, 407, 187, 246, 272, 273, 271, 270, 266, 184, 318, 207,
- 13, 278, 8, 22, 242, 281, 2, 173, 7, 85, 36, 84, 265, 19, 114, 6, 156, 27, 230,
- 137, 245, 235, 223, 217, 304, 249, 237, 248, 29, 228, 214, 163, 252, 119, 66, 112,
- 40, 43, 37, 102, 249, 126, 298, 260, 265, 192, 212, 297, 301, 284, 274, 295, 170,
- 324, 257, 256, 82, 304, 185, 265, 211, 302, 228, 214, 336, 221, 123, 73, 112, 166,
- 334, 183, 102, 248, 29, 298, 260, 253, 252, 212, 297, 301, 275, 274, 279, 195, 304,
- 36, 294, 165, 205, 228, 214, 171, 27, 123, 58, 109, 225, 117, 251, 102, 139, 149,
- 298, 260, 89, 151, 212, 297, 301, 304, 274, 301, 181, 157, 228, 214, 248, 29, 123,
- 73, 112, 252, 249, 87, 102, 35, 307, 298, 260, 88, 36, 212, 297, 301, 174, 274, 90,
- 27, 304, 195, 95, 301, 216, 228, 214, 301, 301, 123, 46, 109, 110, 301, 301, 102,
- 301, 207, 298, 260, 450, 405, 212, 297, 301, 231, 274, 401, 301, 304, 238, 301,
- 450, 301, 228, 214, 405, 327, 119, 66, 112, 301, 36, 405, 102, 301, 450, 298, 260,
- 27, 301, 212, 297, 301, 304, 274, 301, 301, 450, 228, 214, 301, 301, 123, 73, 112,
- 303, 301, 301, 102, 301, 301, 298, 260, 301, 301, 212, 297, 301, 137, 274, 301,
- 254, 304, 301, 301, 301, 210, 228, 214, 248, 29, 123, 75, 112, 252, 301, 301, 102,
- 301, 301, 298, 260, 301, 301, 212, 297, 301, 301, 274, 301, 301, 304, 301, 243,
- 301, 82, 228, 214, 265, 301, 123, 60, 112, 301, 301, 301, 102, 241, 301, 298, 260,
- 301, 301, 212, 297, 301, 304, 274, 301, 301, 301, 228, 214, 301, 301, 104, 71, 112,
- 301, 301, 301, 102, 301, 301, 298, 260, 301, 301, 212, 297, 301, 301, 274, 301,
- 301, 304, 301, 301, 301, 301, 228, 81, 301, 301, 83, 47, 107, 301, 301, 301, 102,
- 301, 301, 298, 260, 301, 301, 212, 297, 301, 301, 274, 301, 301, 304, 301, 301,
- 301, 301, 228, 214, 301, 301, 123, 76, 112, 301, 301, 301, 102, 301, 301, 298, 260,
- 301, 301, 212, 297, 301, 304, 274, 301, 301, 301, 228, 214, 301, 301, 123, 67, 112,
- 301, 301, 301, 102, 301, 301, 298, 260, 301, 301, 212, 297, 301, 301, 274, 301,
- 301, 304, 301, 301, 301, 301, 228, 214, 301, 301, 123, 64, 112, 301, 301, 301, 102,
- 301, 301, 298, 260, 301, 310, 212, 297, 301, 301, 274, 301, 278, 9, 299, 301, 281,
- 301, 301, 7, 85, 301, 301, 301, 301, 114, 310, 301, 301, 230, 301, 245, 235, 278,
- 9, 299, 301, 281, 301, 301, 7, 85, 301, 301, 301, 301, 114, 301, 301, 301, 230,
- 301, 245, 235, 301, 301, 181, 154, 316, 21, 301, 181, 152, 301, 301, 301, 249, 304,
- 301, 35, 307, 249, 228, 203, 35, 307, 123, 61, 112, 325, 21, 301, 102, 195, 301,
- 298, 260, 301, 195, 212, 297, 301, 301, 274, 304, 301, 301, 181, 162, 228, 214,
- 301, 301, 123, 62, 112, 301, 249, 301, 102, 35, 307, 298, 260, 301, 301, 212, 297,
- 301, 301, 274, 301, 301, 304, 195, 207, 301, 301, 228, 214, 301, 301, 123, 65, 112,
- 196, 301, 301, 102, 301, 301, 298, 260, 301, 301, 212, 297, 301, 301, 274, 304,
- 301, 301, 301, 301, 228, 214, 301, 301, 123, 48, 112, 40, 43, 37, 102, 301, 301,
- 298, 260, 301, 301, 212, 297, 301, 301, 274, 304, 301, 324, 257, 256, 228, 214,
- 301, 301, 123, 63, 112, 301, 301, 301, 102, 18, 200, 298, 260, 292, 301, 212, 297,
- 301, 301, 274, 301, 301, 304, 301, 207, 301, 301, 228, 202, 301, 293, 116, 59, 112,
- 320, 301, 301, 102, 301, 301, 298, 260, 301, 301, 212, 297, 301, 301, 274, 304,
- 265, 301, 301, 301, 228, 79, 301, 301, 83, 45, 107, 40, 43, 37, 102, 301, 301, 298,
- 260, 301, 301, 212, 297, 301, 301, 274, 304, 301, 324, 257, 256, 228, 214, 301,
- 301, 123, 58, 112, 301, 301, 301, 102, 301, 301, 298, 260, 301, 301, 212, 297, 301,
- 301, 274, 301, 301, 304, 301, 207, 301, 301, 228, 214, 301, 301, 123, 72, 112, 40,
- 43, 37, 102, 301, 301, 298, 260, 301, 301, 212, 297, 301, 301, 274, 304, 178, 324,
- 257, 256, 228, 214, 301, 301, 123, 55, 112, 40, 43, 37, 102, 301, 301, 298, 260,
- 301, 301, 212, 297, 301, 301, 274, 304, 301, 324, 257, 256, 228, 214, 301, 301,
- 123, 54, 112, 301, 301, 301, 102, 301, 301, 298, 260, 301, 301, 212, 297, 301, 301,
- 274, 301, 301, 304, 301, 207, 301, 301, 228, 214, 301, 301, 101, 77, 112, 280, 301,
- 301, 102, 301, 301, 298, 260, 301, 301, 212, 297, 301, 301, 274, 304, 301, 301,
- 301, 301, 228, 214, 301, 301, 123, 80, 112, 40, 43, 37, 102, 301, 301, 298, 260,
- 301, 301, 212, 297, 301, 301, 274, 304, 301, 324, 257, 256, 228, 214, 301, 301,
- 123, 56, 112, 301, 301, 301, 102, 301, 301, 298, 260, 301, 301, 212, 297, 301, 301,
- 274, 301, 301, 304, 301, 207, 301, 301, 228, 214, 301, 301, 123, 70, 112, 194, 301,
- 301, 102, 301, 301, 298, 260, 301, 301, 212, 297, 301, 301, 274, 304, 301, 301,
- 301, 301, 228, 214, 301, 301, 123, 74, 112, 40, 43, 37, 102, 301, 301, 298, 260,
- 301, 301, 212, 297, 301, 301, 274, 304, 301, 324, 257, 256, 228, 214, 301, 301,
- 123, 49, 112, 301, 301, 301, 102, 301, 301, 298, 260, 301, 301, 212, 297, 301, 301,
- 274, 301, 301, 304, 301, 207, 301, 301, 228, 214, 301, 301, 100, 57, 112, 301, 301,
- 301, 102, 301, 301, 298, 260, 301, 301, 212, 297, 301, 301, 274, 304, 301, 301,
- 301, 301, 228, 214, 301, 301, 123, 44, 112, 40, 43, 37, 102, 301, 301, 298, 260,
- 301, 301, 212, 297, 301, 301, 274, 304, 301, 324, 257, 256, 228, 214, 301, 301,
- 123, 69, 112, 301, 301, 301, 102, 301, 301, 298, 260, 301, 301, 212, 297, 301, 301,
- 274, 301, 301, 304, 301, 301, 301, 301, 228, 214, 301, 301, 118, 50, 112, 301, 301,
- 301, 102, 301, 301, 298, 260, 301, 301, 212, 297, 301, 301, 274, 304, 301, 301,
- 301, 301, 228, 214, 301, 301, 123, 78, 112, 301, 301, 301, 102, 301, 301, 298, 260,
- 207, 301, 212, 297, 301, 301, 274, 304, 301, 301, 359, 301, 228, 224, 301, 301,
- 121, 301, 112, 301, 301, 288, 102, 301, 301, 36, 306, 301, 301, 212, 297, 301, 27,
- 274, 301, 301, 304, 301, 301, 301, 52, 228, 224, 301, 301, 131, 301, 112, 301, 301,
- 301, 102, 301, 301, 219, 321, 301, 301, 212, 297, 301, 301, 274, 219, 479, 479,
- 301, 301, 301, 479, 463, 301, 301, 479, 479, 301, 30, 301, 479, 463, 417, 417, 301,
- 301, 301, 301, 479, 479, 301, 207, 301, 479, 463, 301, 301, 301, 301, 301, 463,
- 328, 463, 301, 479, 301, 463, 332, 207, 463, 301, 463, 288, 479, 301, 463, 36, 450,
- 290, 417, 417, 417, 463, 27, 463, 301, 479, 301, 463, 450, 301, 52, 301, 36, 301,
- 301, 417, 417, 417, 301, 27, 301, 301, 304, 301, 40, 43, 37, 228, 224, 301, 301,
- 127, 301, 112, 301, 301, 301, 102, 301, 301, 301, 324, 257, 256, 212, 297, 301,
- 301, 274, 301, 301, 304, 301, 301, 219, 301, 228, 224, 301, 301, 125, 301, 112,
- 301, 479, 479, 102, 15, 301, 479, 463, 301, 301, 212, 297, 301, 301, 274, 534, 51,
- 263, 285, 287, 229, 304, 301, 228, 301, 301, 228, 224, 207, 301, 124, 301, 112,
- 301, 301, 463, 102, 463, 207, 479, 301, 463, 301, 212, 297, 301, 304, 274, 207,
- 301, 301, 228, 224, 36, 301, 130, 301, 112, 301, 301, 27, 102, 301, 301, 301, 40,
- 43, 37, 212, 297, 301, 32, 274, 36, 239, 40, 43, 37, 301, 301, 27, 301, 324, 257,
- 256, 40, 43, 37, 301, 301, 301, 301, 324, 257, 256, 301, 301, 301, 301, 301, 304,
- 301, 324, 257, 256, 228, 224, 301, 301, 129, 301, 112, 301, 301, 301, 102, 301,
- 301, 26, 301, 301, 219, 212, 297, 301, 301, 274, 301, 479, 479, 301, 479, 479, 479,
- 463, 207, 479, 463, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 463, 301, 463, 463,
- 479, 463, 463, 479, 207, 463, 40, 43, 37, 301, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 324, 257, 256, 301, 330, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 411, 301, 40, 43, 37, 207, 301, 301, 301, 301, 411,
- 301, 411, 301, 207, 411, 301, 317, 301, 324, 257, 256, 411, 301, 411, 301, 411,
- 301, 301, 301, 301, 301, 301, 301, 111, 237, 301, 301, 301, 301, 301, 323, 40, 43,
- 37, 301, 207, 301, 301, 301, 301, 40, 43, 37, 301, 301, 373, 301, 301, 324, 257,
- 256, 301, 240, 301, 301, 301, 301, 324, 257, 256, 36, 301, 301, 301, 301, 301, 301,
- 27, 301, 301, 450, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 450,);
-
- static public $yy_lookahead = array(12, 13, 14, 36, 16, 17, 1, 19, 20, 12, 13, 71, 72, 25, 17, 48, 11, 29, 30, 31,
- 32, 81, 34, 26, 36, 28, 2, 39, 14, 26, 33, 43, 44, 45, 46, 47, 33, 49, 98, 51,
- 52, 23, 54, 71, 72, 71, 58, 12, 13, 14, 36, 16, 17, 81, 19, 20, 84, 85, 84, 85,
- 25, 75, 76, 77, 29, 79, 31, 32, 54, 34, 98, 36, 98, 36, 39, 8, 9, 10, 43, 44,
- 45, 46, 47, 14, 49, 48, 51, 52, 53, 54, 71, 72, 35, 58, 12, 13, 14, 67, 16, 17,
- 81, 19, 20, 84, 85, 1, 15, 25, 21, 18, 53, 29, 13, 31, 32, 11, 34, 98, 36, 22,
- 15, 39, 35, 54, 28, 43, 44, 45, 46, 47, 26, 49, 36, 51, 52, 36, 54, 33, 41, 48,
- 58, 12, 13, 14, 48, 16, 17, 64, 19, 20, 70, 46, 69, 99, 25, 75, 59, 52, 29, 79,
- 31, 32, 70, 34, 71, 36, 86, 75, 39, 51, 90, 79, 43, 44, 45, 46, 47, 35, 49, 37,
- 51, 52, 90, 54, 1, 102, 103, 58, 12, 13, 14, 98, 16, 17, 11, 19, 20, 63, 64, 65,
- 66, 25, 35, 69, 37, 29, 34, 31, 32, 26, 34, 17, 36, 12, 13, 39, 33, 72, 17, 43,
- 44, 45, 46, 47, 72, 49, 81, 51, 52, 98, 54, 71, 72, 81, 58, 12, 13, 14, 93, 16,
- 17, 81, 19, 20, 12, 13, 71, 72, 25, 17, 98, 50, 29, 1, 31, 32, 81, 34, 98, 36,
- 22, 71, 39, 11, 36, 1, 43, 44, 45, 46, 47, 72, 49, 98, 51, 52, 48, 54, 26, 41,
- 81, 58, 12, 13, 14, 33, 16, 17, 98, 19, 20, 53, 93, 71, 72, 25, 75, 76, 15, 29,
- 79, 31, 32, 81, 34, 22, 36, 12, 13, 39, 11, 71, 17, 43, 44, 45, 46, 47, 72, 49,
- 98, 51, 52, 15, 54, 18, 72, 81, 58, 12, 13, 14, 72, 16, 17, 81, 19, 20, 98, 99,
- 15, 81, 25, 18, 98, 18, 29, 93, 31, 32, 1, 34, 64, 36, 46, 48, 39, 69, 72, 46,
- 43, 44, 45, 46, 47, 52, 49, 81, 51, 52, 91, 54, 93, 48, 80, 58, 12, 13, 14, 93,
- 16, 17, 22, 19, 20, 92, 18, 94, 95, 25, 46, 103, 35, 29, 37, 31, 32, 53, 34, 17,
- 36, 41, 53, 39, 94, 95, 95, 43, 44, 45, 46, 47, 72, 49, 46, 51, 52, 15, 54, 22,
- 52, 81, 58, 12, 13, 14, 72, 16, 17, 1, 19, 20, 50, 75, 76, 81, 25, 79, 98, 80,
- 29, 89, 31, 32, 89, 34, 18, 36, 96, 51, 39, 96, 98, 1, 43, 44, 45, 46, 47, 26,
- 49, 46, 51, 52, 75, 54, 33, 52, 79, 58, 12, 13, 14, 72, 16, 17, 14, 19, 20, 17,
- 28, 65, 81, 25, 68, 1, 91, 29, 93, 31, 32, 79, 34, 37, 36, 11, 17, 39, 17, 98,
- 14, 43, 44, 45, 46, 47, 9, 49, 96, 51, 26, 27, 54, 1, 1, 2, 58, 33, 94, 95, 3,
- 4, 5, 6, 7, 8, 34, 1, 2, 12, 13, 13, 14, 16, 36, 17, 19, 20, 26, 17, 54, 42, 25,
- 36, 72, 33, 29, 14, 31, 32, 17, 17, 64, 81, 46, 12, 13, 69, 70, 72, 17, 73, 74,
- 75, 38, 39, 40, 79, 81, 17, 82, 83, 54, 17, 86, 87, 88, 17, 90, 17, 91, 55, 56,
- 57, 51, 64, 71, 54, 100, 101, 69, 70, 53, 50, 73, 74, 75, 91, 53, 80, 79, 12,
- 13, 82, 83, 17, 17, 86, 87, 88, 5, 90, 81, 98, 64, 26, 92, 28, 97, 69, 70, 91,
- 33, 73, 74, 75, 76, 78, 93, 79, 79, 91, 82, 83, 79, 91, 86, 87, 88, 64, 90, 104,
- 71, 72, 69, 70, 12, 13, 73, 74, 75, 17, 81, 79, 79, 84, 85, 82, 83, 79, 26, 86,
- 87, 88, 91, 90, 79, 33, 64, 98, 91, 104, 97, 69, 70, 104, 104, 73, 74, 75, 76,
- 104, 104, 79, 104, 1, 82, 83, 36, 11, 86, 87, 88, 15, 90, 11, 104, 64, 46, 104,
- 48, 104, 69, 70, 26, 53, 73, 74, 75, 104, 26, 33, 79, 104, 36, 82, 83, 33, 104,
- 86, 87, 88, 64, 90, 104, 104, 48, 69, 70, 104, 104, 73, 74, 75, 101, 104, 104,
- 79, 104, 104, 82, 83, 104, 104, 86, 87, 88, 14, 90, 104, 17, 64, 104, 104, 104,
- 97, 69, 70, 12, 13, 73, 74, 75, 17, 104, 104, 79, 104, 104, 82, 83, 104, 104,
- 86, 87, 88, 104, 90, 104, 104, 64, 104, 49, 104, 51, 69, 70, 54, 104, 73, 74,
- 75, 104, 104, 104, 79, 50, 104, 82, 83, 104, 104, 86, 87, 88, 64, 90, 104, 104,
- 104, 69, 70, 104, 104, 73, 74, 75, 104, 104, 104, 79, 104, 104, 82, 83, 104,
- 104, 86, 87, 88, 104, 90, 104, 104, 64, 104, 104, 104, 104, 69, 70, 104, 104,
- 73, 74, 75, 104, 104, 104, 79, 104, 104, 82, 83, 104, 104, 86, 87, 88, 104, 90,
- 104, 104, 64, 104, 104, 104, 104, 69, 70, 104, 104, 73, 74, 75, 104, 104, 104,
- 79, 104, 104, 82, 83, 104, 104, 86, 87, 88, 64, 90, 104, 104, 104, 69, 70, 104,
- 104, 73, 74, 75, 104, 104, 104, 79, 104, 104, 82, 83, 104, 104, 86, 87, 88, 104,
- 90, 104, 104, 64, 104, 104, 104, 104, 69, 70, 104, 104, 73, 74, 75, 104, 104,
- 104, 79, 104, 104, 82, 83, 104, 5, 86, 87, 88, 104, 90, 104, 12, 13, 14, 104,
- 16, 104, 104, 19, 20, 104, 104, 104, 104, 25, 5, 104, 104, 29, 104, 31, 32, 12,
- 13, 14, 104, 16, 104, 104, 19, 20, 104, 104, 104, 104, 25, 104, 104, 104, 29,
- 104, 31, 32, 104, 104, 71, 72, 58, 59, 104, 71, 72, 104, 104, 104, 81, 64, 104,
- 84, 85, 81, 69, 70, 84, 85, 73, 74, 75, 58, 59, 104, 79, 98, 104, 82, 83, 104,
- 98, 86, 87, 88, 104, 90, 64, 104, 104, 71, 72, 69, 70, 104, 104, 73, 74, 75,
- 104, 81, 104, 79, 84, 85, 82, 83, 104, 104, 86, 87, 88, 104, 90, 104, 104, 64,
- 98, 1, 104, 104, 69, 70, 104, 104, 73, 74, 75, 11, 104, 104, 79, 104, 104, 82,
- 83, 104, 104, 86, 87, 88, 104, 90, 64, 104, 104, 104, 104, 69, 70, 104, 104, 73,
- 74, 75, 38, 39, 40, 79, 104, 104, 82, 83, 104, 104, 86, 87, 88, 104, 90, 64,
- 104, 55, 56, 57, 69, 70, 104, 104, 73, 74, 75, 104, 104, 104, 79, 13, 14, 82,
- 83, 17, 104, 86, 87, 88, 104, 90, 104, 104, 64, 104, 1, 104, 104, 69, 70, 104,
- 34, 73, 74, 75, 11, 104, 104, 79, 104, 104, 82, 83, 104, 104, 86, 87, 88, 104,
- 90, 64, 54, 104, 104, 104, 69, 70, 104, 104, 73, 74, 75, 38, 39, 40, 79, 104,
- 104, 82, 83, 104, 104, 86, 87, 88, 104, 90, 64, 104, 55, 56, 57, 69, 70, 104,
- 104, 73, 74, 75, 104, 104, 104, 79, 104, 104, 82, 83, 104, 104, 86, 87, 88, 104,
- 90, 104, 104, 64, 104, 1, 104, 104, 69, 70, 104, 104, 73, 74, 75, 38, 39, 40,
- 79, 104, 104, 82, 83, 104, 104, 86, 87, 88, 104, 90, 64, 27, 55, 56, 57, 69, 70,
- 104, 104, 73, 74, 75, 38, 39, 40, 79, 104, 104, 82, 83, 104, 104, 86, 87, 88,
- 104, 90, 64, 104, 55, 56, 57, 69, 70, 104, 104, 73, 74, 75, 104, 104, 104, 79,
- 104, 104, 82, 83, 104, 104, 86, 87, 88, 104, 90, 104, 104, 64, 104, 1, 104, 104,
- 69, 70, 104, 104, 73, 74, 75, 11, 104, 104, 79, 104, 104, 82, 83, 104, 104, 86,
- 87, 88, 104, 90, 64, 104, 104, 104, 104, 69, 70, 104, 104, 73, 74, 75, 38, 39,
+ const YY_NO_ACTION = 527;
+
+ const YY_ACCEPT_ACTION = 526;
+
+ const YY_ERROR_ACTION = 525;
+
+ const YY_SZ_ACTTAB = 2021;
+
+ static public $yy_action = array(242, 10, 131, 178, 255, 76, 157, 5, 83, 293, 12, 149, 152, 116, 292, 93, 331, 217,
+ 284, 295, 221, 331, 226, 36, 21, 169, 35, 43, 308, 99, 26, 42, 39, 294, 235, 244,
+ 30, 200, 187, 80, 1, 251, 320, 206, 442, 123, 53, 242, 10, 130, 98, 255, 194, 399,
+ 5, 83, 442, 240, 298, 107, 116, 310, 174, 220, 217, 36, 295, 221, 399, 208, 135,
+ 21, 26, 161, 43, 399, 8, 174, 42, 39, 294, 235, 218, 331, 200, 187, 80, 1, 312,
+ 320, 11, 290, 313, 53, 242, 10, 133, 306, 255, 205, 187, 5, 83, 264, 266, 267, 211,
+ 116, 353, 220, 52, 217, 298, 295, 221, 206, 226, 220, 21, 290, 290, 43, 321, 36,
+ 249, 42, 39, 294, 235, 244, 26, 200, 206, 80, 1, 11, 320, 283, 52, 52, 53, 242, 10,
+ 132, 248, 255, 205, 455, 5, 83, 84, 301, 151, 455, 116, 323, 92, 36, 217, 2, 295,
+ 221, 331, 226, 26, 21, 290, 304, 43, 137, 36, 111, 42, 39, 294, 235, 244, 26, 200,
+ 187, 80, 1, 225, 320, 320, 52, 123, 53, 242, 10, 133, 98, 255, 193, 175, 5, 83,
+ 177, 280, 273, 234, 116, 310, 23, 278, 217, 13, 295, 221, 320, 203, 223, 21, 290,
+ 442, 43, 138, 187, 326, 42, 39, 294, 235, 244, 216, 200, 442, 80, 1, 4, 320, 329,
+ 52, 15, 53, 242, 10, 134, 91, 255, 205, 176, 5, 83, 293, 12, 16, 90, 116, 292, 300,
+ 99, 217, 241, 295, 221, 320, 226, 215, 28, 213, 201, 43, 105, 187, 286, 42, 39,
+ 294, 235, 244, 215, 200, 214, 80, 1, 105, 320, 11, 135, 285, 53, 242, 10, 133, 8,
+ 255, 205, 164, 5, 83, 442, 215, 19, 239, 116, 99, 105, 331, 217, 6, 295, 221, 442,
+ 192, 311, 21, 182, 289, 43, 308, 443, 32, 42, 39, 294, 235, 244, 296, 200, 17, 80,
+ 1, 443, 320, 262, 107, 26, 53, 242, 10, 133, 122, 255, 191, 172, 5, 83, 183, 188,
+ 148, 231, 116, 223, 168, 331, 217, 181, 295, 221, 331, 226, 206, 21, 331, 141, 43,
+ 308, 206, 38, 42, 39, 294, 235, 244, 331, 200, 188, 80, 1, 187, 320, 155, 206, 308,
+ 53, 242, 10, 133, 25, 255, 198, 188, 5, 83, 206, 145, 160, 308, 116, 228, 146, 206,
+ 217, 180, 295, 221, 331, 226, 286, 21, 331, 359, 43, 179, 289, 38, 42, 39, 294,
+ 235, 244, 250, 200, 271, 80, 1, 272, 320, 122, 94, 103, 53, 242, 10, 129, 3, 255,
+ 205, 144, 5, 83, 185, 289, 170, 99, 116, 270, 322, 331, 217, 184, 295, 221, 331,
+ 226, 99, 7, 171, 35, 43, 308, 89, 105, 42, 39, 294, 235, 244, 120, 200, 328, 80, 1,
+ 187, 320, 82, 223, 4, 53, 242, 10, 134, 142, 255, 205, 107, 5, 83, 309, 324, 302,
+ 20, 116, 316, 206, 291, 217, 290, 295, 221, 33, 226, 277, 28, 399, 243, 43, 257,
+ 219, 189, 42, 39, 294, 235, 244, 110, 200, 140, 80, 399, 147, 320, 253, 327, 258,
+ 53, 399, 14, 236, 220, 207, 154, 113, 65, 108, 319, 159, 238, 311, 98, 471, 471,
+ 330, 237, 279, 471, 210, 325, 245, 299, 310, 86, 308, 143, 268, 263, 259, 260, 269,
+ 177, 204, 287, 136, 242, 10, 150, 87, 255, 320, 139, 5, 83, 293, 12, 22, 195, 116,
+ 292, 247, 258, 217, 153, 295, 221, 220, 207, 36, 126, 50, 104, 109, 112, 88, 26,
+ 98, 246, 397, 330, 237, 85, 212, 210, 325, 245, 258, 310, 102, 299, 299, 220, 207,
+ 397, 113, 65, 108, 320, 299, 134, 397, 98, 222, 442, 330, 237, 299, 299, 210, 325,
+ 245, 258, 310, 299, 299, 442, 220, 207, 299, 126, 69, 108, 299, 288, 31, 299, 98,
+ 299, 299, 330, 237, 299, 299, 210, 325, 245, 80, 310, 299, 320, 299, 258, 299, 299,
+ 209, 299, 220, 207, 299, 126, 69, 108, 206, 299, 299, 455, 98, 299, 206, 330, 237,
+ 455, 365, 210, 325, 245, 299, 310, 355, 227, 258, 299, 299, 299, 199, 220, 207, 36,
+ 126, 64, 104, 299, 214, 36, 26, 98, 299, 442, 330, 237, 26, 299, 210, 325, 245,
+ 258, 310, 471, 471, 442, 220, 207, 471, 126, 69, 108, 293, 12, 299, 299, 98, 292,
+ 299, 330, 237, 299, 299, 210, 325, 245, 36, 310, 163, 299, 258, 299, 299, 26, 202,
+ 220, 207, 299, 126, 44, 108, 471, 299, 299, 299, 98, 299, 299, 330, 237, 299, 299,
+ 210, 325, 245, 299, 310, 299, 299, 258, 134, 299, 299, 252, 220, 207, 206, 126, 72,
+ 108, 299, 299, 299, 299, 98, 299, 396, 330, 237, 299, 299, 210, 325, 245, 258, 310,
+ 299, 299, 299, 220, 207, 396, 126, 74, 108, 254, 299, 80, 396, 98, 320, 299, 330,
+ 237, 299, 297, 210, 325, 245, 299, 310, 299, 242, 9, 299, 299, 255, 299, 258, 5,
+ 83, 299, 299, 220, 207, 116, 126, 68, 108, 217, 299, 295, 221, 98, 299, 299, 330,
+ 237, 299, 299, 210, 325, 245, 299, 310, 299, 258, 299, 299, 299, 299, 220, 207,
+ 299, 100, 70, 108, 299, 303, 29, 299, 98, 299, 299, 330, 237, 299, 297, 210, 325,
+ 245, 299, 310, 299, 242, 9, 299, 299, 255, 299, 299, 5, 83, 299, 299, 299, 299,
+ 116, 299, 299, 258, 217, 299, 295, 221, 220, 207, 299, 126, 66, 108, 299, 299, 299,
+ 299, 98, 293, 12, 330, 237, 299, 292, 210, 325, 245, 299, 310, 258, 299, 299, 305,
+ 29, 220, 207, 299, 126, 60, 108, 299, 293, 12, 299, 98, 299, 292, 330, 237, 299,
+ 299, 210, 325, 245, 299, 310, 232, 299, 258, 299, 206, 299, 299, 220, 207, 299,
+ 126, 49, 108, 299, 299, 299, 299, 98, 299, 299, 330, 237, 299, 230, 210, 325, 245,
+ 299, 310, 258, 167, 299, 299, 299, 220, 207, 299, 126, 58, 108, 299, 41, 40, 37,
+ 98, 299, 299, 330, 237, 299, 299, 210, 325, 245, 299, 310, 258, 299, 256, 275, 282,
+ 220, 97, 299, 81, 45, 106, 299, 299, 299, 299, 98, 299, 299, 330, 237, 299, 299,
+ 210, 325, 245, 299, 310, 299, 299, 258, 299, 206, 299, 299, 220, 207, 299, 126, 63,
+ 108, 299, 186, 299, 299, 98, 299, 299, 330, 237, 299, 299, 210, 325, 245, 299, 310,
+ 258, 299, 299, 299, 299, 220, 197, 299, 114, 59, 108, 299, 41, 40, 37, 98, 299,
+ 299, 330, 237, 299, 299, 210, 325, 245, 299, 310, 258, 299, 256, 275, 282, 220,
+ 207, 299, 126, 55, 108, 299, 299, 299, 299, 98, 299, 299, 330, 237, 299, 299, 210,
+ 325, 245, 299, 310, 299, 299, 258, 299, 206, 299, 299, 220, 207, 299, 126, 57, 108,
+ 299, 41, 40, 37, 98, 299, 299, 330, 237, 299, 299, 210, 325, 245, 299, 310, 258,
+ 299, 256, 275, 282, 220, 95, 299, 81, 48, 106, 233, 41, 40, 37, 98, 299, 299, 330,
+ 237, 299, 299, 210, 325, 245, 299, 310, 258, 299, 256, 275, 282, 220, 207, 299,
+ 126, 78, 108, 299, 299, 299, 299, 98, 299, 299, 330, 237, 299, 299, 210, 325, 245,
+ 299, 310, 299, 299, 258, 299, 206, 18, 299, 220, 207, 299, 96, 61, 108, 299, 299,
+ 299, 299, 98, 299, 299, 330, 237, 299, 299, 210, 325, 245, 299, 310, 258, 299, 299,
+ 299, 299, 220, 207, 299, 126, 47, 108, 299, 41, 40, 37, 98, 299, 299, 330, 237,
+ 299, 299, 210, 325, 245, 299, 310, 258, 299, 256, 275, 282, 220, 207, 299, 126, 75,
+ 108, 299, 299, 299, 299, 98, 299, 299, 330, 237, 299, 299, 210, 325, 245, 299, 310,
+ 299, 299, 258, 299, 206, 299, 299, 220, 207, 299, 126, 64, 108, 299, 299, 299, 299,
+ 98, 299, 299, 330, 237, 299, 299, 210, 325, 245, 299, 310, 258, 299, 299, 299, 299,
+ 220, 207, 299, 126, 56, 108, 317, 41, 40, 37, 98, 299, 299, 330, 237, 299, 299,
+ 210, 325, 245, 299, 310, 258, 299, 256, 275, 282, 220, 207, 299, 115, 46, 108, 299,
+ 299, 299, 299, 98, 299, 299, 330, 237, 299, 299, 210, 325, 245, 299, 310, 299, 299,
+ 258, 299, 206, 299, 299, 220, 207, 299, 126, 79, 108, 299, 190, 299, 299, 98, 299,
+ 299, 330, 237, 299, 299, 210, 325, 245, 299, 310, 258, 299, 299, 299, 299, 220,
+ 207, 299, 126, 62, 108, 299, 41, 40, 37, 98, 299, 299, 330, 237, 299, 299, 210,
+ 325, 245, 299, 310, 258, 299, 256, 275, 282, 220, 207, 299, 126, 71, 108, 299, 299,
+ 299, 299, 98, 299, 299, 330, 237, 299, 299, 210, 325, 245, 299, 310, 299, 299, 258,
+ 299, 206, 299, 299, 220, 207, 299, 101, 67, 108, 299, 318, 299, 299, 98, 299, 299,
+ 330, 237, 299, 299, 210, 325, 245, 299, 310, 258, 299, 299, 299, 299, 220, 207,
+ 299, 126, 77, 108, 299, 41, 40, 37, 98, 299, 299, 330, 237, 299, 299, 210, 325,
+ 245, 299, 310, 258, 299, 256, 275, 282, 220, 196, 299, 126, 54, 108, 299, 299, 299,
+ 299, 98, 299, 299, 330, 237, 299, 299, 210, 325, 245, 299, 310, 299, 299, 258, 299,
+ 206, 299, 299, 220, 207, 299, 126, 73, 108, 299, 274, 299, 299, 98, 299, 299, 330,
+ 237, 299, 299, 210, 325, 245, 299, 310, 258, 299, 299, 299, 299, 220, 224, 299,
+ 118, 299, 108, 299, 41, 40, 37, 98, 299, 299, 299, 261, 299, 299, 210, 325, 245,
+ 299, 310, 258, 299, 256, 275, 282, 220, 224, 299, 128, 299, 108, 299, 299, 299,
+ 299, 98, 299, 299, 229, 315, 206, 299, 210, 325, 245, 299, 310, 299, 471, 471, 307,
+ 27, 299, 471, 455, 526, 51, 265, 266, 267, 211, 299, 299, 220, 299, 36, 299, 409,
+ 409, 299, 299, 299, 26, 299, 299, 299, 299, 41, 40, 37, 206, 299, 455, 299, 455,
+ 299, 471, 299, 455, 299, 299, 299, 299, 299, 256, 275, 282, 229, 299, 299, 117,
+ 299, 442, 299, 409, 409, 409, 471, 471, 299, 299, 299, 471, 455, 442, 299, 299, 41,
+ 40, 37, 299, 409, 409, 409, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 256,
+ 275, 282, 299, 299, 299, 299, 455, 299, 455, 258, 471, 299, 455, 281, 220, 224,
+ 299, 127, 299, 108, 299, 299, 299, 299, 98, 299, 299, 299, 299, 299, 299, 210, 325,
+ 245, 258, 310, 206, 156, 299, 220, 224, 175, 121, 299, 108, 299, 299, 331, 299, 98,
+ 23, 278, 299, 299, 299, 299, 210, 325, 245, 34, 310, 36, 299, 299, 187, 299, 299,
+ 299, 26, 299, 299, 258, 299, 41, 40, 37, 220, 224, 299, 125, 299, 108, 299, 299,
+ 299, 299, 98, 299, 299, 229, 256, 275, 282, 210, 325, 245, 299, 310, 299, 471, 471,
+ 258, 31, 299, 471, 455, 220, 224, 299, 124, 299, 108, 299, 299, 299, 299, 98, 299,
+ 299, 299, 299, 299, 299, 210, 325, 245, 258, 310, 206, 299, 299, 220, 224, 455,
+ 119, 455, 108, 471, 299, 455, 299, 98, 299, 299, 229, 299, 299, 24, 210, 325, 245,
+ 299, 310, 299, 471, 471, 299, 471, 471, 471, 455, 299, 471, 455, 206, 41, 40, 37,
+ 299, 299, 299, 471, 471, 299, 299, 299, 471, 455, 299, 299, 276, 299, 256, 275,
+ 282, 299, 299, 299, 455, 36, 455, 455, 471, 455, 455, 471, 26, 455, 299, 206, 403,
+ 41, 40, 37, 206, 455, 299, 455, 299, 471, 403, 455, 403, 299, 299, 403, 299, 299,
+ 256, 275, 282, 299, 403, 299, 403, 299, 403, 299, 299, 299, 299, 299, 299, 299,
+ 299, 223, 41, 40, 37, 299, 299, 41, 40, 37, 299, 299, 299, 299, 299, 299, 299, 299,
+ 173, 256, 275, 282, 175, 314, 256, 275, 282, 299, 331, 166, 299, 23, 278, 175, 162,
+ 299, 299, 299, 175, 331, 299, 299, 23, 278, 331, 187, 299, 23, 278, 158, 299, 299,
+ 299, 175, 299, 299, 187, 299, 299, 331, 165, 187, 23, 278, 175, 299, 299, 299, 299,
+ 299, 331, 299, 299, 23, 278, 299, 187, 299, 299, 299, 299, 299, 299, 299, 299, 299,
+ 299, 187,);
+
+ static public $yy_lookahead = array(12, 13, 14, 80, 16, 17, 71, 19, 20, 12, 13, 71, 91, 25, 17, 75, 81, 29, 30, 31,
+ 32, 81, 34, 26, 36, 28, 15, 39, 93, 18, 33, 43, 44, 45, 46, 47, 28, 49, 98, 51,
+ 52, 70, 54, 1, 36, 74, 58, 12, 13, 14, 79, 16, 17, 11, 19, 20, 48, 86, 64, 48,
+ 25, 90, 75, 69, 29, 26, 31, 32, 26, 34, 46, 36, 33, 71, 39, 33, 52, 75, 43, 44,
+ 45, 46, 47, 81, 49, 98, 51, 52, 53, 54, 35, 22, 37, 58, 12, 13, 14, 103, 16, 17,
+ 98, 19, 20, 63, 64, 65, 66, 25, 11, 69, 41, 29, 64, 31, 32, 1, 34, 69, 36, 22,
+ 22, 39, 53, 26, 95, 43, 44, 45, 46, 47, 33, 49, 1, 51, 52, 35, 54, 37, 41, 41,
+ 58, 12, 13, 14, 14, 16, 17, 46, 19, 20, 102, 103, 71, 52, 25, 11, 75, 26, 29,
+ 36, 31, 32, 81, 34, 33, 36, 22, 17, 39, 14, 26, 48, 43, 44, 45, 46, 47, 33, 49,
+ 98, 51, 52, 70, 54, 54, 41, 74, 58, 12, 13, 14, 79, 16, 17, 75, 19, 20, 8, 9,
+ 10, 50, 25, 90, 84, 85, 29, 13, 31, 32, 54, 34, 46, 36, 22, 36, 39, 14, 98, 53,
+ 43, 44, 45, 46, 47, 46, 49, 48, 51, 52, 36, 54, 53, 41, 21, 58, 12, 13, 14, 36,
+ 16, 17, 75, 19, 20, 12, 13, 15, 35, 25, 17, 59, 18, 29, 22, 31, 32, 54, 34, 74,
+ 36, 76, 77, 39, 79, 98, 99, 43, 44, 45, 46, 47, 74, 49, 76, 51, 52, 79, 54, 35,
+ 46, 37, 58, 12, 13, 14, 52, 16, 17, 71, 19, 20, 36, 74, 15, 76, 25, 18, 79, 81,
+ 29, 35, 31, 32, 48, 34, 92, 36, 94, 95, 39, 93, 36, 15, 43, 44, 45, 46, 47, 53,
+ 49, 26, 51, 52, 48, 54, 89, 48, 33, 58, 12, 13, 14, 96, 16, 17, 71, 19, 20, 14,
+ 98, 71, 17, 25, 46, 71, 81, 29, 75, 31, 32, 81, 34, 1, 36, 81, 71, 39, 93, 1, 2,
+ 43, 44, 45, 46, 47, 81, 49, 98, 51, 52, 98, 54, 91, 1, 93, 58, 12, 13, 14, 28,
+ 16, 17, 98, 19, 20, 1, 91, 71, 93, 25, 18, 71, 1, 29, 80, 31, 32, 81, 34, 99,
+ 36, 81, 11, 39, 94, 95, 2, 43, 44, 45, 46, 47, 89, 49, 65, 51, 52, 68, 54, 96,
+ 80, 79, 58, 12, 13, 14, 36, 16, 17, 71, 19, 20, 94, 95, 71, 18, 25, 53, 96, 81,
+ 29, 75, 31, 32, 81, 34, 18, 36, 74, 15, 39, 93, 91, 79, 43, 44, 45, 46, 47, 17,
+ 49, 17, 51, 52, 98, 54, 17, 46, 36, 58, 12, 13, 14, 51, 16, 17, 48, 19, 20, 17,
+ 34, 17, 42, 25, 17, 1, 34, 29, 22, 31, 32, 23, 34, 37, 36, 11, 17, 39, 5, 17,
+ 17, 43, 44, 45, 46, 47, 17, 49, 51, 51, 26, 27, 54, 11, 53, 64, 58, 33, 13, 14,
+ 69, 70, 17, 72, 73, 74, 53, 91, 81, 92, 79, 12, 13, 82, 83, 9, 17, 86, 87, 88,
+ 104, 90, 79, 93, 91, 3, 4, 5, 6, 7, 8, 100, 101, 79, 12, 13, 91, 79, 16, 54, 91,
+ 19, 20, 12, 13, 13, 14, 25, 17, 17, 64, 29, 91, 31, 32, 69, 70, 26, 72, 73, 74,
+ 78, 76, 79, 33, 79, 34, 11, 82, 83, 79, 15, 86, 87, 88, 64, 90, 67, 104, 104,
+ 69, 70, 26, 72, 73, 74, 54, 104, 14, 33, 79, 17, 36, 82, 83, 104, 104, 86, 87,
+ 88, 64, 90, 104, 104, 48, 69, 70, 104, 72, 73, 74, 104, 101, 15, 104, 79, 104,
+ 104, 82, 83, 104, 104, 86, 87, 88, 51, 90, 104, 54, 104, 64, 104, 104, 97, 104,
+ 69, 70, 104, 72, 73, 74, 1, 104, 104, 46, 79, 104, 1, 82, 83, 52, 11, 86, 87,
+ 88, 104, 90, 11, 18, 64, 104, 104, 104, 97, 69, 70, 26, 72, 73, 74, 104, 76, 26,
+ 33, 79, 104, 36, 82, 83, 33, 104, 86, 87, 88, 64, 90, 12, 13, 48, 69, 70, 17,
+ 72, 73, 74, 12, 13, 104, 104, 79, 17, 104, 82, 83, 104, 104, 86, 87, 88, 26, 90,
+ 28, 104, 64, 104, 104, 33, 97, 69, 70, 104, 72, 73, 74, 50, 104, 104, 104, 79,
+ 104, 104, 82, 83, 104, 104, 86, 87, 88, 104, 90, 104, 104, 64, 14, 104, 104, 17,
+ 69, 70, 1, 72, 73, 74, 104, 104, 104, 104, 79, 104, 11, 82, 83, 104, 104, 86,
+ 87, 88, 64, 90, 104, 104, 104, 69, 70, 26, 72, 73, 74, 49, 104, 51, 33, 79, 54,
+ 104, 82, 83, 104, 5, 86, 87, 88, 104, 90, 104, 12, 13, 14, 104, 16, 104, 64, 19,
+ 20, 104, 104, 69, 70, 25, 72, 73, 74, 29, 104, 31, 32, 79, 104, 104, 82, 83,
+ 104, 104, 86, 87, 88, 104, 90, 104, 64, 104, 104, 104, 104, 69, 70, 104, 72, 73,
+ 74, 104, 58, 59, 104, 79, 104, 104, 82, 83, 104, 5, 86, 87, 88, 104, 90, 104,
+ 12, 13, 14, 104, 16, 104, 104, 19, 20, 104, 104, 104, 104, 25, 104, 104, 64, 29,
+ 104, 31, 32, 69, 70, 104, 72, 73, 74, 104, 104, 104, 104, 79, 12, 13, 82, 83,
+ 104, 17, 86, 87, 88, 104, 90, 64, 104, 104, 58, 59, 69, 70, 104, 72, 73, 74,
+ 104, 12, 13, 104, 79, 104, 17, 82, 83, 104, 104, 86, 87, 88, 104, 90, 50, 104,
+ 64, 104, 1, 104, 104, 69, 70, 104, 72, 73, 74, 104, 104, 104, 104, 79, 104, 104,
+ 82, 83, 104, 50, 86, 87, 88, 104, 90, 64, 27, 104, 104, 104, 69, 70, 104, 72,
+ 73, 74, 104, 38, 39, 40, 79, 104, 104, 82, 83, 104, 104, 86, 87, 88, 104, 90,
+ 64, 104, 55, 56, 57, 69, 70, 104, 72, 73, 74, 104, 104, 104, 104, 79, 104, 104,
+ 82, 83, 104, 104, 86, 87, 88, 104, 90, 104, 104, 64, 104, 1, 104, 104, 69, 70,
+ 104, 72, 73, 74, 104, 11, 104, 104, 79, 104, 104, 82, 83, 104, 104, 86, 87, 88,
+ 104, 90, 64, 104, 104, 104, 104, 69, 70, 104, 72, 73, 74, 104, 38, 39, 40, 79,
+ 104, 104, 82, 83, 104, 104, 86, 87, 88, 104, 90, 64, 104, 55, 56, 57, 69, 70,
+ 104, 72, 73, 74, 104, 104, 104, 104, 79, 104, 104, 82, 83, 104, 104, 86, 87, 88,
+ 104, 90, 104, 104, 64, 104, 1, 104, 104, 69, 70, 104, 72, 73, 74, 104, 38, 39,
40, 79, 104, 104, 82, 83, 104, 104, 86, 87, 88, 104, 90, 64, 104, 55, 56, 57,
- 69, 70, 104, 104, 73, 74, 75, 104, 104, 104, 79, 104, 104, 82, 83, 104, 104, 86,
- 87, 88, 104, 90, 104, 104, 64, 104, 1, 104, 104, 69, 70, 104, 104, 73, 74, 75,
- 11, 104, 104, 79, 104, 104, 82, 83, 104, 104, 86, 87, 88, 104, 90, 64, 104, 104,
- 104, 104, 69, 70, 104, 104, 73, 74, 75, 38, 39, 40, 79, 104, 104, 82, 83, 104,
- 104, 86, 87, 88, 104, 90, 64, 104, 55, 56, 57, 69, 70, 104, 104, 73, 74, 75,
- 104, 104, 104, 79, 104, 104, 82, 83, 104, 104, 86, 87, 88, 104, 90, 104, 104,
- 64, 104, 1, 104, 104, 69, 70, 104, 104, 73, 74, 75, 104, 104, 104, 79, 104, 104,
- 82, 83, 104, 104, 86, 87, 88, 104, 90, 64, 104, 104, 104, 104, 69, 70, 104, 104,
- 73, 74, 75, 38, 39, 40, 79, 104, 104, 82, 83, 104, 104, 86, 87, 88, 104, 90, 64,
- 104, 55, 56, 57, 69, 70, 104, 104, 73, 74, 75, 104, 104, 104, 79, 104, 104, 82,
- 83, 104, 104, 86, 87, 88, 104, 90, 104, 104, 64, 104, 104, 104, 104, 69, 70,
- 104, 104, 73, 74, 75, 104, 104, 104, 79, 104, 104, 82, 83, 104, 104, 86, 87, 88,
- 104, 90, 64, 104, 104, 104, 104, 69, 70, 104, 104, 73, 74, 75, 104, 104, 104,
- 79, 104, 104, 82, 83, 1, 104, 86, 87, 88, 104, 90, 64, 104, 104, 11, 104, 69,
- 70, 104, 104, 73, 104, 75, 104, 104, 22, 79, 104, 104, 26, 83, 104, 104, 86, 87,
- 88, 33, 90, 104, 104, 64, 104, 104, 104, 41, 69, 70, 104, 104, 73, 104, 75, 104,
- 104, 104, 79, 104, 104, 2, 83, 104, 104, 86, 87, 88, 104, 90, 2, 12, 13, 104,
- 104, 104, 17, 18, 104, 104, 12, 13, 104, 15, 104, 17, 18, 1, 2, 104, 104, 104,
- 104, 12, 13, 104, 1, 104, 17, 18, 104, 104, 104, 104, 104, 46, 11, 48, 104, 50,
- 104, 52, 53, 1, 46, 104, 48, 22, 50, 104, 52, 26, 36, 11, 38, 39, 40, 46, 33,
- 48, 104, 50, 104, 52, 48, 104, 41, 104, 26, 104, 104, 55, 56, 57, 104, 33, 104,
- 104, 64, 104, 38, 39, 40, 69, 70, 104, 104, 73, 104, 75, 104, 104, 104, 79, 104,
- 104, 104, 55, 56, 57, 86, 87, 88, 104, 90, 104, 104, 64, 104, 104, 2, 104, 69,
- 70, 104, 104, 73, 104, 75, 104, 12, 13, 79, 15, 104, 17, 18, 104, 104, 86, 87,
- 88, 104, 90, 61, 62, 63, 64, 65, 66, 64, 104, 69, 104, 104, 69, 70, 1, 104, 73,
- 104, 75, 104, 104, 46, 79, 48, 1, 50, 104, 52, 104, 86, 87, 88, 64, 90, 1, 104,
- 104, 69, 70, 26, 104, 73, 104, 75, 104, 104, 33, 79, 104, 104, 104, 38, 39, 40,
- 86, 87, 88, 24, 90, 26, 37, 38, 39, 40, 104, 104, 33, 104, 55, 56, 57, 38, 39,
- 40, 104, 104, 104, 104, 55, 56, 57, 104, 104, 104, 104, 104, 64, 104, 55, 56,
- 57, 69, 70, 104, 104, 73, 104, 75, 104, 104, 104, 79, 104, 104, 2, 104, 104, 2,
- 86, 87, 88, 104, 90, 104, 12, 13, 104, 12, 13, 17, 18, 1, 17, 18, 104, 104, 104,
- 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104,
- 104, 104, 104, 104, 104, 46, 104, 48, 46, 50, 48, 52, 50, 1, 52, 38, 39, 40,
- 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 55, 56,
- 57, 104, 59, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 11, 104, 38,
- 39, 40, 1, 104, 104, 104, 104, 21, 104, 23, 104, 1, 26, 104, 53, 104, 55, 56,
- 57, 33, 104, 35, 104, 37, 104, 104, 104, 104, 104, 104, 104, 21, 46, 104, 104,
- 104, 104, 104, 37, 38, 39, 40, 104, 1, 104, 104, 104, 104, 38, 39, 40, 104, 104,
- 11, 104, 104, 55, 56, 57, 104, 18, 104, 104, 104, 104, 55, 56, 57, 26, 104, 104,
- 104, 104, 104, 104, 33, 104, 104, 36, 104, 104, 104, 104, 104, 104, 104, 104,
- 104, 104, 104, 48,);
-
- const YY_SHIFT_USE_DFLT = - 34;
-
- const YY_SHIFT_MAX = 242;
-
- static public $yy_shift_ofst = array(517, 270, 82, 270, 317, 82, 82, 317, - 12, - 12, 35, 411, 82, 82, 82, 129, 82,
- 82, 82, 176, 82, 82, 82, 82, 82, 82, 223, 82, 82, 82, 82, 82, 82, 82, 82, 82,
- 411, 364, 364, 458, 458, 458, 458, 458, 1830, 1706, 1810, 1810, 1810, 1810,
- 1810, 517, 733, 933, 2001, 1306, 1389, 1223, 1820, 1952, 526, 1917, 1992, 1140,
- 1057, 1472, 1472, 1472, 2033, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472,
- 1472, 1196, 1689, 1196, 1600, 533, 183, 512, 14, 954, - 3, 589, 634, 634, 684,
- 684, 512, 512, 368, 14, 14, 512, 513, 484, 104, 746, 518, 252, 67, 232, 91,
- 232, 325, 3, 486, 307, 462, 433, 428, 349, 3, 5, 452, 462, 264, 327, 264, 264,
- 264, 264, 264, 327, 264, 264, - 34, 1772, 1653, 1662, 1902, 1899, 1675, 1113,
- 543, 105, 295, 3, 415, 69, 69, 3, 3, 313, 313, 3, 313, 3, 3, 3, 3, 3, 3, 283,
- 3, 415, 3, 3, 3, 3, 69, 313, 3, 3, 3, 313, 313, 313, 99, 313, 3, 3, 3, 69, 3,
- 498, 264, 264, 24, 497, 264, 327, 327, 327, 264, 24, 264, - 34, - 34, - 34,
- - 34, - 34, 1680, 1977, 678, 201, 652, 238, 97, 96, 357, 228, 382, 344, 308,
- 142, 57, 37, - 33, 360, 87, 167, 539, 545, 562, 507, 194, 172, 118, 397, 456,
- 402, 18, 299, 605, 556, 588, 552, 508, 481, 479, 398, 492, 534, 499, 522, 560,
- 498,);
-
- const YY_REDUCE_USE_DFLT = - 61;
-
- const YY_REDUCE_MAX = 196;
-
- static public $yy_reduce_ofst = array(1737, 488, 575, 633, 550, 658, 521, 604, 770, 1102, 1075, 1407, 1461, 1517,
- 1351, 1158, 1212, 1295, 1046, 716, 992, 936, 853, 963, 1019, 687, 1268, 1241,
- 1129, 1185, 1490, 1434, 1378, 1324, 799, 824, 741, 1544, 1573, 1819, 1678,
- 1740, 1707, 1765, 923, - 28, 571, - 28, 19, 918, 959, 134, 80, 83, - 26, - 26,
- - 26, - 26, - 26, - 26, - 26, - 26, - 26, - 26, - 26, - 26, - 26, - 26, 160,
- - 26, - 26, - 26, - 26, - 26, - 26, - 26, - 26, - 26, - 26, 222, - 26, 222,
- 92, 175, - 60, - 14, 288, 145, 199, 286, 254, 152, 246, 354, 401, 293, 358,
- 221, 340, 240, 190, 190, 279, 412, 190, 416, 395, 310, 279, 310, 472, 389,
- 310, 352, 260, 93, 190, 487, 190, 190, 355, 190, 310, 190, 190, 190, 515, 190,
- 424, 190, 190, 190, 530, 530, 530, 530, 530, 530, 551, 535, 530, 530, 531,
- 540, 574, 555, 531, 531, 524, 524, 531, 524, 531, 531, 531, 531, 531, 531,
- 549, 531, 544, 531, 531, 531, 531, 587, 524, 531, 531, 531, 524, 524, 524,
- 573, 524, 531, 531, 531, 580, 531, 579, 131, 131, 54, 30, 131, 311, 311, 311,
- 131, 54, 131, 294, 519, 489, 359, 506,);
+ 69, 70, 104, 72, 73, 74, 37, 38, 39, 40, 79, 104, 104, 82, 83, 104, 104, 86, 87,
+ 88, 104, 90, 64, 104, 55, 56, 57, 69, 70, 104, 72, 73, 74, 104, 104, 104, 104,
+ 79, 104, 104, 82, 83, 104, 104, 86, 87, 88, 104, 90, 104, 104, 64, 104, 1, 2,
+ 104, 69, 70, 104, 72, 73, 74, 104, 104, 104, 104, 79, 104, 104, 82, 83, 104,
+ 104, 86, 87, 88, 104, 90, 64, 104, 104, 104, 104, 69, 70, 104, 72, 73, 74, 104,
+ 38, 39, 40, 79, 104, 104, 82, 83, 104, 104, 86, 87, 88, 104, 90, 64, 104, 55,
+ 56, 57, 69, 70, 104, 72, 73, 74, 104, 104, 104, 104, 79, 104, 104, 82, 83, 104,
+ 104, 86, 87, 88, 104, 90, 104, 104, 64, 104, 1, 104, 104, 69, 70, 104, 72, 73,
+ 74, 104, 104, 104, 104, 79, 104, 104, 82, 83, 104, 104, 86, 87, 88, 104, 90, 64,
+ 104, 104, 104, 104, 69, 70, 104, 72, 73, 74, 37, 38, 39, 40, 79, 104, 104, 82,
+ 83, 104, 104, 86, 87, 88, 104, 90, 64, 104, 55, 56, 57, 69, 70, 104, 72, 73, 74,
+ 104, 104, 104, 104, 79, 104, 104, 82, 83, 104, 104, 86, 87, 88, 104, 90, 104,
+ 104, 64, 104, 1, 104, 104, 69, 70, 104, 72, 73, 74, 104, 11, 104, 104, 79, 104,
+ 104, 82, 83, 104, 104, 86, 87, 88, 104, 90, 64, 104, 104, 104, 104, 69, 70, 104,
+ 72, 73, 74, 104, 38, 39, 40, 79, 104, 104, 82, 83, 104, 104, 86, 87, 88, 104,
+ 90, 64, 104, 55, 56, 57, 69, 70, 104, 72, 73, 74, 104, 104, 104, 104, 79, 104,
+ 104, 82, 83, 104, 104, 86, 87, 88, 104, 90, 104, 104, 64, 104, 1, 104, 104, 69,
+ 70, 104, 72, 73, 74, 104, 11, 104, 104, 79, 104, 104, 82, 83, 104, 104, 86, 87,
+ 88, 104, 90, 64, 104, 104, 104, 104, 69, 70, 104, 72, 73, 74, 104, 38, 39, 40,
+ 79, 104, 104, 82, 83, 104, 104, 86, 87, 88, 104, 90, 64, 104, 55, 56, 57, 69,
+ 70, 104, 72, 73, 74, 104, 104, 104, 104, 79, 104, 104, 82, 83, 104, 104, 86, 87,
+ 88, 104, 90, 104, 104, 64, 104, 1, 104, 104, 69, 70, 104, 72, 73, 74, 104, 11,
+ 104, 104, 79, 104, 104, 82, 83, 104, 104, 86, 87, 88, 104, 90, 64, 104, 104,
+ 104, 104, 69, 70, 104, 72, 104, 74, 104, 38, 39, 40, 79, 104, 104, 104, 83, 104,
+ 104, 86, 87, 88, 104, 90, 64, 104, 55, 56, 57, 69, 70, 104, 72, 104, 74, 104,
+ 104, 104, 104, 79, 104, 104, 2, 83, 1, 104, 86, 87, 88, 104, 90, 104, 12, 13,
+ 11, 15, 104, 17, 18, 61, 62, 63, 64, 65, 66, 104, 104, 69, 104, 26, 104, 1, 2,
+ 104, 104, 104, 33, 104, 104, 104, 104, 38, 39, 40, 1, 104, 46, 104, 48, 104, 50,
+ 104, 52, 104, 104, 104, 104, 104, 55, 56, 57, 2, 104, 104, 21, 104, 36, 104, 38,
+ 39, 40, 12, 13, 104, 104, 104, 17, 18, 48, 104, 104, 38, 39, 40, 104, 55, 56,
+ 57, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 55, 56, 57, 104, 104, 104,
+ 104, 46, 104, 48, 64, 50, 104, 52, 53, 69, 70, 104, 72, 104, 74, 104, 104, 104,
+ 104, 79, 104, 104, 104, 104, 104, 104, 86, 87, 88, 64, 90, 1, 71, 104, 69, 70,
+ 75, 72, 104, 74, 104, 104, 81, 104, 79, 84, 85, 104, 104, 104, 104, 86, 87, 88,
+ 24, 90, 26, 104, 104, 98, 104, 104, 104, 33, 104, 104, 64, 104, 38, 39, 40, 69,
+ 70, 104, 72, 104, 74, 104, 104, 104, 104, 79, 104, 104, 2, 55, 56, 57, 86, 87,
+ 88, 104, 90, 104, 12, 13, 64, 15, 104, 17, 18, 69, 70, 104, 72, 104, 74, 104,
+ 104, 104, 104, 79, 104, 104, 104, 104, 104, 104, 86, 87, 88, 64, 90, 1, 104,
+ 104, 69, 70, 46, 72, 48, 74, 50, 104, 52, 104, 79, 104, 104, 2, 104, 104, 2, 86,
+ 87, 88, 104, 90, 104, 12, 13, 104, 12, 13, 17, 18, 104, 17, 18, 1, 38, 39, 40,
+ 104, 104, 104, 12, 13, 104, 104, 104, 17, 18, 104, 104, 53, 104, 55, 56, 57,
+ 104, 104, 104, 46, 26, 48, 46, 50, 48, 52, 50, 33, 52, 104, 1, 11, 38, 39, 40,
+ 1, 46, 104, 48, 104, 50, 21, 52, 23, 104, 104, 26, 104, 104, 55, 56, 57, 104,
+ 33, 104, 35, 104, 37, 104, 104, 104, 104, 104, 104, 104, 104, 46, 38, 39, 40,
+ 104, 104, 38, 39, 40, 104, 104, 104, 104, 104, 104, 104, 104, 71, 55, 56, 57,
+ 75, 59, 55, 56, 57, 104, 81, 71, 104, 84, 85, 75, 71, 104, 104, 104, 75, 81,
+ 104, 104, 84, 85, 81, 98, 104, 84, 85, 71, 104, 104, 104, 75, 104, 104, 98, 104,
+ 104, 81, 71, 98, 84, 85, 75, 104, 104, 104, 104, 104, 81, 104, 104, 84, 85, 104,
+ 98, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 98,);
+
+ const YY_SHIFT_USE_DFLT = - 13;
+
+ const YY_SHIFT_MAX = 236;
+
+ static public $yy_shift_ofst = array(542, 364, 82, 82, 82, 411, 364, 411, 35, - 12, - 12, 82, 82, 82, 82, 82, 82,
+ 176, 82, 82, 129, 82, 82, 82, 317, 82, 82, 82, 82, 82, 82, 270, 82, 82, 82, 82,
+ 176, 223, 223, 458, 458, 458, 458, 458, 1734, 1603, 1862, 1862, 1862, 1862,
+ 1862, 542, 749, 803, 1897, 1448, 1531, 1199, 1643, 1826, 1365, 950, 1282, 1033,
+ 1116, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 660,
+ 1902, 1089, 1089, 594, 666, 131, 202, 865, - 3, 703, 551, 551, 233, 202, 202,
+ 131, 131, 357, 97, 484, 144, 920, 505, 42, 768, 189, 232, 11, 232, 278, 324,
+ 428, 39, 372, 324, 39, 351, 384, 391, 294, 155, 114, 114, 114, 114, 417, 417,
+ 114, 114, 114, 114, - 13, 1786, 1659, 1600, 1844, 1841, 1858, 552, 897, 519,
+ 618, 24, 101, 39, 101, 24, 39, 24, 39, 130, 39, 39, 24, 39, 24, 24, 193, 24,
+ 39, 39, 39, 24, 39, 39, 39, 130, 39, 39, 39, 130, 39, 130, 39, 231, 39, 39,
+ 114, 114, 114, 526, 404, 417, 404, 114, 417, 390, 114, 417, - 13, - 13, - 13,
+ - 13, - 13, 1630, 1888, 576, 178, 694, 191, 69, 8, 100, 275, 212, 243, 297,
+ 265, 255, 150, 98, 165, 55, 123, 493, 479, 468, 456, 434, 482, 483, 473, 461,
+ 502, 489, 457, 452, 466, 422, 421, 449, 442, 444, 462, 432, 467, 440, 464, 446,
+ 390,);
+
+ const YY_REDUCE_USE_DFLT = - 80;
+
+ const YY_REDUCE_MAX = 190;
+
+ static public $yy_reduce_ofst = array(1558, 451, 556, 640, 586, 506, 531, 615, 995, 939, 1078, 723, 1244, 968, 856,
+ 912, 1354, 1134, 1105, 1161, 1051, 1217, 1022, 1188, 1300, 1466, 1383, 1271,
+ 1327, 1437, 1410, 757, 698, 669, 885, 829, 785, 1493, 1520, 1761, 1706, 1669,
+ 1644, 1736, 1880, 1665, 1896, 1911, 1665, 1891, 1922, 40, - 29, 48, 119, 119,
+ 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119,
+ 119, 119, 119, 119, 119, 81, 119, 119, 119, 112, 2, - 60, 184, - 6, 264, 358,
+ - 65, 217, 213, 218, 197, 284, 269, 166, 363, - 13, 363, 295, 342, - 13, - 13,
+ 349, 281, 310, 295, 310, 323, 310, 316, 272, 236, 273, - 13, - 13, - 13, 320,
+ 374, - 13, - 13, 366, - 13, 338, 310, - 13, - 13, - 13, - 13, - 13, 465, 465,
+ 465, 465, 465, 465, 474, 450, 465, 465, 437, 469, 447, 453, 437, 447, 437,
+ 447, 463, 447, 447, 437, 447, 437, 437, 481, 437, 447, 447, 447, 437, 447,
+ 447, 447, 478, 447, 447, 447, 511, 447, 504, 447, 503, 447, 447, 241, 241,
+ 241, 530, 300, 29, 300, 241, 29, 361, 241, 29, - 79, - 77, 314, 340, 436,);
static public $yyExpectedTokens = array(array(3, 4, 5, 6, 7, 8, 12, 13, 16, 19, 20, 25, 29, 31, 32,),
array(12, 13, 14, 16, 17, 19, 20, 25, 29, 31, 32, 34, 36, 39, 43, 44, 45,
@@ -683,13 +674,13 @@ class Smarty_Internal_Templateparser
46, 47, 49, 51, 52, 54, 58,),
array(12, 13, 14, 16, 17, 19, 20, 25, 29, 31, 32, 34, 36, 39, 43, 44, 45,
46, 47, 49, 51, 52, 54, 58,),
+ array(12, 13, 14, 16, 17, 19, 20, 25, 29, 31, 32, 34, 36, 39, 43, 44, 45,
+ 46, 47, 49, 51, 52, 53, 54, 58,),
array(12, 13, 14, 16, 17, 19, 20, 25, 29, 30, 31, 32, 34, 36, 39, 43, 44,
45, 46, 47, 49, 51, 52, 54, 58,),
array(12, 13, 14, 16, 17, 19, 20, 25, 29, 30, 31, 32, 34, 36, 39, 43, 44,
45, 46, 47, 49, 51, 52, 54, 58,),
array(12, 13, 14, 16, 17, 19, 20, 25, 29, 31, 32, 34, 36, 39, 43, 44, 45,
- 46, 47, 49, 51, 52, 53, 54, 58,),
- array(12, 13, 14, 16, 17, 19, 20, 25, 29, 31, 32, 34, 36, 39, 43, 44, 45,
46, 47, 49, 51, 52, 54, 58,),
array(12, 13, 14, 16, 17, 19, 20, 25, 29, 31, 32, 34, 36, 39, 43, 44, 45,
46, 47, 49, 51, 52, 54, 58,),
@@ -765,70 +756,67 @@ class Smarty_Internal_Templateparser
array(3, 4, 5, 6, 7, 8, 12, 13, 16, 19, 20, 25, 29, 31, 32,),
array(14, 17, 49, 51, 54,),
array(5, 12, 13, 14, 16, 19, 20, 25, 29, 31, 32, 58, 59,),
- array(1, 21, 38, 39, 40, 55, 56, 57,),
+ array(1, 38, 39, 40, 55, 56, 57, 59,),
array(1, 11, 38, 39, 40, 55, 56, 57,),
+ array(1, 11, 38, 39, 40, 55, 56, 57,), array(1, 2, 38, 39, 40, 55, 56, 57,),
+ array(1, 21, 38, 39, 40, 55, 56, 57,),
+ array(1, 38, 39, 40, 53, 55, 56, 57,),
array(1, 11, 38, 39, 40, 55, 56, 57,),
array(1, 27, 38, 39, 40, 55, 56, 57,),
array(1, 37, 38, 39, 40, 55, 56, 57,),
- array(1, 38, 39, 40, 53, 55, 56, 57,), array(1, 2, 38, 39, 40, 55, 56, 57,),
- array(1, 38, 39, 40, 55, 56, 57, 59,),
- array(1, 37, 38, 39, 40, 55, 56, 57,),
array(1, 11, 38, 39, 40, 55, 56, 57,),
- array(1, 11, 38, 39, 40, 55, 56, 57,), array(1, 38, 39, 40, 55, 56, 57,),
+ array(1, 37, 38, 39, 40, 55, 56, 57,), array(1, 38, 39, 40, 55, 56, 57,),
array(1, 38, 39, 40, 55, 56, 57,), array(1, 38, 39, 40, 55, 56, 57,),
- array(1, 11, 18, 26, 33, 36, 48,), array(1, 38, 39, 40, 55, 56, 57,),
array(1, 38, 39, 40, 55, 56, 57,), array(1, 38, 39, 40, 55, 56, 57,),
array(1, 38, 39, 40, 55, 56, 57,), array(1, 38, 39, 40, 55, 56, 57,),
array(1, 38, 39, 40, 55, 56, 57,), array(1, 38, 39, 40, 55, 56, 57,),
array(1, 38, 39, 40, 55, 56, 57,), array(1, 38, 39, 40, 55, 56, 57,),
- array(38, 39, 40, 55, 56, 57,), array(1, 11, 22, 26, 33, 41,),
- array(38, 39, 40, 55, 56, 57,), array(1, 11, 22, 26, 33, 41,),
+ array(1, 11, 18, 26, 33, 36, 48,), array(1, 38, 39, 40, 55, 56, 57,),
+ array(38, 39, 40, 55, 56, 57,), array(38, 39, 40, 55, 56, 57,),
array(14, 17, 51, 54,), array(1, 11, 26, 33,), array(1, 26, 33,),
array(14, 36, 54,),
array(5, 12, 13, 14, 16, 19, 20, 25, 29, 31, 32, 58, 59,),
array(12, 13, 17, 26, 28, 33,), array(12, 13, 17, 26, 28, 33,),
- array(12, 13, 17, 26, 33,), array(12, 13, 17, 26, 33,),
- array(1, 11, 26, 33,), array(1, 11, 26, 33,), array(1, 26, 33,),
- array(1, 26, 33,), array(18, 46, 52,), array(14, 36, 54,),
- array(14, 36, 54,), array(1, 26, 33,), array(1, 2,),
- array(1, 11, 26, 27, 33,), array(1, 11, 26, 33,), array(12, 13, 17, 50,),
- array(13, 14, 17, 54,), array(1, 11, 26, 33,), array(8, 9, 10,),
- array(12, 13, 17,), array(15, 18, 48,), array(12, 13, 17,),
- array(15, 18, 48,), array(26, 33,), array(14, 54,), array(18, 48,),
- array(14, 17,), array(26, 33,), array(1, 18,), array(1, 53,),
- array(26, 33,), array(1, 11,), array(1, 28,), array(14, 17,), array(1,),
- array(18,), array(1,), array(1,), array(1,), array(1,), array(1,),
- array(18,), array(1,), array(1,), array(),
+ array(12, 13, 17, 26, 33,), array(12, 13, 17, 26, 33,), array(18, 46, 52,),
+ array(14, 36, 54,), array(14, 36, 54,), array(1, 26, 33,),
+ array(1, 26, 33,), array(1, 2,), array(11, 22, 26, 33, 41,),
+ array(1, 11, 26, 27, 33,), array(11, 22, 26, 33, 41,),
+ array(12, 13, 17, 50,), array(13, 14, 17, 54,), array(1, 11, 26, 33,),
+ array(1, 11, 26, 33,), array(8, 9, 10,), array(12, 13, 17,),
+ array(15, 18, 48,), array(12, 13, 17,), array(15, 18, 48,), array(14, 17,),
+ array(18, 48,), array(26, 33,), array(1, 18,), array(14, 17,),
+ array(26, 33,), array(1, 28,), array(1, 53,), array(1, 11,), array(26, 33,),
+ array(14, 54,), array(1,), array(1,), array(1,), array(1,), array(18,),
+ array(18,), array(1,), array(1,), array(1,), array(1,), array(),
array(2, 12, 13, 15, 17, 18, 46, 48, 50, 52,),
array(2, 12, 13, 17, 18, 46, 48, 50, 52, 53,),
array(2, 12, 13, 15, 17, 18, 46, 48, 50, 52,),
array(2, 12, 13, 17, 18, 46, 48, 50, 52,),
array(2, 12, 13, 17, 18, 46, 48, 50, 52,),
array(12, 13, 17, 18, 46, 48, 50, 52,), array(13, 14, 17, 34, 54,),
- array(12, 13, 17, 50,), array(15, 46, 52,), array(12, 13, 17,),
- array(26, 33,), array(46, 52,), array(14, 54,), array(14, 54,),
- array(26, 33,), array(26, 33,), array(46, 52,), array(46, 52,),
- array(26, 33,), array(46, 52,), array(26, 33,), array(26, 33,),
- array(26, 33,), array(26, 33,), array(26, 33,), array(26, 33,),
- array(15, 22,), array(26, 33,), array(46, 52,), array(26, 33,),
- array(26, 33,), array(26, 33,), array(26, 33,), array(14, 54,),
+ array(12, 13, 17, 50,), array(12, 13, 17,), array(15, 46, 52,),
+ array(46, 52,), array(46, 52,), array(26, 33,), array(46, 52,),
+ array(46, 52,), array(26, 33,), array(46, 52,), array(26, 33,),
+ array(14, 54,), array(26, 33,), array(26, 33,), array(46, 52,),
+ array(26, 33,), array(46, 52,), array(46, 52,), array(13, 36,),
array(46, 52,), array(26, 33,), array(26, 33,), array(26, 33,),
- array(46, 52,), array(46, 52,), array(46, 52,), array(13, 36,),
array(46, 52,), array(26, 33,), array(26, 33,), array(26, 33,),
- array(14, 54,), array(26, 33,), array(36,), array(1,), array(1,), array(2,),
- array(9,), array(1,), array(18,), array(18,), array(18,), array(1,),
- array(2,), array(1,), array(), array(), array(), array(), array(),
- array(1, 2, 36, 38, 39, 40, 48, 55, 56, 57,),
+ array(14, 54,), array(26, 33,), array(26, 33,), array(26, 33,),
+ array(14, 54,), array(26, 33,), array(14, 54,), array(26, 33,),
+ array(15, 22,), array(26, 33,), array(26, 33,), array(1,), array(1,),
+ array(1,), array(9,), array(2,), array(18,), array(2,), array(1,),
+ array(18,), array(36,), array(1,), array(18,), array(), array(), array(),
+ array(), array(), array(1, 2, 36, 38, 39, 40, 48, 55, 56, 57,),
array(11, 21, 23, 26, 33, 35, 37, 46,), array(11, 15, 26, 33, 36, 48,),
- array(12, 13, 17, 50,), array(36, 46, 48, 53,), array(22, 41, 53,),
- array(22, 41, 59,), array(28, 36, 48,), array(35, 37,), array(36, 48,),
- array(17, 50,), array(46, 53,), array(15, 46,), array(35, 37,),
- array(35, 53,), array(36, 48,), array(36, 48,), array(22, 41,),
- array(21, 35,), array(35, 37,), array(53,), array(53,), array(17,),
- array(36,), array(17,), array(34,), array(51,), array(22,), array(37,),
- array(15,), array(23,), array(11,), array(5,), array(17,), array(17,),
- array(17,), array(46,), array(17,), array(17,), array(51,), array(34,),
- array(17,), array(42,), array(17,), array(17,), array(36,), array(),
+ array(36, 46, 48, 53,), array(12, 13, 17, 50,), array(22, 41, 59,),
+ array(22, 41, 53,), array(28, 36, 48,), array(35, 37,), array(36, 48,),
+ array(21, 35,), array(35, 37,), array(15, 46,), array(35, 53,),
+ array(36, 48,), array(17, 50,), array(22, 41,), array(46, 53,),
+ array(35, 37,), array(36, 48,), array(5,), array(17,), array(23,),
+ array(37,), array(15,), array(17,), array(17,), array(53,), array(53,),
+ array(11,), array(17,), array(51,), array(34,), array(22,), array(51,),
+ array(46,), array(17,), array(17,), array(17,), array(17,), array(36,),
+ array(17,), array(42,), array(17,), array(34,), array(36,), array(),
array(), array(), array(), array(), array(), array(), array(), array(),
array(), array(), array(), array(), array(), array(), array(), array(),
array(), array(), array(), array(), array(), array(), array(), array(),
@@ -842,36 +830,35 @@ class Smarty_Internal_Templateparser
array(), array(), array(), array(), array(), array(), array(), array(),
array(), array(), array(), array(), array(), array(),);
- static public $yy_default = array(341, 518, 498, 533, 533, 498, 498, 533, 533, 533, 533, 533, 533, 533, 533, 533,
- 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533,
- 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 401, 533, 377, 401,
- 401, 401, 368, 338, 533, 533, 533, 533, 533, 406, 533, 533, 533, 533, 533, 533,
- 533, 520, 521, 422, 440, 382, 496, 406, 412, 497, 519, 408, 413, 403, 429, 430,
- 428, 430, 533, 415, 401, 533, 533, 401, 401, 401, 401, 447, 421, 401, 401, 510,
- 533, 533, 401, 391, 415, 415, 463, 533, 415, 533, 463, 453, 463, 453, 379, 533,
- 453, 533, 401, 395, 415, 401, 415, 415, 533, 425, 453, 415, 433, 431, 397, 418,
- 507, 432, 419, 505, 452, 452, 452, 452, 452, 452, 533, 465, 479, 463, 386, 456,
- 533, 533, 388, 387, 461, 457, 364, 459, 384, 360, 385, 361, 380, 378, 533, 363,
- 458, 365, 369, 381, 366, 533, 490, 376, 375, 372, 491, 460, 489, 463, 488, 370,
- 374, 390, 533, 389, 463, 421, 396, 499, 354, 398, 511, 508, 485, 392, 500, 447,
- 504, 504, 463, 504, 463, 440, 436, 440, 464, 440, 430, 430, 440, 533, 440, 533,
- 436, 436, 533, 533, 533, 448, 430, 533, 533, 533, 443, 533, 509, 533, 533, 533,
- 430, 533, 533, 409, 533, 346, 533, 533, 533, 436, 533, 533, 533, 438, 533, 442,
- 533, 533, 479, 451, 503, 394, 486, 383, 483, 400, 410, 481, 482, 402, 450, 502,
- 514, 513, 479, 501, 420, 427, 426, 339, 487, 480, 350, 351, 352, 353, 349, 347,
- 344, 345, 455, 348, 355, 356, 358, 399, 484, 371, 357, 340, 454, 342, 414, 343,
- 434, 531, 530, 466, 467, 468, 462, 417, 526, 441, 416, 528, 443, 444, 516, 517,
- 446, 515, 424, 423, 445, 495, 532, 525, 492, 475, 493, 393, 522, 477, 437, 494,
- 469, 506, 435, 442, 512, 523, 439, 470, 529, 473, 527, 476, 474, 478, 472, 524,
- 471, 449,);
+ static public $yy_default = array(335, 510, 490, 490, 490, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525,
+ 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525,
+ 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 393, 525, 360, 393,
+ 357, 393, 369, 332, 525, 525, 525, 525, 525, 525, 525, 525, 525, 398, 525, 525,
+ 525, 513, 405, 395, 404, 489, 398, 374, 400, 511, 488, 414, 432, 512, 421, 420,
+ 525, 407, 393, 525, 525, 393, 393, 393, 393, 502, 525, 525, 393, 393, 383, 422,
+ 407, 422, 455, 525, 407, 407, 525, 455, 445, 455, 445, 525, 445, 393, 387, 525,
+ 371, 407, 407, 407, 393, 525, 417, 425, 389, 410, 499, 445, 423, 411, 407, 424,
+ 497, 444, 444, 444, 444, 444, 444, 525, 457, 455, 471, 449, 448, 366, 450, 451,
+ 379, 453, 378, 525, 368, 367, 452, 364, 483, 480, 455, 481, 358, 380, 362, 482,
+ 373, 356, 361, 525, 382, 370, 377, 525, 372, 525, 354, 525, 381, 376, 439, 413,
+ 384, 348, 492, 477, 491, 388, 503, 455, 390, 500, 455, 496, 496, 496, 455, 432,
+ 428, 432, 432, 456, 422, 422, 432, 525, 440, 525, 525, 428, 525, 432, 525, 422,
+ 428, 525, 525, 340, 525, 401, 525, 525, 525, 525, 435, 525, 525, 525, 525, 430,
+ 422, 525, 428, 525, 525, 525, 525, 501, 525, 434, 525, 525, 471, 412, 391, 402,
+ 418, 375, 352, 394, 435, 436, 460, 459, 471, 479, 437, 419, 442, 351, 443, 363,
+ 504, 342, 438, 341, 343, 416, 441, 339, 334, 333, 336, 337, 338, 344, 468, 349,
+ 347, 350, 476, 505, 469, 406, 415, 345, 346, 466, 506, 486, 385, 487, 495, 508,
+ 509, 478, 426, 429, 474, 475, 427, 386, 507, 524, 523, 520, 518, 517, 493, 514,
+ 494, 515, 516, 522, 473, 446, 447, 454, 470, 485, 519, 498, 458, 434, 461, 464,
+ 472, 467, 484, 521, 431, 433, 465, 463, 409, 462, 408, 392,);
const YYNOCODE = 105;
const YYSTACKDEPTH = 500;
- const YYNSTATE = 338;
+ const YYNSTATE = 332;
- const YYNRULE = 195;
+ const YYNRULE = 193;
const YYERRORSYMBOL = 60;
@@ -915,8 +902,8 @@ class Smarty_Internal_Templateparser
'SINGLEQUOTESTRING', 'DOUBLECOLON', 'NAMESPACE', 'AT', 'HATCH', 'OPENB', 'CLOSEB',
'DOLLAR', 'LOGOP', 'TLOGOP', 'SINGLECOND', 'QUOTE', 'BACKTICK', 'error', 'start',
'template', 'template_element', 'smartytag', 'literal', 'text_content',
- 'literal_elements', 'literal_element', 'tag', 'variable', 'modifierlist', 'attributes',
- 'value', 'expr', 'varindexed', 'statement', 'statements', 'foraction', 'varvar',
+ 'literal_elements', 'literal_element', 'tag', 'variable', 'attributes', 'value', 'expr',
+ 'varindexed', 'modifierlist', 'statement', 'statements', 'foraction', 'varvar',
'modparameters', 'attribute', 'ternary', 'array', 'lop', 'scond', 'ns1', 'function',
'doublequoted_with_quotes', 'static_class_access', 'object', 'arrayindex', 'indexdef',
'varvarele', 'objectchain', 'objectelement', 'method', 'params', 'modifier',
@@ -934,12 +921,10 @@ class Smarty_Internal_Templateparser
'literal_elements ::= literal_elements literal_element', 'literal_elements ::=',
'literal_element ::= literal', 'literal_element ::= LITERAL',
'smartytag ::= tag RDEL', 'smartytag ::= SIMPELOUTPUT', 'tag ::= LDEL variable',
- 'tag ::= LDEL variable modifierlist attributes',
'tag ::= LDEL variable attributes', 'tag ::= LDEL value',
- 'tag ::= LDEL value modifierlist attributes', 'tag ::= LDEL value attributes',
- 'tag ::= LDEL expr modifierlist attributes', 'tag ::= LDEL expr attributes',
- 'tag ::= LDEL DOLLARID EQUAL value', 'tag ::= LDEL DOLLARID EQUAL expr',
- 'tag ::= LDEL DOLLARID EQUAL expr attributes',
+ 'tag ::= LDEL value attributes', 'tag ::= LDEL expr',
+ 'tag ::= LDEL expr attributes', 'tag ::= LDEL DOLLARID EQUAL value',
+ 'tag ::= LDEL DOLLARID EQUAL expr', 'tag ::= LDEL DOLLARID EQUAL expr attributes',
'tag ::= LDEL varindexed EQUAL expr attributes', 'smartytag ::= SIMPLETAG',
'tag ::= LDEL ID attributes', 'tag ::= LDEL ID',
'tag ::= LDEL ID modifierlist attributes', 'tag ::= LDEL ID PTR ID attributes',
@@ -1034,7 +1019,7 @@ class Smarty_Internal_Templateparser
return 'End of Input';
}
if ($tokenType > 0 && $tokenType < count($this->yyTokenName)) {
- return $this->yyTokenName[$tokenType];
+ return $this->yyTokenName[ $tokenType ];
} else {
return "Unknown";
}
@@ -1055,7 +1040,7 @@ class Smarty_Internal_Templateparser
}
$yytos = array_pop($this->yystack);
if ($this->yyTraceFILE && $this->yyidx >= 0) {
- fwrite($this->yyTraceFILE, $this->yyTracePrompt . 'Popping ' . $this->yyTokenName[$yytos->major] . "\n");
+ fwrite($this->yyTraceFILE, $this->yyTracePrompt . 'Popping ' . $this->yyTokenName[ $yytos->major ] . "\n");
}
$yymajor = $yytos->major;
self::yy_destructor($yymajor, $yytos->minor);
@@ -1078,14 +1063,14 @@ class Smarty_Internal_Templateparser
{
static $res3 = array();
static $res4 = array();
- $state = $this->yystack[$this->yyidx]->stateno;
- $expected = self::$yyExpectedTokens[$state];
- if (isset($res3[$state][$token])) {
- if ($res3[$state][$token]) {
+ $state = $this->yystack[ $this->yyidx ]->stateno;
+ $expected = self::$yyExpectedTokens[ $state ];
+ if (isset($res3[ $state ][ $token ])) {
+ if ($res3[ $state ][ $token ]) {
return $expected;
}
} else {
- if ($res3[$state][$token] = in_array($token, self::$yyExpectedTokens[$state], true)) {
+ if ($res3[ $state ][ $token ] = in_array($token, self::$yyExpectedTokens[ $state ], true)) {
return $expected;
}
}
@@ -1105,20 +1090,20 @@ class Smarty_Internal_Templateparser
return array_unique($expected);
}
$yyruleno = $yyact - self::YYNSTATE;
- $this->yyidx -= self::$yyRuleInfo[$yyruleno][1];
- $nextstate = $this->yy_find_reduce_action($this->yystack[$this->yyidx]->stateno,
- self::$yyRuleInfo[$yyruleno][0]);
- if (isset(self::$yyExpectedTokens[$nextstate])) {
- $expected = array_merge($expected, self::$yyExpectedTokens[$nextstate]);
- if (isset($res4[$nextstate][$token])) {
- if ($res4[$nextstate][$token]) {
+ $this->yyidx -= self::$yyRuleInfo[ $yyruleno ][ 1 ];
+ $nextstate = $this->yy_find_reduce_action($this->yystack[ $this->yyidx ]->stateno,
+ self::$yyRuleInfo[ $yyruleno ][ 0 ]);
+ if (isset(self::$yyExpectedTokens[ $nextstate ])) {
+ $expected = array_merge($expected, self::$yyExpectedTokens[ $nextstate ]);
+ if (isset($res4[ $nextstate ][ $token ])) {
+ if ($res4[ $nextstate ][ $token ]) {
$this->yyidx = $yyidx;
$this->yystack = $stack;
return array_unique($expected);
}
} else {
- if ($res4[$nextstate][$token] =
- in_array($token, self::$yyExpectedTokens[$nextstate], true)
+ if ($res4[ $nextstate ][ $token ] =
+ in_array($token, self::$yyExpectedTokens[ $nextstate ], true)
) {
$this->yyidx = $yyidx;
$this->yystack = $stack;
@@ -1131,8 +1116,8 @@ class Smarty_Internal_Templateparser
$this->yyidx ++;
$x = new TP_yyStackEntry;
$x->stateno = $nextstate;
- $x->major = self::$yyRuleInfo[$yyruleno][0];
- $this->yystack[$this->yyidx] = $x;
+ $x->major = self::$yyRuleInfo[ $yyruleno ][ 0 ];
+ $this->yystack[ $this->yyidx ] = $x;
continue 2;
} elseif ($nextstate == self::YYNSTATE + self::YYNRULE + 1) {
$this->yyidx = $yyidx;
@@ -1166,13 +1151,13 @@ class Smarty_Internal_Templateparser
if ($token === 0) {
return true; // 0 is not part of this
}
- $state = $this->yystack[$this->yyidx]->stateno;
- if (isset($res[$state][$token])) {
- if ($res[$state][$token]) {
+ $state = $this->yystack[ $this->yyidx ]->stateno;
+ if (isset($res[ $state ][ $token ])) {
+ if ($res[ $state ][ $token ]) {
return true;
}
} else {
- if ($res[$state][$token] = in_array($token, self::$yyExpectedTokens[$state], true)) {
+ if ($res[ $state ][ $token ] = in_array($token, self::$yyExpectedTokens[ $state ], true)) {
return true;
}
}
@@ -1192,18 +1177,18 @@ class Smarty_Internal_Templateparser
return true;
}
$yyruleno = $yyact - self::YYNSTATE;
- $this->yyidx -= self::$yyRuleInfo[$yyruleno][1];
- $nextstate = $this->yy_find_reduce_action($this->yystack[$this->yyidx]->stateno,
- self::$yyRuleInfo[$yyruleno][0]);
- if (isset($res2[$nextstate][$token])) {
- if ($res2[$nextstate][$token]) {
+ $this->yyidx -= self::$yyRuleInfo[ $yyruleno ][ 1 ];
+ $nextstate = $this->yy_find_reduce_action($this->yystack[ $this->yyidx ]->stateno,
+ self::$yyRuleInfo[ $yyruleno ][ 0 ]);
+ if (isset($res2[ $nextstate ][ $token ])) {
+ if ($res2[ $nextstate ][ $token ]) {
$this->yyidx = $yyidx;
$this->yystack = $stack;
return true;
}
} else {
- if ($res2[$nextstate][$token] = (isset(self::$yyExpectedTokens[$nextstate]) &&
- in_array($token, self::$yyExpectedTokens[$nextstate], true))
+ if ($res2[ $nextstate ][ $token ] = (isset(self::$yyExpectedTokens[ $nextstate ]) &&
+ in_array($token, self::$yyExpectedTokens[ $nextstate ], true))
) {
$this->yyidx = $yyidx;
$this->yystack = $stack;
@@ -1215,8 +1200,8 @@ class Smarty_Internal_Templateparser
$this->yyidx ++;
$x = new TP_yyStackEntry;
$x->stateno = $nextstate;
- $x->major = self::$yyRuleInfo[$yyruleno][0];
- $this->yystack[$this->yyidx] = $x;
+ $x->major = self::$yyRuleInfo[ $yyruleno ][ 0 ];
+ $this->yystack[ $this->yyidx ] = $x;
continue 2;
} elseif ($nextstate == self::YYNSTATE + self::YYNRULE + 1) {
$this->yyidx = $yyidx;
@@ -1249,37 +1234,37 @@ class Smarty_Internal_Templateparser
public function yy_find_shift_action($iLookAhead)
{
- $stateno = $this->yystack[$this->yyidx]->stateno;
+ $stateno = $this->yystack[ $this->yyidx ]->stateno;
/* if ($this->yyidx < 0) return self::YY_NO_ACTION; */
- if (!isset(self::$yy_shift_ofst[$stateno])) {
+ if (!isset(self::$yy_shift_ofst[ $stateno ])) {
// no shift actions
- return self::$yy_default[$stateno];
+ return self::$yy_default[ $stateno ];
}
- $i = self::$yy_shift_ofst[$stateno];
+ $i = self::$yy_shift_ofst[ $stateno ];
if ($i === self::YY_SHIFT_USE_DFLT) {
- return self::$yy_default[$stateno];
+ return self::$yy_default[ $stateno ];
}
if ($iLookAhead == self::YYNOCODE) {
return self::YY_NO_ACTION;
}
$i += $iLookAhead;
- if ($i < 0 || $i >= self::YY_SZ_ACTTAB || self::$yy_lookahead[$i] != $iLookAhead) {
+ if ($i < 0 || $i >= self::YY_SZ_ACTTAB || self::$yy_lookahead[ $i ] != $iLookAhead) {
if (count(self::$yyFallback) && $iLookAhead < count(self::$yyFallback) &&
- ($iFallback = self::$yyFallback[$iLookAhead]) != 0
+ ($iFallback = self::$yyFallback[ $iLookAhead ]) != 0
) {
if ($this->yyTraceFILE) {
fwrite($this->yyTraceFILE,
- $this->yyTracePrompt . "FALLBACK " . $this->yyTokenName[$iLookAhead] . " => " .
- $this->yyTokenName[$iFallback] . "\n");
+ $this->yyTracePrompt . "FALLBACK " . $this->yyTokenName[ $iLookAhead ] . " => " .
+ $this->yyTokenName[ $iFallback ] . "\n");
}
return $this->yy_find_shift_action($iFallback);
}
- return self::$yy_default[$stateno];
+ return self::$yy_default[ $stateno ];
} else {
- return self::$yy_action[$i];
+ return self::$yy_action[ $i ];
}
}
@@ -1287,21 +1272,21 @@ class Smarty_Internal_Templateparser
{
/* $stateno = $this->yystack[$this->yyidx]->stateno; */
- if (!isset(self::$yy_reduce_ofst[$stateno])) {
- return self::$yy_default[$stateno];
+ if (!isset(self::$yy_reduce_ofst[ $stateno ])) {
+ return self::$yy_default[ $stateno ];
}
- $i = self::$yy_reduce_ofst[$stateno];
+ $i = self::$yy_reduce_ofst[ $stateno ];
if ($i == self::YY_REDUCE_USE_DFLT) {
- return self::$yy_default[$stateno];
+ return self::$yy_default[ $stateno ];
}
if ($iLookAhead == self::YYNOCODE) {
return self::YY_NO_ACTION;
}
$i += $iLookAhead;
- if ($i < 0 || $i >= self::YY_SZ_ACTTAB || self::$yy_lookahead[$i] != $iLookAhead) {
- return self::$yy_default[$stateno];
+ if ($i < 0 || $i >= self::YY_SZ_ACTTAB || self::$yy_lookahead[ $i ] != $iLookAhead) {
+ return self::$yy_default[ $stateno ];
} else {
- return self::$yy_action[$i];
+ return self::$yy_action[ $i ];
}
}
@@ -1332,7 +1317,7 @@ class Smarty_Internal_Templateparser
fprintf($this->yyTraceFILE, "%sShift %d\n", $this->yyTracePrompt, $yyNewState);
fprintf($this->yyTraceFILE, "%sStack:", $this->yyTracePrompt);
for ($i = 1; $i <= $this->yyidx; $i ++) {
- fprintf($this->yyTraceFILE, " %s", $this->yyTokenName[$this->yystack[$i]->major]);
+ fprintf($this->yyTraceFILE, " %s", $this->yyTokenName[ $this->yystack[ $i ]->major ]);
}
fwrite($this->yyTraceFILE, "\n");
}
@@ -1345,93 +1330,92 @@ class Smarty_Internal_Templateparser
array(0 => 63, 1 => 1), array(0 => 65, 1 => 2), array(0 => 65, 1 => 3),
array(0 => 67, 1 => 2), array(0 => 67, 1 => 0), array(0 => 68, 1 => 1),
array(0 => 68, 1 => 1), array(0 => 64, 1 => 2), array(0 => 64, 1 => 1),
- array(0 => 69, 1 => 2), array(0 => 69, 1 => 4), array(0 => 69, 1 => 3),
- array(0 => 69, 1 => 2), array(0 => 69, 1 => 4), array(0 => 69, 1 => 3),
- array(0 => 69, 1 => 4), array(0 => 69, 1 => 3), array(0 => 69, 1 => 4),
- array(0 => 69, 1 => 4), array(0 => 69, 1 => 5), array(0 => 69, 1 => 5),
- array(0 => 64, 1 => 1), array(0 => 69, 1 => 3), array(0 => 69, 1 => 2),
- array(0 => 69, 1 => 4), array(0 => 69, 1 => 5), array(0 => 69, 1 => 6),
array(0 => 69, 1 => 2), array(0 => 69, 1 => 3), array(0 => 69, 1 => 2),
- array(0 => 69, 1 => 3), array(0 => 69, 1 => 8), array(0 => 78, 1 => 2),
- array(0 => 78, 1 => 1), array(0 => 69, 1 => 5), array(0 => 69, 1 => 7),
- array(0 => 69, 1 => 2), array(0 => 69, 1 => 6), array(0 => 69, 1 => 8),
- array(0 => 69, 1 => 6), array(0 => 69, 1 => 8), array(0 => 69, 1 => 3),
- array(0 => 69, 1 => 4), array(0 => 69, 1 => 2), array(0 => 64, 1 => 1),
- array(0 => 69, 1 => 2), array(0 => 69, 1 => 3), array(0 => 69, 1 => 4),
- array(0 => 69, 1 => 5), array(0 => 72, 1 => 2), array(0 => 72, 1 => 1),
- array(0 => 72, 1 => 0), array(0 => 81, 1 => 4), array(0 => 81, 1 => 2),
+ array(0 => 69, 1 => 3), array(0 => 69, 1 => 2), array(0 => 69, 1 => 3),
+ array(0 => 69, 1 => 4), array(0 => 69, 1 => 4), array(0 => 69, 1 => 5),
+ array(0 => 69, 1 => 5), array(0 => 64, 1 => 1), array(0 => 69, 1 => 3),
+ array(0 => 69, 1 => 2), array(0 => 69, 1 => 4), array(0 => 69, 1 => 5),
+ array(0 => 69, 1 => 6), array(0 => 69, 1 => 2), array(0 => 69, 1 => 3),
+ array(0 => 69, 1 => 2), array(0 => 69, 1 => 3), array(0 => 69, 1 => 8),
+ array(0 => 78, 1 => 2), array(0 => 78, 1 => 1), array(0 => 69, 1 => 5),
+ array(0 => 69, 1 => 7), array(0 => 69, 1 => 2), array(0 => 69, 1 => 6),
+ array(0 => 69, 1 => 8), array(0 => 69, 1 => 6), array(0 => 69, 1 => 8),
+ array(0 => 69, 1 => 3), array(0 => 69, 1 => 4), array(0 => 69, 1 => 2),
+ array(0 => 64, 1 => 1), array(0 => 69, 1 => 2), array(0 => 69, 1 => 3),
+ array(0 => 69, 1 => 4), array(0 => 69, 1 => 5), array(0 => 71, 1 => 2),
+ array(0 => 71, 1 => 1), array(0 => 71, 1 => 0), array(0 => 81, 1 => 4),
array(0 => 81, 1 => 2), array(0 => 81, 1 => 2), array(0 => 81, 1 => 2),
- array(0 => 81, 1 => 2), array(0 => 81, 1 => 4), array(0 => 77, 1 => 1),
- array(0 => 77, 1 => 3), array(0 => 76, 1 => 3), array(0 => 76, 1 => 3),
- array(0 => 76, 1 => 3), array(0 => 76, 1 => 3), array(0 => 74, 1 => 1),
- array(0 => 74, 1 => 1), array(0 => 74, 1 => 3), array(0 => 74, 1 => 3),
- array(0 => 74, 1 => 3), array(0 => 74, 1 => 1), array(0 => 74, 1 => 2),
- array(0 => 74, 1 => 3), array(0 => 74, 1 => 2), array(0 => 74, 1 => 3),
- array(0 => 74, 1 => 3), array(0 => 74, 1 => 3), array(0 => 74, 1 => 3),
- array(0 => 82, 1 => 7), array(0 => 82, 1 => 7), array(0 => 73, 1 => 1),
- array(0 => 73, 1 => 2), array(0 => 73, 1 => 2), array(0 => 73, 1 => 2),
- array(0 => 73, 1 => 2), array(0 => 73, 1 => 1), array(0 => 73, 1 => 1),
- array(0 => 73, 1 => 3), array(0 => 73, 1 => 2), array(0 => 73, 1 => 2),
- array(0 => 73, 1 => 1), array(0 => 73, 1 => 1), array(0 => 73, 1 => 3),
+ array(0 => 81, 1 => 2), array(0 => 81, 1 => 2), array(0 => 81, 1 => 4),
+ array(0 => 77, 1 => 1), array(0 => 77, 1 => 3), array(0 => 76, 1 => 3),
+ array(0 => 76, 1 => 3), array(0 => 76, 1 => 3), array(0 => 76, 1 => 3),
array(0 => 73, 1 => 1), array(0 => 73, 1 => 1), array(0 => 73, 1 => 3),
- array(0 => 73, 1 => 1), array(0 => 73, 1 => 2), array(0 => 73, 1 => 1),
- array(0 => 73, 1 => 3), array(0 => 86, 1 => 1), array(0 => 86, 1 => 1),
- array(0 => 70, 1 => 1), array(0 => 70, 1 => 1), array(0 => 70, 1 => 3),
- array(0 => 70, 1 => 1), array(0 => 70, 1 => 3), array(0 => 70, 1 => 4),
- array(0 => 70, 1 => 3), array(0 => 70, 1 => 4), array(0 => 75, 1 => 2),
- array(0 => 75, 1 => 2), array(0 => 91, 1 => 2), array(0 => 91, 1 => 0),
- array(0 => 92, 1 => 2), array(0 => 92, 1 => 2), array(0 => 92, 1 => 4),
- array(0 => 92, 1 => 2), array(0 => 92, 1 => 2), array(0 => 92, 1 => 4),
- array(0 => 92, 1 => 3), array(0 => 92, 1 => 5), array(0 => 92, 1 => 3),
+ array(0 => 73, 1 => 3), array(0 => 73, 1 => 3), array(0 => 73, 1 => 1),
+ array(0 => 73, 1 => 2), array(0 => 73, 1 => 3), array(0 => 73, 1 => 2),
+ array(0 => 73, 1 => 3), array(0 => 73, 1 => 3), array(0 => 73, 1 => 3),
+ array(0 => 73, 1 => 3), array(0 => 82, 1 => 7), array(0 => 82, 1 => 7),
+ array(0 => 72, 1 => 1), array(0 => 72, 1 => 2), array(0 => 72, 1 => 2),
+ array(0 => 72, 1 => 2), array(0 => 72, 1 => 2), array(0 => 72, 1 => 1),
+ array(0 => 72, 1 => 1), array(0 => 72, 1 => 3), array(0 => 72, 1 => 2),
+ array(0 => 72, 1 => 2), array(0 => 72, 1 => 1), array(0 => 72, 1 => 1),
+ array(0 => 72, 1 => 3), array(0 => 72, 1 => 1), array(0 => 72, 1 => 1),
+ array(0 => 72, 1 => 3), array(0 => 72, 1 => 1), array(0 => 72, 1 => 2),
+ array(0 => 72, 1 => 1), array(0 => 72, 1 => 3), array(0 => 86, 1 => 1),
+ array(0 => 86, 1 => 1), array(0 => 70, 1 => 1), array(0 => 70, 1 => 1),
+ array(0 => 70, 1 => 3), array(0 => 70, 1 => 1), array(0 => 70, 1 => 3),
+ array(0 => 70, 1 => 4), array(0 => 70, 1 => 3), array(0 => 70, 1 => 4),
+ array(0 => 74, 1 => 2), array(0 => 74, 1 => 2), array(0 => 91, 1 => 2),
+ array(0 => 91, 1 => 0), array(0 => 92, 1 => 2), array(0 => 92, 1 => 2),
+ array(0 => 92, 1 => 4), array(0 => 92, 1 => 2), array(0 => 92, 1 => 2),
+ array(0 => 92, 1 => 4), array(0 => 92, 1 => 3), array(0 => 92, 1 => 5),
array(0 => 92, 1 => 3), array(0 => 92, 1 => 3), array(0 => 92, 1 => 3),
- array(0 => 92, 1 => 3), array(0 => 92, 1 => 3), array(0 => 92, 1 => 2),
- array(0 => 79, 1 => 1), array(0 => 79, 1 => 1), array(0 => 79, 1 => 2),
- array(0 => 93, 1 => 1), array(0 => 93, 1 => 1), array(0 => 93, 1 => 3),
- array(0 => 90, 1 => 2), array(0 => 94, 1 => 1), array(0 => 94, 1 => 2),
- array(0 => 95, 1 => 3), array(0 => 95, 1 => 3), array(0 => 95, 1 => 5),
- array(0 => 95, 1 => 6), array(0 => 95, 1 => 2), array(0 => 87, 1 => 4),
- array(0 => 96, 1 => 4), array(0 => 96, 1 => 4), array(0 => 97, 1 => 3),
- array(0 => 97, 1 => 1), array(0 => 97, 1 => 0), array(0 => 71, 1 => 3),
- array(0 => 71, 1 => 2), array(0 => 98, 1 => 3), array(0 => 98, 1 => 2),
- array(0 => 80, 1 => 2), array(0 => 80, 1 => 0), array(0 => 99, 1 => 2),
- array(0 => 99, 1 => 2), array(0 => 89, 1 => 1), array(0 => 89, 1 => 2),
- array(0 => 89, 1 => 1), array(0 => 89, 1 => 2), array(0 => 89, 1 => 3),
- array(0 => 84, 1 => 1), array(0 => 84, 1 => 1), array(0 => 85, 1 => 1),
- array(0 => 83, 1 => 3), array(0 => 100, 1 => 1), array(0 => 100, 1 => 3),
- array(0 => 100, 1 => 0), array(0 => 101, 1 => 3), array(0 => 101, 1 => 3),
- array(0 => 101, 1 => 1), array(0 => 88, 1 => 2), array(0 => 88, 1 => 3),
- array(0 => 102, 1 => 2), array(0 => 102, 1 => 1), array(0 => 103, 1 => 3),
- array(0 => 103, 1 => 3), array(0 => 103, 1 => 1), array(0 => 103, 1 => 3),
- array(0 => 103, 1 => 3), array(0 => 103, 1 => 1), array(0 => 103, 1 => 1),);
+ array(0 => 92, 1 => 3), array(0 => 92, 1 => 3), array(0 => 92, 1 => 3),
+ array(0 => 92, 1 => 2), array(0 => 79, 1 => 1), array(0 => 79, 1 => 1),
+ array(0 => 79, 1 => 2), array(0 => 93, 1 => 1), array(0 => 93, 1 => 1),
+ array(0 => 93, 1 => 3), array(0 => 90, 1 => 2), array(0 => 94, 1 => 1),
+ array(0 => 94, 1 => 2), array(0 => 95, 1 => 3), array(0 => 95, 1 => 3),
+ array(0 => 95, 1 => 5), array(0 => 95, 1 => 6), array(0 => 95, 1 => 2),
+ array(0 => 87, 1 => 4), array(0 => 96, 1 => 4), array(0 => 96, 1 => 4),
+ array(0 => 97, 1 => 3), array(0 => 97, 1 => 1), array(0 => 97, 1 => 0),
+ array(0 => 75, 1 => 3), array(0 => 75, 1 => 2), array(0 => 98, 1 => 3),
+ array(0 => 98, 1 => 2), array(0 => 80, 1 => 2), array(0 => 80, 1 => 0),
+ array(0 => 99, 1 => 2), array(0 => 99, 1 => 2), array(0 => 89, 1 => 1),
+ array(0 => 89, 1 => 2), array(0 => 89, 1 => 1), array(0 => 89, 1 => 2),
+ array(0 => 89, 1 => 3), array(0 => 84, 1 => 1), array(0 => 84, 1 => 1),
+ array(0 => 85, 1 => 1), array(0 => 83, 1 => 3), array(0 => 100, 1 => 1),
+ array(0 => 100, 1 => 3), array(0 => 100, 1 => 0), array(0 => 101, 1 => 3),
+ array(0 => 101, 1 => 3), array(0 => 101, 1 => 1), array(0 => 88, 1 => 2),
+ array(0 => 88, 1 => 3), array(0 => 102, 1 => 2), array(0 => 102, 1 => 1),
+ array(0 => 103, 1 => 3), array(0 => 103, 1 => 3), array(0 => 103, 1 => 1),
+ array(0 => 103, 1 => 3), array(0 => 103, 1 => 3), array(0 => 103, 1 => 1),
+ array(0 => 103, 1 => 1),);
public static $yyReduceMap = array(0 => 0, 1 => 1, 2 => 2, 4 => 4, 5 => 5, 6 => 6, 7 => 7, 8 => 8, 9 => 9,
- 17 => 9, 18 => 9, 45 => 9, 68 => 9, 69 => 9, 77 => 9, 78 => 9, 82 => 9, 92 => 9,
- 97 => 9, 98 => 9, 103 => 9, 105 => 9, 106 => 9, 110 => 9, 112 => 9, 117 => 9,
- 178 => 9, 183 => 9, 10 => 10, 11 => 11, 12 => 12, 13 => 13, 16 => 13, 14 => 14,
- 76 => 14, 15 => 15, 93 => 15, 95 => 15, 96 => 15, 124 => 15, 19 => 19, 20 => 20,
- 21 => 21, 24 => 21, 22 => 22, 25 => 22, 23 => 23, 26 => 23, 28 => 23, 27 => 27,
- 29 => 29, 30 => 29, 31 => 31, 32 => 32, 33 => 33, 34 => 34, 35 => 35, 36 => 36,
- 37 => 37, 38 => 38, 39 => 39, 40 => 40, 42 => 40, 41 => 41, 43 => 43, 44 => 44,
- 46 => 46, 47 => 47, 48 => 48, 49 => 49, 51 => 49, 50 => 50, 52 => 50, 53 => 53,
- 54 => 54, 55 => 55, 56 => 56, 57 => 57, 58 => 58, 59 => 59, 60 => 60, 61 => 61,
- 62 => 62, 71 => 62, 159 => 62, 163 => 62, 167 => 62, 168 => 62, 63 => 63,
- 160 => 63, 166 => 63, 64 => 64, 65 => 65, 66 => 65, 67 => 67, 144 => 67,
- 70 => 70, 72 => 72, 73 => 73, 74 => 73, 75 => 75, 79 => 79, 80 => 80, 81 => 80,
- 83 => 83, 109 => 83, 84 => 84, 85 => 85, 86 => 86, 87 => 87, 88 => 88, 89 => 88,
- 90 => 90, 91 => 91, 94 => 94, 99 => 99, 100 => 100, 101 => 101, 102 => 102,
- 104 => 104, 107 => 107, 108 => 108, 111 => 111, 113 => 113, 114 => 114,
- 115 => 115, 116 => 116, 118 => 118, 119 => 119, 120 => 120, 121 => 121,
- 122 => 122, 123 => 123, 125 => 125, 180 => 125, 126 => 126, 127 => 127,
- 128 => 128, 129 => 129, 130 => 130, 131 => 131, 139 => 131, 132 => 132,
- 133 => 133, 134 => 134, 135 => 134, 137 => 134, 138 => 134, 136 => 136,
- 140 => 140, 141 => 141, 142 => 142, 184 => 142, 143 => 143, 145 => 145,
- 146 => 146, 147 => 147, 148 => 148, 149 => 149, 150 => 150, 151 => 151,
- 152 => 152, 153 => 153, 154 => 154, 155 => 155, 156 => 156, 157 => 157,
- 158 => 158, 161 => 161, 162 => 162, 164 => 164, 165 => 165, 169 => 169,
- 170 => 170, 171 => 171, 172 => 172, 173 => 173, 174 => 174, 175 => 175,
- 176 => 176, 177 => 177, 179 => 179, 181 => 181, 182 => 182, 185 => 185,
- 186 => 186, 187 => 187, 188 => 188, 189 => 188, 191 => 188, 190 => 190,
- 192 => 192, 193 => 193, 194 => 194,);
+ 17 => 9, 18 => 9, 43 => 9, 66 => 9, 67 => 9, 75 => 9, 76 => 9, 80 => 9, 90 => 9,
+ 95 => 9, 96 => 9, 101 => 9, 103 => 9, 104 => 9, 108 => 9, 110 => 9, 115 => 9,
+ 176 => 9, 181 => 9, 10 => 10, 11 => 11, 12 => 12, 13 => 13, 16 => 13, 14 => 14,
+ 74 => 14, 15 => 15, 91 => 15, 93 => 15, 94 => 15, 122 => 15, 19 => 19, 20 => 20,
+ 21 => 21, 23 => 21, 25 => 21, 22 => 22, 24 => 22, 26 => 22, 27 => 27, 28 => 27,
+ 29 => 29, 30 => 30, 31 => 31, 32 => 32, 33 => 33, 34 => 34, 35 => 35, 36 => 36,
+ 37 => 37, 38 => 38, 40 => 38, 39 => 39, 41 => 41, 42 => 42, 44 => 44, 45 => 45,
+ 46 => 46, 47 => 47, 49 => 47, 48 => 48, 50 => 48, 51 => 51, 52 => 52, 53 => 53,
+ 54 => 54, 55 => 55, 56 => 56, 57 => 57, 58 => 58, 59 => 59, 60 => 60, 69 => 60,
+ 157 => 60, 161 => 60, 165 => 60, 166 => 60, 61 => 61, 158 => 61, 164 => 61,
+ 62 => 62, 63 => 63, 64 => 63, 65 => 65, 142 => 65, 68 => 68, 70 => 70, 71 => 71,
+ 72 => 71, 73 => 73, 77 => 77, 78 => 78, 79 => 78, 81 => 81, 107 => 81, 82 => 82,
+ 83 => 83, 84 => 84, 85 => 85, 86 => 86, 87 => 86, 88 => 88, 89 => 89, 92 => 92,
+ 97 => 97, 98 => 98, 99 => 99, 100 => 100, 102 => 102, 105 => 105, 106 => 106,
+ 109 => 109, 111 => 111, 112 => 112, 113 => 113, 114 => 114, 116 => 116,
+ 117 => 117, 118 => 118, 119 => 119, 120 => 120, 121 => 121, 123 => 123,
+ 178 => 123, 124 => 124, 125 => 125, 126 => 126, 127 => 127, 128 => 128,
+ 129 => 129, 137 => 129, 130 => 130, 131 => 131, 132 => 132, 133 => 132,
+ 135 => 132, 136 => 132, 134 => 134, 138 => 138, 139 => 139, 140 => 140,
+ 182 => 140, 141 => 141, 143 => 143, 144 => 144, 145 => 145, 146 => 146,
+ 147 => 147, 148 => 148, 149 => 149, 150 => 150, 151 => 151, 152 => 152,
+ 153 => 153, 154 => 154, 155 => 155, 156 => 156, 159 => 159, 160 => 160,
+ 162 => 162, 163 => 163, 167 => 167, 168 => 168, 169 => 169, 170 => 170,
+ 171 => 171, 172 => 172, 173 => 173, 174 => 174, 175 => 175, 177 => 177,
+ 179 => 179, 180 => 180, 183 => 183, 184 => 184, 185 => 185, 186 => 186,
+ 187 => 186, 189 => 186, 188 => 188, 190 => 190, 191 => 191, 192 => 192,);
#line 225 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r0()
@@ -1444,17 +1428,17 @@ class Smarty_Internal_Templateparser
#line 235 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r1()
{
- if ($this->yystack[$this->yyidx + 0]->minor != null) {
- $this->current_buffer->append_subtree($this, $this->yystack[$this->yyidx + 0]->minor);
+ if ($this->yystack[ $this->yyidx + 0 ]->minor != null) {
+ $this->current_buffer->append_subtree($this, $this->yystack[ $this->yyidx + 0 ]->minor);
}
}
#line 242 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r2()
{
- if ($this->yystack[$this->yyidx + 0]->minor != null) {
+ if ($this->yystack[ $this->yyidx + 0 ]->minor != null) {
// because of possible code injection
- $this->current_buffer->append_subtree($this, $this->yystack[$this->yyidx + 0]->minor);
+ $this->current_buffer->append_subtree($this, $this->yystack[ $this->yyidx + 0 ]->minor);
}
}
@@ -1462,7 +1446,7 @@ class Smarty_Internal_Templateparser
function yy_r4()
{
if ($this->compiler->has_code) {
- $this->_retvalue = $this->mergePrefixCode($this->yystack[$this->yyidx + 0]->minor);
+ $this->_retvalue = $this->mergePrefixCode($this->yystack[ $this->yyidx + 0 ]->minor);
} else {
$this->_retvalue = null;
}
@@ -1473,14 +1457,14 @@ class Smarty_Internal_Templateparser
#line 267 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r5()
{
- $this->_retvalue = new Smarty_Internal_ParseTree_Text($this->yystack[$this->yyidx + 0]->minor);
+ $this->_retvalue = new Smarty_Internal_ParseTree_Text($this->yystack[ $this->yyidx + 0 ]->minor);
}
#line 271 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r6()
{
$code = $this->compiler->compileTag('private_php',
- array(array('code' => $this->yystack[$this->yyidx + 0]->minor),
+ array(array('code' => $this->yystack[ $this->yyidx + 0 ]->minor),
array('type' => $this->lex->phpType)), array());
if ($this->compiler->has_code && !empty($code)) {
$tmp = '';
@@ -1510,19 +1494,19 @@ class Smarty_Internal_Templateparser
#line 289 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r8()
{
- $this->_retvalue = $this->compiler->processText($this->yystack[$this->yyidx + 0]->minor);
+ $this->_retvalue = $this->compiler->processText($this->yystack[ $this->yyidx + 0 ]->minor);
}
#line 293 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r9()
{
- $this->_retvalue = $this->yystack[$this->yyidx + 0]->minor;
+ $this->_retvalue = $this->yystack[ $this->yyidx + 0 ]->minor;
}
#line 297 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r10()
{
- $this->_retvalue = $this->yystack[$this->yyidx + - 1]->minor . $this->yystack[$this->yyidx + 0]->minor;
+ $this->_retvalue = $this->yystack[ $this->yyidx + - 1 ]->minor . $this->yystack[ $this->yyidx + 0 ]->minor;
}
#line 302 "../smarty/lexer/smarty_internal_templateparser.y"
@@ -1546,30 +1530,31 @@ class Smarty_Internal_Templateparser
#line 315 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r14()
{
- $this->_retvalue = $this->yystack[$this->yyidx + - 1]->minor;
+ $this->_retvalue = $this->yystack[ $this->yyidx + - 1 ]->minor;
}
#line 319 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r15()
{
- $this->_retvalue = $this->yystack[$this->yyidx + - 1]->minor . $this->yystack[$this->yyidx + 0]->minor;
+ $this->_retvalue = $this->yystack[ $this->yyidx + - 1 ]->minor . $this->yystack[ $this->yyidx + 0 ]->minor;
}
#line 335 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r19()
{
- $this->_retvalue = $this->yystack[$this->yyidx + - 1]->minor;
+ $this->_retvalue = $this->yystack[ $this->yyidx + - 1 ]->minor;
}
#line 341 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r20()
{
- $var = trim(substr($this->yystack[$this->yyidx + 0]->minor, $this->lex->ldel_length, - $this->lex->rdel_length),
- ' $');
+ $var =
+ trim(substr($this->yystack[ $this->yyidx + 0 ]->minor, $this->lex->ldel_length, - $this->lex->rdel_length),
+ ' $');
if (preg_match('/^(.*)(\s+nocache)$/', $var, $match)) {
$this->_retvalue = $this->compiler->compileTag('private_print_expression', array('nocache'),
array('value' => $this->compiler->compileVariable('\'' .
- $match[1] .
+ $match[ 1 ] .
'\'')));
} else {
$this->_retvalue = $this->compiler->compileTag('private_print_expression', array(),
@@ -1583,71 +1568,51 @@ class Smarty_Internal_Templateparser
function yy_r21()
{
$this->_retvalue = $this->compiler->compileTag('private_print_expression', array(),
- array('value' => $this->yystack[$this->yyidx + 0]->minor));
+ array('value' => $this->yystack[ $this->yyidx + 0 ]->minor));
}
#line 355 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r22()
{
$this->_retvalue =
- $this->compiler->compileTag('private_print_expression', $this->yystack[$this->yyidx + 0]->minor,
- array('value' => $this->yystack[$this->yyidx + - 2]->minor,
- 'modifierlist' => $this->yystack[$this->yyidx + - 1]->minor));
- }
-
- #line 359 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r23()
- {
- $this->_retvalue =
- $this->compiler->compileTag('private_print_expression', $this->yystack[$this->yyidx + 0]->minor,
- array('value' => $this->yystack[$this->yyidx + - 1]->minor));
+ $this->compiler->compileTag('private_print_expression', $this->yystack[ $this->yyidx + 0 ]->minor,
+ array('value' => $this->yystack[ $this->yyidx + - 1 ]->minor));
}
- #line 373 "../smarty/lexer/smarty_internal_templateparser.y"
+ #line 378 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r27()
{
- $this->_retvalue =
- $this->compiler->compileTag('private_print_expression', $this->yystack[$this->yyidx + 0]->minor,
- array('value' => $this->yystack[$this->yyidx + - 2]->minor,
- 'modifierlist' => $this->yystack[$this->yyidx + - 1]->minor));
+ $this->_retvalue = $this->compiler->compileTag('assign', array(array('value' => $this->yystack[ $this->yyidx +
+ 0 ]->minor), array('var' => '\'' . substr($this->yystack[ $this->yyidx + - 2 ]->minor, 1) . '\'')));
}
#line 386 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r29()
{
$this->_retvalue = $this->compiler->compileTag('assign',
- array(array('value' => $this->yystack[$this->yyidx + 0]->minor),
- array('var' => '\'' .
- substr($this->yystack[$this->yyidx + - 2]->minor, 1) .
- '\'')));
+ array_merge(array(array('value' => $this->yystack[ $this->yyidx +
+ - 1 ]->minor), array('var' => '\'' .
+ substr($this->yystack[ $this->yyidx + - 3 ]->minor, 1) .
+ '\'')), $this->yystack[ $this->yyidx + 0 ]->minor));
}
- #line 394 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r31()
+ #line 390 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r30()
{
$this->_retvalue = $this->compiler->compileTag('assign',
- array_merge(array(array('value' => $this->yystack[$this->yyidx +
- - 1]->minor), array('var' => '\'' .
- substr($this->yystack[$this->yyidx + - 3]->minor, 1) .
- '\'')), $this->yystack[$this->yyidx + 0]->minor));
+ array_merge(array(array('value' => $this->yystack[ $this->yyidx +
+ - 1 ]->minor), array('var' => $this->yystack[ $this->yyidx +
+ - 3 ]->minor[ 'var' ])),
+ $this->yystack[ $this->yyidx + 0 ]->minor),
+ array('smarty_internal_index' => $this->yystack[ $this->yyidx +
+ - 3 ]->minor[ 'smarty_internal_index' ]));
}
- #line 398 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r32()
- {
- $this->_retvalue = $this->compiler->compileTag('assign',
- array_merge(array(array('value' => $this->yystack[$this->yyidx +
- - 1]->minor), array('var' => $this->yystack[$this->yyidx +
- - 3]->minor['var'])), $this->yystack[$this->yyidx + 0]->minor),
- array('smarty_internal_index' => $this->yystack[$this->yyidx +
- - 3]->minor['smarty_internal_index']));
- }
-
- #line 403 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r33()
+ #line 395 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r31()
{
$tag =
- trim(substr($this->yystack[$this->yyidx + 0]->minor, $this->lex->ldel_length, - $this->lex->rdel_length));
+ trim(substr($this->yystack[ $this->yyidx + 0 ]->minor, $this->lex->ldel_length, - $this->lex->rdel_length));
if ($tag == 'strip') {
$this->strip = true;
$this->_retvalue = null;;
@@ -1660,7 +1625,7 @@ class Smarty_Internal_Templateparser
$this->compiler->compileTag('private_print_expression', array(), array('value' => $tag));
} else {
if (preg_match('/^(.*)(\s+nocache)$/', $tag, $match)) {
- $this->_retvalue = $this->compiler->compileTag($match[1], array("'nocache'"));
+ $this->_retvalue = $this->compiler->compileTag($match[ 1 ], array("'nocache'"));
} else {
$this->_retvalue = $this->compiler->compileTag($tag, array());
}
@@ -1668,199 +1633,200 @@ class Smarty_Internal_Templateparser
}
}
- #line 425 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r34()
+ #line 417 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r32()
{
- if (defined($this->yystack[$this->yyidx + - 1]->minor)) {
+ if (defined($this->yystack[ $this->yyidx + - 1 ]->minor)) {
if ($this->security) {
- $this->security->isTrustedConstant($this->yystack[$this->yyidx + - 1]->minor, $this->compiler);
+ $this->security->isTrustedConstant($this->yystack[ $this->yyidx + - 1 ]->minor, $this->compiler);
}
$this->_retvalue =
- $this->compiler->compileTag('private_print_expression', $this->yystack[$this->yyidx + 0]->minor,
- array('value' => $this->yystack[$this->yyidx + - 1]->minor));
+ $this->compiler->compileTag('private_print_expression', $this->yystack[ $this->yyidx + 0 ]->minor,
+ array('value' => $this->yystack[ $this->yyidx + - 1 ]->minor));
} else {
- $this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + - 1]->minor,
- $this->yystack[$this->yyidx + 0]->minor);
+ $this->_retvalue = $this->compiler->compileTag($this->yystack[ $this->yyidx + - 1 ]->minor,
+ $this->yystack[ $this->yyidx + 0 ]->minor);
}
}
- #line 435 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r35()
+ #line 427 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r33()
{
- if (defined($this->yystack[$this->yyidx + 0]->minor)) {
+ if (defined($this->yystack[ $this->yyidx + 0 ]->minor)) {
if ($this->security) {
- $this->security->isTrustedConstant($this->yystack[$this->yyidx + 0]->minor, $this->compiler);
+ $this->security->isTrustedConstant($this->yystack[ $this->yyidx + 0 ]->minor, $this->compiler);
}
$this->_retvalue = $this->compiler->compileTag('private_print_expression', array(),
- array('value' => $this->yystack[$this->yyidx + 0]->minor));
+ array('value' => $this->yystack[ $this->yyidx + 0 ]->minor));
} else {
- $this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + 0]->minor, array());
+ $this->_retvalue = $this->compiler->compileTag($this->yystack[ $this->yyidx + 0 ]->minor, array());
}
}
- #line 448 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r36()
+ #line 440 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r34()
{
- if (defined($this->yystack[$this->yyidx + - 2]->minor)) {
+ if (defined($this->yystack[ $this->yyidx + - 2 ]->minor)) {
if ($this->security) {
- $this->security->isTrustedConstant($this->yystack[$this->yyidx + - 2]->minor, $this->compiler);
+ $this->security->isTrustedConstant($this->yystack[ $this->yyidx + - 2 ]->minor, $this->compiler);
}
$this->_retvalue =
- $this->compiler->compileTag('private_print_expression', $this->yystack[$this->yyidx + 0]->minor,
- array('value' => $this->yystack[$this->yyidx + - 2]->minor,
- 'modifierlist' => $this->yystack[$this->yyidx + - 1]->minor));
+ $this->compiler->compileTag('private_print_expression', $this->yystack[ $this->yyidx + 0 ]->minor,
+ array('value' => $this->yystack[ $this->yyidx + - 2 ]->minor,
+ 'modifierlist' => $this->yystack[ $this->yyidx + - 1 ]->minor));
} else {
$this->_retvalue = '<?php ob_start();?>' .
- $this->compiler->compileTag($this->yystack[$this->yyidx + - 2]->minor,
- $this->yystack[$this->yyidx + 0]->minor) . '<?php echo ';
+ $this->compiler->compileTag($this->yystack[ $this->yyidx + - 2 ]->minor,
+ $this->yystack[ $this->yyidx + 0 ]->minor) . '<?php echo ';
$this->_retvalue .= $this->compiler->compileTag('private_modifier', array(),
- array('modifierlist' => $this->yystack[$this->yyidx +
- - 1]->minor, 'value' => 'ob_get_clean()')) . ';?>';
+ array('modifierlist' => $this->yystack[ $this->yyidx +
+ - 1 ]->minor, 'value' => 'ob_get_clean()')) . ';?>';
}
}
- #line 461 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r37()
+ #line 453 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r35()
{
- $this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + - 3]->minor,
- $this->yystack[$this->yyidx + 0]->minor,
- array('object_method' => $this->yystack[$this->yyidx +
- - 1]->minor));
+ $this->_retvalue = $this->compiler->compileTag($this->yystack[ $this->yyidx + - 3 ]->minor,
+ $this->yystack[ $this->yyidx + 0 ]->minor,
+ array('object_method' => $this->yystack[ $this->yyidx +
+ - 1 ]->minor));
}
- #line 466 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r38()
+ #line 458 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r36()
{
$this->_retvalue = '<?php ob_start();?>' .
- $this->compiler->compileTag($this->yystack[$this->yyidx + - 4]->minor,
- $this->yystack[$this->yyidx + 0]->minor,
- array('object_method' => $this->yystack[$this->yyidx + - 2]->minor)) .
+ $this->compiler->compileTag($this->yystack[ $this->yyidx + - 4 ]->minor,
+ $this->yystack[ $this->yyidx + 0 ]->minor,
+ array('object_method' => $this->yystack[ $this->yyidx + - 2 ]->minor)) .
'<?php echo ';
$this->_retvalue .= $this->compiler->compileTag('private_modifier', array(),
- array('modifierlist' => $this->yystack[$this->yyidx +
- - 1]->minor, 'value' => 'ob_get_clean()')) . ';?>';
+ array('modifierlist' => $this->yystack[ $this->yyidx +
+ - 1 ]->minor, 'value' => 'ob_get_clean()')) . ';?>';
}
- #line 472 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r39()
+ #line 464 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r37()
{
- $tag = trim(substr($this->yystack[$this->yyidx + - 1]->minor, $this->lex->ldel_length));
+ $tag = trim(substr($this->yystack[ $this->yyidx + - 1 ]->minor, $this->lex->ldel_length));
$this->_retvalue = $this->compiler->compileTag(($tag == 'else if') ? 'elseif' : $tag, array(),
- array('if condition' => $this->yystack[$this->yyidx +
- 0]->minor));
+ array('if condition' => $this->yystack[ $this->yyidx +
+ 0 ]->minor));
}
- #line 477 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r40()
+ #line 469 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r38()
{
- $tag = trim(substr($this->yystack[$this->yyidx + - 2]->minor, $this->lex->ldel_length));
- $this->_retvalue =
- $this->compiler->compileTag(($tag == 'else if') ? 'elseif' : $tag, $this->yystack[$this->yyidx + 0]->minor,
- array('if condition' => $this->yystack[$this->yyidx + - 1]->minor));
+ $tag = trim(substr($this->yystack[ $this->yyidx + - 2 ]->minor, $this->lex->ldel_length));
+ $this->_retvalue = $this->compiler->compileTag(($tag == 'else if') ? 'elseif' : $tag,
+ $this->yystack[ $this->yyidx + 0 ]->minor,
+ array('if condition' => $this->yystack[ $this->yyidx +
+ - 1 ]->minor));
}
- #line 482 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r41()
+ #line 474 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r39()
{
- $tag = trim(substr($this->yystack[$this->yyidx + - 1]->minor, $this->lex->ldel_length));
+ $tag = trim(substr($this->yystack[ $this->yyidx + - 1 ]->minor, $this->lex->ldel_length));
$this->_retvalue = $this->compiler->compileTag(($tag == 'else if') ? 'elseif' : $tag, array(),
- array('if condition' => $this->yystack[$this->yyidx +
- 0]->minor));
+ array('if condition' => $this->yystack[ $this->yyidx +
+ 0 ]->minor));
}
- #line 493 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r43()
+ #line 485 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r41()
{
- $this->_retvalue = $this->compiler->compileTag('for', array_merge($this->yystack[$this->yyidx + 0]->minor,
- array(array('start' => $this->yystack[$this->yyidx +
- - 6]->minor),
- array('ifexp' => $this->yystack[$this->yyidx +
- - 4]->minor),
- array('var' => $this->yystack[$this->yyidx +
- - 2]->minor),
- array('step' => $this->yystack[$this->yyidx +
- - 1]->minor))), 1);
+ $this->_retvalue = $this->compiler->compileTag('for', array_merge($this->yystack[ $this->yyidx + 0 ]->minor,
+ array(array('start' => $this->yystack[ $this->yyidx +
+ - 6 ]->minor),
+ array('ifexp' => $this->yystack[ $this->yyidx +
+ - 4 ]->minor),
+ array('var' => $this->yystack[ $this->yyidx +
+ - 2 ]->minor),
+ array('step' => $this->yystack[ $this->yyidx +
+ - 1 ]->minor))), 1);
}
- #line 497 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r44()
+ #line 489 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r42()
{
- $this->_retvalue = '=' . $this->yystack[$this->yyidx + 0]->minor;
+ $this->_retvalue = '=' . $this->yystack[ $this->yyidx + 0 ]->minor;
}
- #line 505 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r46()
+ #line 497 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r44()
{
- $this->_retvalue = $this->compiler->compileTag('for', array_merge($this->yystack[$this->yyidx + 0]->minor,
- array(array('start' => $this->yystack[$this->yyidx +
- - 3]->minor),
- array('to' => $this->yystack[$this->yyidx +
- - 1]->minor))), 0);
+ $this->_retvalue = $this->compiler->compileTag('for', array_merge($this->yystack[ $this->yyidx + 0 ]->minor,
+ array(array('start' => $this->yystack[ $this->yyidx +
+ - 3 ]->minor),
+ array('to' => $this->yystack[ $this->yyidx +
+ - 1 ]->minor))), 0);
}
- #line 509 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r47()
+ #line 501 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r45()
{
- $this->_retvalue = $this->compiler->compileTag('for', array_merge($this->yystack[$this->yyidx + 0]->minor,
- array(array('start' => $this->yystack[$this->yyidx +
- - 5]->minor),
- array('to' => $this->yystack[$this->yyidx +
- - 3]->minor),
- array('step' => $this->yystack[$this->yyidx +
- - 1]->minor))), 0);
+ $this->_retvalue = $this->compiler->compileTag('for', array_merge($this->yystack[ $this->yyidx + 0 ]->minor,
+ array(array('start' => $this->yystack[ $this->yyidx +
+ - 5 ]->minor),
+ array('to' => $this->yystack[ $this->yyidx +
+ - 3 ]->minor),
+ array('step' => $this->yystack[ $this->yyidx +
+ - 1 ]->minor))), 0);
}
- #line 514 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r48()
+ #line 506 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r46()
{
- $this->_retvalue = $this->compiler->compileTag('foreach', $this->yystack[$this->yyidx + 0]->minor);
+ $this->_retvalue = $this->compiler->compileTag('foreach', $this->yystack[ $this->yyidx + 0 ]->minor);
}
- #line 519 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r49()
+ #line 511 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r47()
{
- $this->_retvalue = $this->compiler->compileTag('foreach', array_merge($this->yystack[$this->yyidx + 0]->minor,
- array(array('from' => $this->yystack[$this->yyidx +
- - 3]->minor),
- array('item' => $this->yystack[$this->yyidx +
- - 1]->minor))));
+ $this->_retvalue = $this->compiler->compileTag('foreach', array_merge($this->yystack[ $this->yyidx + 0 ]->minor,
+ array(array('from' => $this->yystack[ $this->yyidx +
+ - 3 ]->minor),
+ array('item' => $this->yystack[ $this->yyidx +
+ - 1 ]->minor))));
}
- #line 523 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r50()
+ #line 515 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r48()
{
- $this->_retvalue = $this->compiler->compileTag('foreach', array_merge($this->yystack[$this->yyidx + 0]->minor,
- array(array('from' => $this->yystack[$this->yyidx +
- - 5]->minor),
- array('item' => $this->yystack[$this->yyidx +
- - 1]->minor),
- array('key' => $this->yystack[$this->yyidx +
- - 3]->minor))));
+ $this->_retvalue = $this->compiler->compileTag('foreach', array_merge($this->yystack[ $this->yyidx + 0 ]->minor,
+ array(array('from' => $this->yystack[ $this->yyidx +
+ - 5 ]->minor),
+ array('item' => $this->yystack[ $this->yyidx +
+ - 1 ]->minor),
+ array('key' => $this->yystack[ $this->yyidx +
+ - 3 ]->minor))));
}
- #line 536 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r53()
+ #line 528 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r51()
{
$this->_retvalue = $this->compiler->compileTag('setfilter', array(),
- array('modifier_list' => array(array_merge(array($this->yystack[$this->yyidx +
- - 1]->minor), $this->yystack[$this->yyidx + 0]->minor))));
+ array('modifier_list' => array(array_merge(array($this->yystack[ $this->yyidx +
+ - 1 ]->minor), $this->yystack[ $this->yyidx + 0 ]->minor))));
}
- #line 540 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r54()
+ #line 532 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r52()
{
$this->_retvalue = $this->compiler->compileTag('setfilter', array(),
- array('modifier_list' => array_merge(array(array_merge(array($this->yystack[$this->yyidx +
- - 2]->minor), $this->yystack[$this->yyidx + - 1]->minor)),
- $this->yystack[$this->yyidx +
- 0]->minor)));
+ array('modifier_list' => array_merge(array(array_merge(array($this->yystack[ $this->yyidx +
+ - 2 ]->minor), $this->yystack[ $this->yyidx + - 1 ]->minor)),
+ $this->yystack[ $this->yyidx +
+ 0 ]->minor)));
}
- #line 545 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r55()
+ #line 537 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r53()
{
- $j = strrpos($this->yystack[$this->yyidx + 0]->minor, '.');
- if ($this->yystack[$this->yyidx + 0]->minor[$j + 1] == 'c') {
+ $j = strrpos($this->yystack[ $this->yyidx + 0 ]->minor, '.');
+ if ($this->yystack[ $this->yyidx + 0 ]->minor[ $j + 1 ] == 'c') {
// {$smarty.block.child}
$this->_retvalue = SMARTY_INTERNAL_COMPILE_BLOCK::compileChildBlock($this->compiler);
} else {
@@ -1869,11 +1835,12 @@ class Smarty_Internal_Templateparser
}
}
- #line 558 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r56()
+ #line 550 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r54()
{
- $tag = trim(substr($this->yystack[$this->yyidx + 0]->minor, $this->lex->ldel_length, - $this->lex->rdel_length),
- ' /');
+ $tag =
+ trim(substr($this->yystack[ $this->yyidx + 0 ]->minor, $this->lex->ldel_length, - $this->lex->rdel_length),
+ ' /');
if ($tag == 'strip') {
$this->strip = false;
$this->_retvalue = null;
@@ -1882,574 +1849,582 @@ class Smarty_Internal_Templateparser
}
}
- #line 567 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r57()
+ #line 559 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r55()
{
- $this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + 0]->minor . 'close', array());
+ $this->_retvalue = $this->compiler->compileTag($this->yystack[ $this->yyidx + 0 ]->minor . 'close', array());
}
- #line 571 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r58()
+ #line 563 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r56()
{
- $this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + - 1]->minor . 'close', array(),
- array('modifier_list' => $this->yystack[$this->yyidx +
- 0]->minor));
+ $this->_retvalue = $this->compiler->compileTag($this->yystack[ $this->yyidx + - 1 ]->minor . 'close', array(),
+ array('modifier_list' => $this->yystack[ $this->yyidx +
+ 0 ]->minor));
}
- #line 576 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r59()
+ #line 568 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r57()
{
- $this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + - 2]->minor . 'close', array(),
- array('object_method' => $this->yystack[$this->yyidx +
- 0]->minor));
+ $this->_retvalue = $this->compiler->compileTag($this->yystack[ $this->yyidx + - 2 ]->minor . 'close', array(),
+ array('object_method' => $this->yystack[ $this->yyidx +
+ 0 ]->minor));
}
- #line 580 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r60()
+ #line 572 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r58()
{
- $this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + - 3]->minor . 'close', array(),
- array('object_method' => $this->yystack[$this->yyidx +
- - 1]->minor, 'modifier_list' => $this->yystack[$this->yyidx +
- 0]->minor));
+ $this->_retvalue = $this->compiler->compileTag($this->yystack[ $this->yyidx + - 3 ]->minor . 'close', array(),
+ array('object_method' => $this->yystack[ $this->yyidx +
+ - 1 ]->minor, 'modifier_list' => $this->yystack[ $this->yyidx +
+ 0 ]->minor));
}
- #line 588 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r61()
+ #line 580 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r59()
{
- $this->_retvalue = $this->yystack[$this->yyidx + - 1]->minor;
- $this->_retvalue[] = $this->yystack[$this->yyidx + 0]->minor;
+ $this->_retvalue = $this->yystack[ $this->yyidx + - 1 ]->minor;
+ $this->_retvalue[] = $this->yystack[ $this->yyidx + 0 ]->minor;
}
- #line 594 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r62()
+ #line 586 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r60()
{
- $this->_retvalue = array($this->yystack[$this->yyidx + 0]->minor);
+ $this->_retvalue = array($this->yystack[ $this->yyidx + 0 ]->minor);
}
- #line 599 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r63()
+ #line 591 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r61()
{
$this->_retvalue = array();
}
- #line 604 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r64()
+ #line 596 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r62()
{
- if (defined($this->yystack[$this->yyidx + 0]->minor)) {
+ if (defined($this->yystack[ $this->yyidx + 0 ]->minor)) {
if ($this->security) {
- $this->security->isTrustedConstant($this->yystack[$this->yyidx + 0]->minor, $this->compiler);
+ $this->security->isTrustedConstant($this->yystack[ $this->yyidx + 0 ]->minor, $this->compiler);
}
$this->_retvalue =
- array($this->yystack[$this->yyidx + - 2]->minor => $this->yystack[$this->yyidx + 0]->minor);
+ array($this->yystack[ $this->yyidx + - 2 ]->minor => $this->yystack[ $this->yyidx + 0 ]->minor);
} else {
$this->_retvalue =
- array($this->yystack[$this->yyidx + - 2]->minor => '\'' . $this->yystack[$this->yyidx + 0]->minor .
+ array($this->yystack[ $this->yyidx + - 2 ]->minor => '\'' . $this->yystack[ $this->yyidx + 0 ]->minor .
'\'');
}
}
+ #line 607 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r63()
+ {
+ $this->_retvalue =
+ array(trim($this->yystack[ $this->yyidx + - 1 ]->minor, " =\n\r\t") => $this->yystack[ $this->yyidx +
+ 0 ]->minor);
+ }
+
#line 615 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r65()
{
- $this->_retvalue =
- array(trim($this->yystack[$this->yyidx + - 1]->minor, " =\n\r\t") => $this->yystack[$this->yyidx +
- 0]->minor);
+ $this->_retvalue = '\'' . $this->yystack[ $this->yyidx + 0 ]->minor . '\'';
}
- #line 623 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r67()
+ #line 627 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r68()
{
- $this->_retvalue = '\'' . $this->yystack[$this->yyidx + 0]->minor . '\'';
+ $this->_retvalue =
+ array($this->yystack[ $this->yyidx + - 2 ]->minor => $this->yystack[ $this->yyidx + 0 ]->minor);
}
- #line 635 "../smarty/lexer/smarty_internal_templateparser.y"
+ #line 640 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r70()
{
- $this->_retvalue = array($this->yystack[$this->yyidx + - 2]->minor => $this->yystack[$this->yyidx + 0]->minor);
+ $this->yystack[ $this->yyidx + - 2 ]->minor[] = $this->yystack[ $this->yyidx + 0 ]->minor;
+ $this->_retvalue = $this->yystack[ $this->yyidx + - 2 ]->minor;
}
- #line 648 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r72()
+ #line 645 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r71()
{
- $this->yystack[$this->yyidx + - 2]->minor[] = $this->yystack[$this->yyidx + 0]->minor;
- $this->_retvalue = $this->yystack[$this->yyidx + - 2]->minor;
+ $this->_retvalue = array('var' => '\'' . substr($this->yystack[ $this->yyidx + - 2 ]->minor, 1) . '\'',
+ 'value' => $this->yystack[ $this->yyidx + 0 ]->minor);
}
- #line 653 "../smarty/lexer/smarty_internal_templateparser.y"
+ #line 652 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r73()
{
- $this->_retvalue = array('var' => '\'' . substr($this->yystack[$this->yyidx + - 2]->minor, 1) . '\'',
- 'value' => $this->yystack[$this->yyidx + 0]->minor);
+ $this->_retvalue = array('var' => $this->yystack[ $this->yyidx + - 2 ]->minor,
+ 'value' => $this->yystack[ $this->yyidx + 0 ]->minor);
}
- #line 660 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r75()
+ #line 676 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r77()
{
- $this->_retvalue = array('var' => $this->yystack[$this->yyidx + - 2]->minor,
- 'value' => $this->yystack[$this->yyidx + 0]->minor);
+ $this->_retvalue =
+ '$_smarty_tpl->getStreamVariable(\'' . substr($this->yystack[ $this->yyidx + - 2 ]->minor, 1) . '://' .
+ $this->yystack[ $this->yyidx + 0 ]->minor . '\')';
}
- #line 684 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r79()
+ #line 681 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r78()
{
$this->_retvalue =
- '$_smarty_tpl->getStreamVariable(\'' . substr($this->yystack[$this->yyidx + - 2]->minor, 1) . '://' .
- $this->yystack[$this->yyidx + 0]->minor . '\')';
+ $this->yystack[ $this->yyidx + - 2 ]->minor . trim($this->yystack[ $this->yyidx + - 1 ]->minor) .
+ $this->yystack[ $this->yyidx + 0 ]->minor;
+ }
+
+ #line 695 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r81()
+ {
+ $this->_retvalue = $this->compiler->compileTag('private_modifier', array(),
+ array('value' => $this->yystack[ $this->yyidx + - 1 ]->minor,
+ 'modifierlist' => $this->yystack[ $this->yyidx +
+ 0 ]->minor));
}
- #line 689 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r80()
+ #line 701 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r82()
{
- $this->_retvalue = $this->yystack[$this->yyidx + - 2]->minor . trim($this->yystack[$this->yyidx + - 1]->minor) .
- $this->yystack[$this->yyidx + 0]->minor;
+ $this->_retvalue = (isset($this->yystack[ $this->yyidx + - 1 ]->minor[ 'pre' ]) ?
+ $this->yystack[ $this->yyidx + - 1 ]->minor[ 'pre' ] : '') .
+ $this->yystack[ $this->yyidx + - 2 ]->minor . $this->yystack[ $this->yyidx + - 1 ]->minor[ 'op' ] .
+ $this->yystack[ $this->yyidx + 0 ]->minor .
+ (isset($this->yystack[ $this->yyidx + - 1 ]->minor[ 'pre' ]) ? ')' : '');
}
- #line 703 "../smarty/lexer/smarty_internal_templateparser.y"
+ #line 704 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r83()
{
- $this->_retvalue = $this->compiler->compileTag('private_modifier', array(),
- array('value' => $this->yystack[$this->yyidx + - 1]->minor,
- 'modifierlist' => $this->yystack[$this->yyidx +
- 0]->minor));
+ $this->_retvalue =
+ $this->yystack[ $this->yyidx + 0 ]->minor . $this->yystack[ $this->yyidx + - 1 ]->minor . ')';
}
- #line 709 "../smarty/lexer/smarty_internal_templateparser.y"
+ #line 708 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r84()
{
- $this->_retvalue = (isset($this->yystack[$this->yyidx + - 1]->minor['pre']) ?
- $this->yystack[$this->yyidx + - 1]->minor['pre'] : '') . $this->yystack[$this->yyidx + - 2]->minor .
- $this->yystack[$this->yyidx + - 1]->minor['op'] . $this->yystack[$this->yyidx + 0]->minor .
- (isset($this->yystack[$this->yyidx + - 1]->minor['pre']) ? ')' : '');
+ $this->_retvalue = 'in_array(' . $this->yystack[ $this->yyidx + - 2 ]->minor . ',' .
+ $this->yystack[ $this->yyidx + 0 ]->minor . ')';
}
#line 712 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r85()
{
- $this->_retvalue = $this->yystack[$this->yyidx + 0]->minor . $this->yystack[$this->yyidx + - 1]->minor . ')';
+ $this->_retvalue = 'in_array(' . $this->yystack[ $this->yyidx + - 2 ]->minor . ',(array)' .
+ $this->yystack[ $this->yyidx + 0 ]->minor . ')';
}
#line 716 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r86()
{
- $this->_retvalue =
- 'in_array(' . $this->yystack[$this->yyidx + - 2]->minor . ',' . $this->yystack[$this->yyidx + 0]->minor .
- ')';
+ $this->_retvalue = $this->yystack[ $this->yyidx + - 2 ]->minor . $this->yystack[ $this->yyidx + - 1 ]->minor .
+ $this->yystack[ $this->yyidx + 0 ]->minor;
}
- #line 720 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r87()
+ #line 728 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r88()
{
- $this->_retvalue = 'in_array(' . $this->yystack[$this->yyidx + - 2]->minor . ',(array)' .
- $this->yystack[$this->yyidx + 0]->minor . ')';
+ $this->_retvalue = $this->yystack[ $this->yyidx + - 5 ]->minor . ' ? ' .
+ $this->compiler->compileVariable('\'' . substr($this->yystack[ $this->yyidx + - 2 ]->minor, 1) . '\'') .
+ ' : ' . $this->yystack[ $this->yyidx + 0 ]->minor;
}
- #line 724 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r88()
+ #line 732 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r89()
{
- $this->_retvalue = $this->yystack[$this->yyidx + - 2]->minor . $this->yystack[$this->yyidx + - 1]->minor .
- $this->yystack[$this->yyidx + 0]->minor;
+ $this->_retvalue =
+ $this->yystack[ $this->yyidx + - 5 ]->minor . ' ? ' . $this->yystack[ $this->yyidx + - 2 ]->minor . ' : ' .
+ $this->yystack[ $this->yyidx + 0 ]->minor;
}
- #line 736 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r90()
+ #line 747 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r92()
{
- $this->_retvalue = $this->yystack[$this->yyidx + - 5]->minor . ' ? ' .
- $this->compiler->compileVariable('\'' . substr($this->yystack[$this->yyidx + - 2]->minor, 1) . '\'') .
- ' : ' . $this->yystack[$this->yyidx + 0]->minor;
+ $this->_retvalue = '!' . $this->yystack[ $this->yyidx + 0 ]->minor;
}
- #line 740 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r91()
+ #line 768 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r97()
{
$this->_retvalue =
- $this->yystack[$this->yyidx + - 5]->minor . ' ? ' . $this->yystack[$this->yyidx + - 2]->minor . ' : ' .
- $this->yystack[$this->yyidx + 0]->minor;
+ $this->yystack[ $this->yyidx + - 2 ]->minor . '.' . $this->yystack[ $this->yyidx + 0 ]->minor;
}
- #line 755 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r94()
+ #line 772 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r98()
{
- $this->_retvalue = '!' . $this->yystack[$this->yyidx + 0]->minor;
+ $this->_retvalue = $this->yystack[ $this->yyidx + - 1 ]->minor . '.';
}
#line 776 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r99()
{
- $this->_retvalue = $this->yystack[$this->yyidx + - 2]->minor . '.' . $this->yystack[$this->yyidx + 0]->minor;
+ $this->_retvalue = '.' . $this->yystack[ $this->yyidx + 0 ]->minor;
}
- #line 780 "../smarty/lexer/smarty_internal_templateparser.y"
+ #line 781 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r100()
{
- $this->_retvalue = $this->yystack[$this->yyidx + - 1]->minor . '.';
- }
-
- #line 784 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r101()
- {
- $this->_retvalue = '.' . $this->yystack[$this->yyidx + 0]->minor;
- }
-
- #line 789 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r102()
- {
- if (defined($this->yystack[$this->yyidx + 0]->minor)) {
+ if (defined($this->yystack[ $this->yyidx + 0 ]->minor)) {
if ($this->security) {
- $this->security->isTrustedConstant($this->yystack[$this->yyidx + 0]->minor, $this->compiler);
+ $this->security->isTrustedConstant($this->yystack[ $this->yyidx + 0 ]->minor, $this->compiler);
}
- $this->_retvalue = $this->yystack[$this->yyidx + 0]->minor;
+ $this->_retvalue = $this->yystack[ $this->yyidx + 0 ]->minor;
} else {
- $this->_retvalue = '\'' . $this->yystack[$this->yyidx + 0]->minor . '\'';
+ $this->_retvalue = '\'' . $this->yystack[ $this->yyidx + 0 ]->minor . '\'';
}
}
- #line 806 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r104()
+ #line 798 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r102()
{
- $this->_retvalue = "(" . $this->yystack[$this->yyidx + - 1]->minor . ")";
+ $this->_retvalue = "(" . $this->yystack[ $this->yyidx + - 1 ]->minor . ")";
}
- #line 821 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r107()
+ #line 813 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r105()
{
self::$prefix_number ++;
- if ($this->yystack[$this->yyidx + - 2]->minor['var'] == '\'smarty\'') {
+ if ($this->yystack[ $this->yyidx + - 2 ]->minor[ 'var' ] == '\'smarty\'') {
$this->compiler->prefix_code[] = '<?php $_tmp' . self::$prefix_number . ' = ' .
$this->compiler->compileTag('private_special_variable', array(),
- $this->yystack[$this->yyidx + - 2]->minor['smarty_internal_index']) . ';?>';
+ $this->yystack[ $this->yyidx + - 2 ]->minor[ 'smarty_internal_index' ]) .
+ ';?>';
} else {
$this->compiler->prefix_code[] = '<?php $_tmp' . self::$prefix_number . ' = ' .
- $this->compiler->compileVariable($this->yystack[$this->yyidx + - 2]->minor['var']) .
- $this->yystack[$this->yyidx + - 2]->minor['smarty_internal_index'] . ';?>';
+ $this->compiler->compileVariable($this->yystack[ $this->yyidx + - 2 ]->minor[ 'var' ]) .
+ $this->yystack[ $this->yyidx + - 2 ]->minor[ 'smarty_internal_index' ] . ';?>';
}
- $this->_retvalue = '$_tmp' . self::$prefix_number . '::' . $this->yystack[$this->yyidx + 0]->minor[0] .
- $this->yystack[$this->yyidx + 0]->minor[1];
+ $this->_retvalue = '$_tmp' . self::$prefix_number . '::' . $this->yystack[ $this->yyidx + 0 ]->minor[ 0 ] .
+ $this->yystack[ $this->yyidx + 0 ]->minor[ 1 ];
}
- #line 832 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r108()
+ #line 824 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r106()
{
self::$prefix_number ++;
- $tmp = $this->compiler->appendCode('<?php ob_start();?>', $this->yystack[$this->yyidx + 0]->minor);
+ $tmp = $this->compiler->appendCode('<?php ob_start();?>', $this->yystack[ $this->yyidx + 0 ]->minor);
$this->compiler->prefix_code[] =
$this->compiler->appendCode($tmp, '<?php $_tmp' . self::$prefix_number . '=ob_get_clean();?>');
$this->_retvalue = '$_tmp' . self::$prefix_number;
}
- #line 849 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r111()
+ #line 841 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r109()
{
- if (!in_array(strtolower($this->yystack[$this->yyidx + - 2]->minor), array('self', 'parent')) &&
- (!$this->security || $this->security->isTrustedStaticClassAccess($this->yystack[$this->yyidx + - 2]->minor,
- $this->yystack[$this->yyidx + 0]->minor,
- $this->compiler))
+ if (!in_array(strtolower($this->yystack[ $this->yyidx + - 2 ]->minor), array('self', 'parent')) &&
+ (!$this->security ||
+ $this->security->isTrustedStaticClassAccess($this->yystack[ $this->yyidx + - 2 ]->minor,
+ $this->yystack[ $this->yyidx + 0 ]->minor, $this->compiler))
) {
- if (isset($this->smarty->registered_classes[$this->yystack[$this->yyidx + - 2]->minor])) {
- $this->_retvalue = $this->smarty->registered_classes[$this->yystack[$this->yyidx + - 2]->minor] . '::' .
- $this->yystack[$this->yyidx + 0]->minor[0] . $this->yystack[$this->yyidx + 0]->minor[1];
- } else {
+ if (isset($this->smarty->registered_classes[ $this->yystack[ $this->yyidx + - 2 ]->minor ])) {
$this->_retvalue =
- $this->yystack[$this->yyidx + - 2]->minor . '::' . $this->yystack[$this->yyidx + 0]->minor[0] .
- $this->yystack[$this->yyidx + 0]->minor[1];
+ $this->smarty->registered_classes[ $this->yystack[ $this->yyidx + - 2 ]->minor ] . '::' .
+ $this->yystack[ $this->yyidx + 0 ]->minor[ 0 ] . $this->yystack[ $this->yyidx + 0 ]->minor[ 1 ];
+ } else {
+ $this->_retvalue = $this->yystack[ $this->yyidx + - 2 ]->minor . '::' .
+ $this->yystack[ $this->yyidx + 0 ]->minor[ 0 ] . $this->yystack[ $this->yyidx + 0 ]->minor[ 1 ];
}
} else {
- $this->compiler->trigger_template_error("static class '" . $this->yystack[$this->yyidx + - 2]->minor .
+ $this->compiler->trigger_template_error("static class '" . $this->yystack[ $this->yyidx + - 2 ]->minor .
"' is undefined or not allowed by security setting");
}
}
- #line 868 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r113()
+ #line 860 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r111()
{
- $this->_retvalue = $this->yystack[$this->yyidx + 0]->minor;
+ $this->_retvalue = $this->yystack[ $this->yyidx + 0 ]->minor;
}
- #line 879 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r114()
+ #line 871 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r112()
{
$this->_retvalue =
- $this->compiler->compileVariable('\'' . substr($this->yystack[$this->yyidx + 0]->minor, 1) . '\'');
+ $this->compiler->compileVariable('\'' . substr($this->yystack[ $this->yyidx + 0 ]->minor, 1) . '\'');
}
- #line 882 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r115()
+ #line 874 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r113()
{
- if ($this->yystack[$this->yyidx + 0]->minor['var'] == '\'smarty\'') {
+ if ($this->yystack[ $this->yyidx + 0 ]->minor[ 'var' ] == '\'smarty\'') {
$smarty_var = $this->compiler->compileTag('private_special_variable', array(),
- $this->yystack[$this->yyidx + 0]->minor['smarty_internal_index']);
+ $this->yystack[ $this->yyidx +
+ 0 ]->minor[ 'smarty_internal_index' ]);
$this->_retvalue = $smarty_var;
} else {
// used for array reset,next,prev,end,current
- $this->last_variable = $this->yystack[$this->yyidx + 0]->minor['var'];
- $this->last_index = $this->yystack[$this->yyidx + 0]->minor['smarty_internal_index'];
- $this->_retvalue = $this->compiler->compileVariable($this->yystack[$this->yyidx + 0]->minor['var']) .
- $this->yystack[$this->yyidx + 0]->minor['smarty_internal_index'];
+ $this->last_variable = $this->yystack[ $this->yyidx + 0 ]->minor[ 'var' ];
+ $this->last_index = $this->yystack[ $this->yyidx + 0 ]->minor[ 'smarty_internal_index' ];
+ $this->_retvalue = $this->compiler->compileVariable($this->yystack[ $this->yyidx + 0 ]->minor[ 'var' ]) .
+ $this->yystack[ $this->yyidx + 0 ]->minor[ 'smarty_internal_index' ];
}
}
- #line 895 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r116()
+ #line 887 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r114()
{
- $this->_retvalue = '$_smarty_tpl->tpl_vars[' . $this->yystack[$this->yyidx + - 2]->minor . ']->' .
- $this->yystack[$this->yyidx + 0]->minor;
+ $this->_retvalue = '$_smarty_tpl->tpl_vars[' . $this->yystack[ $this->yyidx + - 2 ]->minor . ']->' .
+ $this->yystack[ $this->yyidx + 0 ]->minor;
}
- #line 905 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r118()
+ #line 897 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r116()
{
$this->_retvalue =
- $this->compiler->compileConfigVariable("'" . $this->yystack[$this->yyidx + - 1]->minor . "'");
+ $this->compiler->compileConfigVariable("'" . $this->yystack[ $this->yyidx + - 1 ]->minor . "'");
}
- #line 909 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r119()
+ #line 901 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r117()
{
$this->_retvalue = '(is_array($tmp = ' .
- $this->compiler->compileConfigVariable("'" . $this->yystack[$this->yyidx + - 2]->minor . "'") . ') ? $tmp' .
- $this->yystack[$this->yyidx + 0]->minor . ' :null)';
+ $this->compiler->compileConfigVariable("'" . $this->yystack[ $this->yyidx + - 2 ]->minor . "'") .
+ ') ? $tmp' . $this->yystack[ $this->yyidx + 0 ]->minor . ' :null)';
}
- #line 913 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r120()
+ #line 905 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r118()
{
- $this->_retvalue = $this->compiler->compileConfigVariable($this->yystack[$this->yyidx + - 1]->minor);
+ $this->_retvalue = $this->compiler->compileConfigVariable($this->yystack[ $this->yyidx + - 1 ]->minor);
}
- #line 917 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r121()
+ #line 909 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r119()
{
$this->_retvalue =
- '(is_array($tmp = ' . $this->compiler->compileConfigVariable($this->yystack[$this->yyidx + - 2]->minor) .
- ') ? $tmp' . $this->yystack[$this->yyidx + 0]->minor . ' : null)';
+ '(is_array($tmp = ' . $this->compiler->compileConfigVariable($this->yystack[ $this->yyidx + - 2 ]->minor) .
+ ') ? $tmp' . $this->yystack[ $this->yyidx + 0 ]->minor . ' : null)';
}
- #line 921 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r122()
+ #line 913 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r120()
{
- $this->_retvalue = array('var' => '\'' . substr($this->yystack[$this->yyidx + - 1]->minor, 1) . '\'',
- 'smarty_internal_index' => $this->yystack[$this->yyidx + 0]->minor);
+ $this->_retvalue = array('var' => '\'' . substr($this->yystack[ $this->yyidx + - 1 ]->minor, 1) . '\'',
+ 'smarty_internal_index' => $this->yystack[ $this->yyidx + 0 ]->minor);
}
- #line 924 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r123()
+ #line 916 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r121()
{
- $this->_retvalue = array('var' => $this->yystack[$this->yyidx + - 1]->minor,
- 'smarty_internal_index' => $this->yystack[$this->yyidx + 0]->minor);
+ $this->_retvalue = array('var' => $this->yystack[ $this->yyidx + - 1 ]->minor,
+ 'smarty_internal_index' => $this->yystack[ $this->yyidx + 0 ]->minor);
}
- #line 937 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r125()
+ #line 929 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r123()
{
return;
}
- #line 943 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r126()
+ #line 935 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r124()
{
$this->_retvalue =
- '[' . $this->compiler->compileVariable('\'' . substr($this->yystack[$this->yyidx + 0]->minor, 1) . '\'') .
+ '[' . $this->compiler->compileVariable('\'' . substr($this->yystack[ $this->yyidx + 0 ]->minor, 1) . '\'') .
']';
}
- #line 946 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r127()
+ #line 938 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r125()
{
- $this->_retvalue = '[' . $this->compiler->compileVariable($this->yystack[$this->yyidx + 0]->minor) . ']';
+ $this->_retvalue = '[' . $this->compiler->compileVariable($this->yystack[ $this->yyidx + 0 ]->minor) . ']';
}
- #line 950 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r128()
+ #line 942 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r126()
{
- $this->_retvalue = '[' . $this->compiler->compileVariable($this->yystack[$this->yyidx + - 2]->minor) . '->' .
- $this->yystack[$this->yyidx + 0]->minor . ']';
+ $this->_retvalue = '[' . $this->compiler->compileVariable($this->yystack[ $this->yyidx + - 2 ]->minor) . '->' .
+ $this->yystack[ $this->yyidx + 0 ]->minor . ']';
}
- #line 954 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r129()
+ #line 946 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r127()
{
- if (defined($this->yystack[$this->yyidx + 0]->minor)) {
+ if (defined($this->yystack[ $this->yyidx + 0 ]->minor)) {
if ($this->security) {
- $this->security->isTrustedConstant($this->yystack[$this->yyidx + 0]->minor, $this->compiler);
+ $this->security->isTrustedConstant($this->yystack[ $this->yyidx + 0 ]->minor, $this->compiler);
}
- $this->_retvalue = '[' . $this->yystack[$this->yyidx + 0]->minor . ']';
+ $this->_retvalue = '[' . $this->yystack[ $this->yyidx + 0 ]->minor . ']';
} else {
- $this->_retvalue = "['" . $this->yystack[$this->yyidx + 0]->minor . "']";
+ $this->_retvalue = "['" . $this->yystack[ $this->yyidx + 0 ]->minor . "']";
}
}
- #line 965 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r130()
+ #line 957 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r128()
{
- $this->_retvalue = '[' . $this->yystack[$this->yyidx + 0]->minor . ']';
+ $this->_retvalue = '[' . $this->yystack[ $this->yyidx + 0 ]->minor . ']';
}
- #line 970 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r131()
+ #line 962 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r129()
{
- $this->_retvalue = '[' . $this->yystack[$this->yyidx + - 1]->minor . ']';
+ $this->_retvalue = '[' . $this->yystack[ $this->yyidx + - 1 ]->minor . ']';
}
- #line 975 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r132()
+ #line 967 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r130()
{
$this->_retvalue = '[' . $this->compiler->compileTag('private_special_variable', array(), '[\'section\'][\'' .
- $this->yystack[$this->yyidx +
- - 1]->minor . '\'][\'index\']') .
- ']';
+ $this->yystack[ $this->yyidx +
+ - 1 ]->minor .
+ '\'][\'index\']') . ']';
}
- #line 979 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r133()
+ #line 971 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r131()
{
$this->_retvalue = '[' . $this->compiler->compileTag('private_special_variable', array(), '[\'section\'][\'' .
- $this->yystack[$this->yyidx +
- - 3]->minor . '\'][\'' .
- $this->yystack[$this->yyidx +
- - 1]->minor . '\']') . ']';
+ $this->yystack[ $this->yyidx +
+ - 3 ]->minor . '\'][\'' .
+ $this->yystack[ $this->yyidx +
+ - 1 ]->minor . '\']') . ']';
}
- #line 982 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r134()
+ #line 974 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r132()
{
- $this->_retvalue = '[' . $this->yystack[$this->yyidx + - 1]->minor . ']';
+ $this->_retvalue = '[' . $this->yystack[ $this->yyidx + - 1 ]->minor . ']';
}
- #line 988 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r136()
+ #line 980 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r134()
{
- $this->_retvalue =
- '[' . $this->compiler->compileVariable('\'' . substr($this->yystack[$this->yyidx + - 1]->minor, 1) . '\'') .
+ $this->_retvalue = '[' .
+ $this->compiler->compileVariable('\'' . substr($this->yystack[ $this->yyidx + - 1 ]->minor, 1) . '\'') .
']';;
}
- #line 1004 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r140()
+ #line 996 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r138()
{
$this->_retvalue = '[]';
}
- #line 1014 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r141()
+ #line 1006 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r139()
{
- $this->_retvalue = '\'' . substr($this->yystack[$this->yyidx + 0]->minor, 1) . '\'';
+ $this->_retvalue = '\'' . substr($this->yystack[ $this->yyidx + 0 ]->minor, 1) . '\'';
}
- #line 1018 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r142()
+ #line 1010 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r140()
{
$this->_retvalue = "''";
}
- #line 1023 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r143()
+ #line 1015 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r141()
{
- $this->_retvalue = $this->yystack[$this->yyidx + - 1]->minor . '.' . $this->yystack[$this->yyidx + 0]->minor;
+ $this->_retvalue =
+ $this->yystack[ $this->yyidx + - 1 ]->minor . '.' . $this->yystack[ $this->yyidx + 0 ]->minor;
}
- #line 1031 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r145()
+ #line 1023 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r143()
{
- $var = trim(substr($this->yystack[$this->yyidx + 0]->minor, $this->lex->ldel_length, - $this->lex->rdel_length),
- ' $');
+ $var =
+ trim(substr($this->yystack[ $this->yyidx + 0 ]->minor, $this->lex->ldel_length, - $this->lex->rdel_length),
+ ' $');
$this->_retvalue = $this->compiler->compileVariable('\'' . $var . '\'');
}
- #line 1037 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r146()
+ #line 1029 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r144()
{
- $this->_retvalue = '(' . $this->yystack[$this->yyidx + - 1]->minor . ')';
+ $this->_retvalue = '(' . $this->yystack[ $this->yyidx + - 1 ]->minor . ')';
}
- #line 1044 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r147()
+ #line 1036 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r145()
{
- if ($this->yystack[$this->yyidx + - 1]->minor['var'] == '\'smarty\'') {
+ if ($this->yystack[ $this->yyidx + - 1 ]->minor[ 'var' ] == '\'smarty\'') {
$this->_retvalue = $this->compiler->compileTag('private_special_variable', array(),
- $this->yystack[$this->yyidx +
- - 1]->minor['smarty_internal_index']) .
- $this->yystack[$this->yyidx + 0]->minor;
+ $this->yystack[ $this->yyidx +
+ - 1 ]->minor[ 'smarty_internal_index' ]) .
+ $this->yystack[ $this->yyidx + 0 ]->minor;
} else {
- $this->_retvalue = $this->compiler->compileVariable($this->yystack[$this->yyidx + - 1]->minor['var']) .
- $this->yystack[$this->yyidx + - 1]->minor['smarty_internal_index'] .
- $this->yystack[$this->yyidx + 0]->minor;
+ $this->_retvalue = $this->compiler->compileVariable($this->yystack[ $this->yyidx + - 1 ]->minor[ 'var' ]) .
+ $this->yystack[ $this->yyidx + - 1 ]->minor[ 'smarty_internal_index' ] .
+ $this->yystack[ $this->yyidx + 0 ]->minor;
}
}
- #line 1053 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r148()
+ #line 1045 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r146()
{
- $this->_retvalue = $this->yystack[$this->yyidx + 0]->minor;
+ $this->_retvalue = $this->yystack[ $this->yyidx + 0 ]->minor;
}
- #line 1058 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r149()
+ #line 1050 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r147()
{
- $this->_retvalue = $this->yystack[$this->yyidx + - 1]->minor . $this->yystack[$this->yyidx + 0]->minor;
+ $this->_retvalue = $this->yystack[ $this->yyidx + - 1 ]->minor . $this->yystack[ $this->yyidx + 0 ]->minor;
}
- #line 1063 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r150()
+ #line 1055 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r148()
{
- if ($this->security && substr($this->yystack[$this->yyidx + - 1]->minor, 0, 1) == '_') {
+ if ($this->security && substr($this->yystack[ $this->yyidx + - 1 ]->minor, 0, 1) == '_') {
$this->compiler->trigger_template_error(self::Err1);
}
- $this->_retvalue = '->' . $this->yystack[$this->yyidx + - 1]->minor . $this->yystack[$this->yyidx + 0]->minor;
+ $this->_retvalue =
+ '->' . $this->yystack[ $this->yyidx + - 1 ]->minor . $this->yystack[ $this->yyidx + 0 ]->minor;
}
- #line 1070 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r151()
+ #line 1062 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r149()
{
if ($this->security) {
$this->compiler->trigger_template_error(self::Err2);
}
- $this->_retvalue = '->{' . $this->compiler->compileVariable($this->yystack[$this->yyidx + - 1]->minor) .
- $this->yystack[$this->yyidx + 0]->minor . '}';
+ $this->_retvalue = '->{' . $this->compiler->compileVariable($this->yystack[ $this->yyidx + - 1 ]->minor) .
+ $this->yystack[ $this->yyidx + 0 ]->minor . '}';
}
- #line 1077 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r152()
+ #line 1069 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r150()
{
if ($this->security) {
$this->compiler->trigger_template_error(self::Err2);
}
$this->_retvalue =
- '->{' . $this->yystack[$this->yyidx + - 2]->minor . $this->yystack[$this->yyidx + 0]->minor . '}';
+ '->{' . $this->yystack[ $this->yyidx + - 2 ]->minor . $this->yystack[ $this->yyidx + 0 ]->minor . '}';
}
- #line 1084 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r153()
+ #line 1076 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r151()
{
if ($this->security) {
$this->compiler->trigger_template_error(self::Err2);
}
- $this->_retvalue =
- '->{\'' . $this->yystack[$this->yyidx + - 4]->minor . '\'.' . $this->yystack[$this->yyidx + - 2]->minor .
- $this->yystack[$this->yyidx + 0]->minor . '}';
+ $this->_retvalue = '->{\'' . $this->yystack[ $this->yyidx + - 4 ]->minor . '\'.' .
+ $this->yystack[ $this->yyidx + - 2 ]->minor . $this->yystack[ $this->yyidx + 0 ]->minor . '}';
}
- #line 1092 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r154()
+ #line 1084 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r152()
{
- $this->_retvalue = '->' . $this->yystack[$this->yyidx + 0]->minor;
+ $this->_retvalue = '->' . $this->yystack[ $this->yyidx + 0 ]->minor;
}
- #line 1100 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r155()
+ #line 1092 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r153()
{
if (!$this->security ||
- $this->security->isTrustedPhpFunction($this->yystack[$this->yyidx + - 3]->minor, $this->compiler)
+ $this->security->isTrustedPhpFunction($this->yystack[ $this->yyidx + - 3 ]->minor, $this->compiler)
) {
- if (strcasecmp($this->yystack[$this->yyidx + - 3]->minor, 'isset') === 0 ||
- strcasecmp($this->yystack[$this->yyidx + - 3]->minor, 'empty') === 0 ||
- strcasecmp($this->yystack[$this->yyidx + - 3]->minor, 'array') === 0 ||
- is_callable($this->yystack[$this->yyidx + - 3]->minor)
+ if (strcasecmp($this->yystack[ $this->yyidx + - 3 ]->minor, 'isset') === 0 ||
+ strcasecmp($this->yystack[ $this->yyidx + - 3 ]->minor, 'empty') === 0 ||
+ strcasecmp($this->yystack[ $this->yyidx + - 3 ]->minor, 'array') === 0 ||
+ is_callable($this->yystack[ $this->yyidx + - 3 ]->minor)
) {
- $func_name = strtolower($this->yystack[$this->yyidx + - 3]->minor);
+ $func_name = strtolower($this->yystack[ $this->yyidx + - 3 ]->minor);
if ($func_name == 'isset') {
- if (count($this->yystack[$this->yyidx + - 1]->minor) == 0) {
+ if (count($this->yystack[ $this->yyidx + - 1 ]->minor) == 0) {
$this->compiler->trigger_template_error('Illegal number of paramer in "isset()"');
}
- $par = implode(',', $this->yystack[$this->yyidx + - 1]->minor);
+ $par = implode(',', $this->yystack[ $this->yyidx + - 1 ]->minor);
if (strncasecmp($par, '$_smarty_tpl->smarty->ext->_config->_getConfigVariable',
strlen('$_smarty_tpl->smarty->ext->_config->_getConfigVariable')) === 0
) {
@@ -2460,131 +2435,130 @@ class Smarty_Internal_Templateparser
} else {
$isset_par = str_replace("')->value", "',null,true,false)->value", $par);
}
- $this->_retvalue = $this->yystack[$this->yyidx + - 3]->minor . "(" . $isset_par . ")";
+ $this->_retvalue = $this->yystack[ $this->yyidx + - 3 ]->minor . "(" . $isset_par . ")";
} elseif (in_array($func_name, array('empty', 'reset', 'current', 'end', 'prev', 'next'))) {
- if (count($this->yystack[$this->yyidx + - 1]->minor) != 1) {
+ if (count($this->yystack[ $this->yyidx + - 1 ]->minor) != 1) {
$this->compiler->trigger_template_error('Illegal number of paramer in "empty()"');
}
if ($func_name == 'empty') {
$this->_retvalue = $func_name . '(' . str_replace("')->value", "',null,true,false)->value",
- $this->yystack[$this->yyidx +
- - 1]->minor[0]) . ')';
+ $this->yystack[ $this->yyidx +
+ - 1 ]->minor[ 0 ]) . ')';
} else {
- $this->_retvalue = $func_name . '(' . $this->yystack[$this->yyidx + - 1]->minor[0] . ')';
+ $this->_retvalue = $func_name . '(' . $this->yystack[ $this->yyidx + - 1 ]->minor[ 0 ] . ')';
}
} else {
- $this->_retvalue = $this->yystack[$this->yyidx + - 3]->minor . "(" .
- implode(',', $this->yystack[$this->yyidx + - 1]->minor) . ")";
+ $this->_retvalue = $this->yystack[ $this->yyidx + - 3 ]->minor . "(" .
+ implode(',', $this->yystack[ $this->yyidx + - 1 ]->minor) . ")";
}
} else {
$this->compiler->trigger_template_error("unknown function \"" .
- $this->yystack[$this->yyidx + - 3]->minor . "\"");
+ $this->yystack[ $this->yyidx + - 3 ]->minor . "\"");
}
}
}
- #line 1139 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r156()
+ #line 1131 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r154()
{
- if ($this->security && substr($this->yystack[$this->yyidx + - 3]->minor, 0, 1) == '_') {
+ if ($this->security && substr($this->yystack[ $this->yyidx + - 3 ]->minor, 0, 1) == '_') {
$this->compiler->trigger_template_error(self::Err1);
}
- $this->_retvalue =
- $this->yystack[$this->yyidx + - 3]->minor . "(" . implode(',', $this->yystack[$this->yyidx + - 1]->minor) .
- ")";
+ $this->_retvalue = $this->yystack[ $this->yyidx + - 3 ]->minor . "(" .
+ implode(',', $this->yystack[ $this->yyidx + - 1 ]->minor) . ")";
}
- #line 1146 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r157()
+ #line 1138 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r155()
{
if ($this->security) {
$this->compiler->trigger_template_error(self::Err2);
}
self::$prefix_number ++;
$this->compiler->prefix_code[] = '<?php $_tmp' . self::$prefix_number . '=' .
- $this->compiler->compileVariable('\'' . substr($this->yystack[$this->yyidx + - 3]->minor, 1) . '\'') .
+ $this->compiler->compileVariable('\'' . substr($this->yystack[ $this->yyidx + - 3 ]->minor, 1) . '\'') .
';?>';
$this->_retvalue =
- '$_tmp' . self::$prefix_number . '(' . implode(',', $this->yystack[$this->yyidx + - 1]->minor) . ')';
+ '$_tmp' . self::$prefix_number . '(' . implode(',', $this->yystack[ $this->yyidx + - 1 ]->minor) . ')';
}
- #line 1157 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r158()
+ #line 1149 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r156()
{
$this->_retvalue =
- array_merge($this->yystack[$this->yyidx + - 2]->minor, array($this->yystack[$this->yyidx + 0]->minor));
+ array_merge($this->yystack[ $this->yyidx + - 2 ]->minor, array($this->yystack[ $this->yyidx + 0 ]->minor));
}
- #line 1174 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r161()
+ #line 1166 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r159()
{
- $this->_retvalue = array_merge($this->yystack[$this->yyidx + - 2]->minor,
- array(array_merge($this->yystack[$this->yyidx + - 1]->minor,
- $this->yystack[$this->yyidx + 0]->minor)));
+ $this->_retvalue = array_merge($this->yystack[ $this->yyidx + - 2 ]->minor,
+ array(array_merge($this->yystack[ $this->yyidx + - 1 ]->minor,
+ $this->yystack[ $this->yyidx + 0 ]->minor)));
}
- #line 1178 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r162()
+ #line 1170 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r160()
{
$this->_retvalue =
- array(array_merge($this->yystack[$this->yyidx + - 1]->minor, $this->yystack[$this->yyidx + 0]->minor));
+ array(array_merge($this->yystack[ $this->yyidx + - 1 ]->minor, $this->yystack[ $this->yyidx + 0 ]->minor));
}
- #line 1186 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r164()
+ #line 1178 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r162()
{
- $this->_retvalue = array($this->yystack[$this->yyidx + 0]->minor);
+ $this->_retvalue = array($this->yystack[ $this->yyidx + 0 ]->minor);
}
- #line 1194 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r165()
+ #line 1186 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r163()
{
$this->_retvalue =
- array_merge($this->yystack[$this->yyidx + - 1]->minor, $this->yystack[$this->yyidx + 0]->minor);
+ array_merge($this->yystack[ $this->yyidx + - 1 ]->minor, $this->yystack[ $this->yyidx + 0 ]->minor);
}
- #line 1213 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r169()
+ #line 1205 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r167()
{
- $this->_retvalue = array($this->yystack[$this->yyidx + 0]->minor, '', 'method');
+ $this->_retvalue = array($this->yystack[ $this->yyidx + 0 ]->minor, '', 'method');
}
- #line 1218 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r170()
+ #line 1210 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r168()
{
$this->_retvalue =
- array($this->yystack[$this->yyidx + - 1]->minor, $this->yystack[$this->yyidx + 0]->minor, 'method');
+ array($this->yystack[ $this->yyidx + - 1 ]->minor, $this->yystack[ $this->yyidx + 0 ]->minor, 'method');
}
- #line 1223 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r171()
+ #line 1215 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r169()
{
- $this->_retvalue = array($this->yystack[$this->yyidx + 0]->minor, '');
+ $this->_retvalue = array($this->yystack[ $this->yyidx + 0 ]->minor, '');
}
- #line 1228 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r172()
+ #line 1220 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r170()
{
$this->_retvalue =
- array($this->yystack[$this->yyidx + - 1]->minor, $this->yystack[$this->yyidx + 0]->minor, 'property');
+ array($this->yystack[ $this->yyidx + - 1 ]->minor, $this->yystack[ $this->yyidx + 0 ]->minor, 'property');
}
- #line 1233 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r173()
+ #line 1225 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r171()
{
- $this->_retvalue = array($this->yystack[$this->yyidx + - 2]->minor,
- $this->yystack[$this->yyidx + - 1]->minor . $this->yystack[$this->yyidx + 0]->minor,
- 'property');
+ $this->_retvalue = array($this->yystack[ $this->yyidx + - 2 ]->minor,
+ $this->yystack[ $this->yyidx + - 1 ]->minor .
+ $this->yystack[ $this->yyidx + 0 ]->minor, 'property');
}
- #line 1239 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r174()
+ #line 1231 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r172()
{
- $this->_retvalue['op'] = ' ' . trim($this->yystack[$this->yyidx + 0]->minor) . ' ';
+ $this->_retvalue[ 'op' ] = ' ' . trim($this->yystack[ $this->yyidx + 0 ]->minor) . ' ';
}
- #line 1243 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r175()
+ #line 1235 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r173()
{
static $lops = array('eq' => array('op' => ' == ', 'pre' => null),
'ne' => array('op' => ' != ', 'pre' => null),
@@ -2605,94 +2579,96 @@ class Smarty_Internal_Templateparser
'isnotevenby' => array('op' => ' / ', 'pre' => '(1 & '),
'isoddby' => array('op' => ' / ', 'pre' => '(1 & '),
'isnotoddby' => array('op' => ' / ', 'pre' => '!(1 & '),);
- $op = strtolower(preg_replace('/\s*/', '', $this->yystack[$this->yyidx + 0]->minor));
- $this->_retvalue = $lops[$op];
+ $op = strtolower(preg_replace('/\s*/', '', $this->yystack[ $this->yyidx + 0 ]->minor));
+ $this->_retvalue = $lops[ $op ];
}
- #line 1269 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r176()
+ #line 1261 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r174()
{
- static $scond = array('iseven' => '!(1 & ', 'isnoteven' => '(1 & ', 'isodd' => '(1 & ',
- 'isnotodd' => '!(1 & ',);
- $op = strtolower(str_replace(' ', '', $this->yystack[$this->yyidx + 0]->minor));
- $this->_retvalue = $scond[$op];
+ static $scond =
+ array('iseven' => '!(1 & ', 'isnoteven' => '(1 & ', 'isodd' => '(1 & ', 'isnotodd' => '!(1 & ',);
+ $op = strtolower(str_replace(' ', '', $this->yystack[ $this->yyidx + 0 ]->minor));
+ $this->_retvalue = $scond[ $op ];
+ }
+
+ #line 1275 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r175()
+ {
+ $this->_retvalue = 'array(' . $this->yystack[ $this->yyidx + - 1 ]->minor . ')';
}
#line 1283 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r177()
{
- $this->_retvalue = 'array(' . $this->yystack[$this->yyidx + - 1]->minor . ')';
+ $this->_retvalue =
+ $this->yystack[ $this->yyidx + - 2 ]->minor . ',' . $this->yystack[ $this->yyidx + 0 ]->minor;
}
#line 1291 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r179()
{
- $this->_retvalue = $this->yystack[$this->yyidx + - 2]->minor . ',' . $this->yystack[$this->yyidx + 0]->minor;
+ $this->_retvalue =
+ $this->yystack[ $this->yyidx + - 2 ]->minor . '=>' . $this->yystack[ $this->yyidx + 0 ]->minor;
}
- #line 1299 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r181()
+ #line 1295 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r180()
{
- $this->_retvalue = $this->yystack[$this->yyidx + - 2]->minor . '=>' . $this->yystack[$this->yyidx + 0]->minor;
+ $this->_retvalue =
+ '\'' . $this->yystack[ $this->yyidx + - 2 ]->minor . '\'=>' . $this->yystack[ $this->yyidx + 0 ]->minor;
}
- #line 1303 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r182()
+ #line 1311 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r183()
{
- $this->_retvalue =
- '\'' . $this->yystack[$this->yyidx + - 2]->minor . '\'=>' . $this->yystack[$this->yyidx + 0]->minor;
+ $this->_retvalue = $this->yystack[ $this->yyidx + - 1 ]->minor->to_smarty_php($this);
}
- #line 1319 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r185()
+ #line 1316 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r184()
{
- $this->_retvalue = $this->yystack[$this->yyidx + - 1]->minor->to_smarty_php($this);
+ $this->yystack[ $this->yyidx + - 1 ]->minor->append_subtree($this, $this->yystack[ $this->yyidx + 0 ]->minor);
+ $this->_retvalue = $this->yystack[ $this->yyidx + - 1 ]->minor;
}
- #line 1324 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r186()
+ #line 1321 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r185()
{
- $this->yystack[$this->yyidx + - 1]->minor->append_subtree($this, $this->yystack[$this->yyidx + 0]->minor);
- $this->_retvalue = $this->yystack[$this->yyidx + - 1]->minor;
+ $this->_retvalue = new Smarty_Internal_ParseTree_Dq($this, $this->yystack[ $this->yyidx + 0 ]->minor);
}
- #line 1329 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r187()
+ #line 1325 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r186()
{
- $this->_retvalue = new Smarty_Internal_ParseTree_Dq($this, $this->yystack[$this->yyidx + 0]->minor);
+ $this->_retvalue = new Smarty_Internal_ParseTree_Code('(string)' . $this->yystack[ $this->yyidx + - 1 ]->minor);
}
#line 1333 "../smarty/lexer/smarty_internal_templateparser.y"
function yy_r188()
{
- $this->_retvalue = new Smarty_Internal_ParseTree_Code('(string)' . $this->yystack[$this->yyidx + - 1]->minor);
- }
-
- #line 1341 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r190()
- {
$this->_retvalue = new Smarty_Internal_ParseTree_Code('(string)$_smarty_tpl->tpl_vars[\'' .
- substr($this->yystack[$this->yyidx + 0]->minor, 1) .
+ substr($this->yystack[ $this->yyidx + 0 ]->minor, 1) .
'\']->value');
}
- #line 1349 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r192()
+ #line 1341 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r190()
{
$this->_retvalue =
- new Smarty_Internal_ParseTree_Code('(string)(' . $this->yystack[$this->yyidx + - 1]->minor . ')');
+ new Smarty_Internal_ParseTree_Code('(string)(' . $this->yystack[ $this->yyidx + - 1 ]->minor . ')');
}
- #line 1353 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r193()
+ #line 1345 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r191()
{
- $this->_retvalue = new Smarty_Internal_ParseTree_Tag($this, $this->yystack[$this->yyidx + 0]->minor);
+ $this->_retvalue = new Smarty_Internal_ParseTree_Tag($this, $this->yystack[ $this->yyidx + 0 ]->minor);
}
- #line 1357 "../smarty/lexer/smarty_internal_templateparser.y"
- function yy_r194()
+ #line 1349 "../smarty/lexer/smarty_internal_templateparser.y"
+ function yy_r192()
{
- $this->_retvalue = new Smarty_Internal_ParseTree_DqContent($this->yystack[$this->yyidx + 0]->minor);
+ $this->_retvalue = new Smarty_Internal_ParseTree_DqContent($this->yystack[ $this->yyidx + 0 ]->minor);
}
private $_retvalue;
@@ -2701,24 +2677,24 @@ class Smarty_Internal_Templateparser
{
if ($this->yyTraceFILE && $yyruleno >= 0 && $yyruleno < count(self::$yyRuleName)) {
fprintf($this->yyTraceFILE, "%sReduce (%d) [%s].\n", $this->yyTracePrompt, $yyruleno,
- self::$yyRuleName[$yyruleno]);
+ self::$yyRuleName[ $yyruleno ]);
}
$this->_retvalue = $yy_lefthand_side = null;
- if (isset(self::$yyReduceMap[$yyruleno])) {
+ if (isset(self::$yyReduceMap[ $yyruleno ])) {
// call the action
$this->_retvalue = null;
- $this->{'yy_r' . self::$yyReduceMap[$yyruleno]}();
+ $this->{'yy_r' . self::$yyReduceMap[ $yyruleno ]}();
$yy_lefthand_side = $this->_retvalue;
}
- $yygoto = self::$yyRuleInfo[$yyruleno][0];
- $yysize = self::$yyRuleInfo[$yyruleno][1];
+ $yygoto = self::$yyRuleInfo[ $yyruleno ][ 0 ];
+ $yysize = self::$yyRuleInfo[ $yyruleno ][ 1 ];
$this->yyidx -= $yysize;
for ($i = $yysize; $i; $i --) {
// pop all of the right-hand side parameters
array_pop($this->yystack);
}
- $yyact = $this->yy_find_reduce_action($this->yystack[$this->yyidx]->stateno, $yygoto);
+ $yyact = $this->yy_find_reduce_action($this->yystack[ $this->yyidx ]->stateno, $yygoto);
if ($yyact < self::YYNSTATE) {
if (!$this->yyTraceFILE && $yysize) {
$this->yyidx ++;
@@ -2726,7 +2702,7 @@ class Smarty_Internal_Templateparser
$x->stateno = $yyact;
$x->major = $yygoto;
$x->minor = $yy_lefthand_side;
- $this->yystack[$this->yyidx] = $x;
+ $this->yystack[ $this->yyidx ] = $x;
} else {
$this->yy_shift($yyact, $yygoto, $yy_lefthand_side);
}
@@ -2785,7 +2761,7 @@ class Smarty_Internal_Templateparser
$yyendofinput = ($yymajor == 0);
if ($this->yyTraceFILE) {
- fprintf($this->yyTraceFILE, "%sInput %s\n", $this->yyTracePrompt, $this->yyTokenName[$yymajor]);
+ fprintf($this->yyTraceFILE, "%sInput %s\n", $this->yyTracePrompt, $this->yyTokenName[ $yymajor ]);
}
do {
@@ -2812,11 +2788,11 @@ class Smarty_Internal_Templateparser
if ($this->yyerrcnt < 0) {
$this->yy_syntax_error($yymajor, $yytokenvalue);
}
- $yymx = $this->yystack[$this->yyidx]->major;
+ $yymx = $this->yystack[ $this->yyidx ]->major;
if ($yymx == self::YYERRORSYMBOL || $yyerrorhit) {
if ($this->yyTraceFILE) {
fprintf($this->yyTraceFILE, "%sDiscard input token %s\n", $this->yyTracePrompt,
- $this->yyTokenName[$yymajor]);
+ $this->yyTokenName[ $yymajor ]);
}
$this->yy_destructor($yymajor, $yytokenvalue);
$yymajor = self::YYNOCODE;
diff --git a/library/Smarty/libs/sysplugins/smarty_resource.php b/library/Smarty/libs/sysplugins/smarty_resource.php
index 72611255e..93d9fa7a3 100644
--- a/library/Smarty/libs/sysplugins/smarty_resource.php
+++ b/library/Smarty/libs/sysplugins/smarty_resource.php
@@ -240,6 +240,16 @@ abstract class Smarty_Resource
return $resource->buildUniqueResourceName($smarty, $name);
}
+ /*
+ * Check if resource must check time stamps when when loading complied or cached templates.
+ * Resources like 'extends' which use source components my disable timestamp checks on own resource.
+ *
+ * @return bool
+ */
+ public function checkTimestamps() {
+ return true;
+ }
+
/**
* initialize Source Object for given resource
* wrapper for backward compatibility to versions < 3.1.22
diff --git a/library/Smarty/libs/sysplugins/smarty_template_resource_base.php b/library/Smarty/libs/sysplugins/smarty_template_resource_base.php
index b9e2e2830..0911feb8d 100644
--- a/library/Smarty/libs/sysplugins/smarty_template_resource_base.php
+++ b/library/Smarty/libs/sysplugins/smarty_template_resource_base.php
@@ -80,13 +80,6 @@ abstract class Smarty_Template_Resource_Base
public $required_plugins = array();
/**
- * Known template functions
- *
- * @var array
- */
- public $tpl_function = array();
-
- /**
* Included subtemplates
*
* @var array
diff --git a/library/jquery-textcomplete/jquery.textcomplete.js b/library/jquery-textcomplete/jquery.textcomplete.js
index 3df84f3b4..95e75149c 100644
--- a/library/jquery-textcomplete/jquery.textcomplete.js
+++ b/library/jquery-textcomplete/jquery.textcomplete.js
@@ -1,3 +1,16 @@
+(function (factory) {
+ if (typeof define === 'function' && define.amd) {
+ // AMD. Register as an anonymous module.
+ define(['jquery'], factory);
+ } else if (typeof module === "object" && module.exports) {
+ var $ = require('jquery');
+ module.exports = factory($);
+ } else {
+ // Browser globals
+ factory(jQuery);
+ }
+}(function (jQuery) {
+
/*!
* jQuery.textcomplete
*
@@ -17,13 +30,18 @@ if (typeof jQuery === 'undefined') {
if (console.warn) { console.warn(message); }
};
+ var id = 1;
+
$.fn.textcomplete = function (strategies, option) {
var args = Array.prototype.slice.call(arguments);
return this.each(function () {
+ var self = this;
var $this = $(this);
var completer = $this.data('textComplete');
if (!completer) {
- completer = new $.fn.textcomplete.Completer(this, option || {});
+ option || (option = {});
+ option._oid = id++; // unique object id
+ completer = new $.fn.textcomplete.Completer(this, option);
$this.data('textComplete', completer);
}
if (typeof strategies === 'string') {
@@ -45,7 +63,10 @@ if (typeof jQuery === 'undefined') {
}
});
});
- completer.register($.fn.textcomplete.Strategy.parse(strategies));
+ completer.register($.fn.textcomplete.Strategy.parse(strategies, {
+ el: self,
+ $el: $this
+ }));
}
});
};
@@ -115,6 +136,10 @@ if (typeof jQuery === 'undefined') {
return Object.prototype.toString.call(obj) === '[object String]';
};
+ var isFunction = function (obj) {
+ return Object.prototype.toString.call(obj) === '[object Function]';
+ };
+
var uniqueId = 0;
function Completer(element, option) {
@@ -124,7 +149,7 @@ if (typeof jQuery === 'undefined') {
this.views = [];
this.option = $.extend({}, Completer._getDefaults(), option);
- if (!this.$el.is('input[type=text]') && !this.$el.is('textarea') && !element.isContentEditable && element.contentEditable != 'true') {
+ if (!this.$el.is('input[type=text]') && !this.$el.is('input[type=search]') && !this.$el.is('textarea') && !element.isContentEditable && element.contentEditable != 'true') {
throw new Error('textcomplete must be called on a Textarea or a ContentEditable.');
}
@@ -171,7 +196,7 @@ if (typeof jQuery === 'undefined') {
if (this.option.adapter) {
Adapter = this.option.adapter;
} else {
- if (this.$el.is('textarea') || this.$el.is('input[type=text]')) {
+ if (this.$el.is('textarea') || this.$el.is('input[type=text]') || this.$el.is('input[type=search]')) {
viewName = typeof element.selectionEnd === 'number' ? 'Textarea' : 'IETextarea';
} else {
viewName = 'ContentEditable';
@@ -192,6 +217,12 @@ if (typeof jQuery === 'undefined') {
this.$el = this.adapter = this.dropdown = null;
},
+ deactivate: function () {
+ if (this.dropdown) {
+ this.dropdown.deactivate();
+ }
+ },
+
// Invoke textcomplete.
trigger: function (text, skipUnchangedTerm) {
if (!this.dropdown) { this.initialize(); }
@@ -200,7 +231,7 @@ if (typeof jQuery === 'undefined') {
if (searchQuery.length) {
var term = searchQuery[1];
// Ignore shift-key, ctrl-key and so on.
- if (skipUnchangedTerm && this._term === term) { return; }
+ if (skipUnchangedTerm && this._term === term && term !== "") { return; }
this._term = term;
this._search.apply(this, searchQuery);
} else {
@@ -224,8 +255,10 @@ if (typeof jQuery === 'undefined') {
//
// value - The selected element of the array callbacked from search func.
// strategy - The Strategy object.
- select: function (value, strategy) {
- this.adapter.select(value, strategy);
+ // e - Click or keydown event object.
+ select: function (value, strategy, e) {
+ this._term = null;
+ this.adapter.select(value, strategy, e);
this.fire('change').fire('textComplete:select', value, strategy);
this.adapter.focus();
},
@@ -248,8 +281,9 @@ if (typeof jQuery === 'undefined') {
var strategy = this.strategies[i];
var context = strategy.context(text);
if (context || context === '') {
+ var matchRegexp = isFunction(strategy.match) ? strategy.match(text) : strategy.match;
if (isString(context)) { text = context; }
- var match = text.match(strategy.match);
+ var match = text.match(matchRegexp);
if (match) { return [strategy, match[strategy.index], match]; }
}
}
@@ -262,14 +296,14 @@ if (typeof jQuery === 'undefined') {
strategy.search(term, function (data, stillSearching) {
if (!self.dropdown.shown) {
self.dropdown.activate();
- self.dropdown.setPosition(self.adapter.getCaretPosition());
}
if (self._clearAtNext) {
// The first callback in the current lock.
self.dropdown.clear();
self._clearAtNext = false;
}
- self.dropdown.render(self._zip(data, strategy));
+ self.dropdown.setPosition(self.adapter.getCaretPosition());
+ self.dropdown.render(self._zip(data, strategy, term));
if (!stillSearching) {
// The last callback in the current lock.
free();
@@ -284,9 +318,9 @@ if (typeof jQuery === 'undefined') {
//
// this._zip(['a', 'b'], 's');
// //=> [{ value: 'a', strategy: 's' }, { value: 'b', strategy: 's' }]
- _zip: function (data, strategy) {
+ _zip: function (data, strategy, term) {
return $.map(data, function (value) {
- return { value: value, strategy: strategy };
+ return { value: value, strategy: strategy, term: term };
});
}
});
@@ -297,6 +331,8 @@ if (typeof jQuery === 'undefined') {
+function ($) {
'use strict';
+ var $window = $(window);
+
var include = function (zippedData, datum) {
var i, elem;
var idProperty = datum.strategy.idProperty
@@ -320,6 +356,16 @@ if (typeof jQuery === 'undefined') {
});
});
+ var commands = {
+ SKIP_DEFAULT: 0,
+ KEY_UP: 1,
+ KEY_DOWN: 2,
+ KEY_ENTER: 3,
+ KEY_PAGEUP: 4,
+ KEY_PAGEDOWN: 5,
+ KEY_ESCAPE: 6
+ };
+
// Dropdown view
// =============
@@ -327,7 +373,7 @@ if (typeof jQuery === 'undefined') {
//
// element - Textarea or contenteditable element.
function Dropdown(element, completer, option) {
- this.$el = Dropdown.findOrCreateElement(option);
+ this.$el = Dropdown.createElement(option);
this.completer = completer;
this.id = completer.id + 'dropdown';
this._data = []; // zipped data.
@@ -338,7 +384,7 @@ if (typeof jQuery === 'undefined') {
if (option.listPosition) { this.setPosition = option.listPosition; }
if (option.height) { this.$el.height(option.height); }
var self = this;
- $.each(['maxCount', 'placement', 'footer', 'header', 'className'], function (_i, name) {
+ $.each(['maxCount', 'placement', 'footer', 'header', 'noResultsMessage', 'className'], function (_i, name) {
if (option[name] != null) { self[name] = option[name]; }
});
this._bindEvents(element);
@@ -349,18 +395,19 @@ if (typeof jQuery === 'undefined') {
// Class methods
// -------------
- findOrCreateElement: function (option) {
+ createElement: function (option) {
var $parent = option.appendTo;
if (!($parent instanceof $)) { $parent = $($parent); }
- var $el = $parent.children('.dropdown-menu')
- if (!$el.length) {
- $el = $('<ul class="dropdown-menu"></ul>').css({
+ var $el = $('<ul></ul>')
+ .addClass('dropdown-menu textcomplete-dropdown')
+ .attr('id', 'textcomplete-dropdown-' + option._oid)
+ .css({
display: 'none',
left: 0,
position: 'absolute',
zIndex: option.zIndex
- }).appendTo($parent);
- }
+ })
+ .appendTo($parent);
return $el;
}
});
@@ -391,6 +438,7 @@ if (typeof jQuery === 'undefined') {
this.$el.off('.' + this.id);
this.$inputEl.off('.' + this.id);
this.clear();
+ this.$el.remove();
this.$el = this.$inputEl = this.completer = null;
delete dropdownViews[this.id]
},
@@ -399,34 +447,45 @@ if (typeof jQuery === 'undefined') {
var contentsHtml = this._buildContents(zippedData);
var unzippedData = $.map(this.data, function (d) { return d.value; });
if (this.data.length) {
+ var strategy = zippedData[0].strategy;
+ if (strategy.id) {
+ this.$el.attr('data-strategy', strategy.id);
+ } else {
+ this.$el.removeAttr('data-strategy');
+ }
this._renderHeader(unzippedData);
this._renderFooter(unzippedData);
if (contentsHtml) {
this._renderContents(contentsHtml);
+ this._fitToBottom();
+ this._fitToRight();
this._activateIndexedItem();
}
this._setScroll();
+ } else if (this.noResultsMessage) {
+ this._renderNoResultsMessage(unzippedData);
} else if (this.shown) {
this.deactivate();
}
},
- setPosition: function (position) {
- this.$el.css(this._applyPlacement(position));
-
+ setPosition: function (pos) {
// Make the dropdown fixed if the input is also fixed
// This can't be done during init, as textcomplete may be used on multiple elements on the same page
// Because the same dropdown is reused behind the scenes, we need to recheck every time the dropdown is showed
var position = 'absolute';
// Check if input or one of its parents has positioning we need to care about
- this.$inputEl.add(this.$inputEl.parents()).each(function() {
+ this.$inputEl.add(this.$inputEl.parents()).each(function() {
if($(this).css('position') === 'absolute') // The element has absolute positioning, so it's all OK
return false;
if($(this).css('position') === 'fixed') {
+ pos.top -= $window.scrollTop();
+ pos.left -= $window.scrollLeft();
position = 'fixed';
return false;
}
});
+ this.$el.css(this._applyPlacement(pos));
this.$el.css({ position: position }); // Update positioning
return this;
@@ -436,7 +495,7 @@ if (typeof jQuery === 'undefined') {
this.$el.html('');
this.data = [];
this._index = 0;
- this._$header = this._$footer = null;
+ this._$header = this._$footer = this._$noResultsMessage = null;
},
activate: function () {
@@ -481,19 +540,25 @@ if (typeof jQuery === 'undefined') {
return e.keyCode === 34; // PAGEDOWN
},
+ isEscape: function (e) {
+ return e.keyCode === 27; // ESCAPE
+ },
+
// Private properties
// ------------------
_data: null, // Currently shown zipped data.
_index: null,
_$header: null,
+ _$noResultsMessage: null,
_$footer: null,
// Private methods
// ---------------
_bindEvents: function () {
- this.$el.on('mousedown.' + this.id, '.textcomplete-item', $.proxy(this._onClick, this))
+ this.$el.on('mousedown.' + this.id, '.textcomplete-item', $.proxy(this._onClick, this));
+ this.$el.on('touchstart.' + this.id, '.textcomplete-item', $.proxy(this._onClick, this));
this.$el.on('mouseover.' + this.id, '.textcomplete-item', $.proxy(this._onMouseover, this));
this.$inputEl.on('keydown.' + this.id, $.proxy(this._onKeydown, this));
},
@@ -506,11 +571,16 @@ if (typeof jQuery === 'undefined') {
$el = $el.closest('.textcomplete-item');
}
var datum = this.data[parseInt($el.data('index'), 10)];
- this.completer.select(datum.value, datum.strategy);
+ this.completer.select(datum.value, datum.strategy, e);
var self = this;
// Deactive at next tick to allow other event handlers to know whether
// the dropdown has been shown or not.
- setTimeout(function () { self.deactivate(); }, 0);
+ setTimeout(function () {
+ self.deactivate();
+ if (e.type === 'touchstart') {
+ self.$inputEl.focus();
+ }
+ }, 0);
},
// Activate hovered item.
@@ -526,21 +596,58 @@ if (typeof jQuery === 'undefined') {
_onKeydown: function (e) {
if (!this.shown) { return; }
+
+ var command;
+
+ if ($.isFunction(this.option.onKeydown)) {
+ command = this.option.onKeydown(e, commands);
+ }
+
+ if (command == null) {
+ command = this._defaultKeydown(e);
+ }
+
+ switch (command) {
+ case commands.KEY_UP:
+ e.preventDefault();
+ this._up();
+ break;
+ case commands.KEY_DOWN:
+ e.preventDefault();
+ this._down();
+ break;
+ case commands.KEY_ENTER:
+ e.preventDefault();
+ this._enter(e);
+ break;
+ case commands.KEY_PAGEUP:
+ e.preventDefault();
+ this._pageup();
+ break;
+ case commands.KEY_PAGEDOWN:
+ e.preventDefault();
+ this._pagedown();
+ break;
+ case commands.KEY_ESCAPE:
+ e.preventDefault();
+ this.deactivate();
+ break;
+ }
+ },
+
+ _defaultKeydown: function (e) {
if (this.isUp(e)) {
- e.preventDefault();
- this._up();
+ return commands.KEY_UP;
} else if (this.isDown(e)) {
- e.preventDefault();
- this._down();
+ return commands.KEY_DOWN;
} else if (this.isEnter(e)) {
- e.preventDefault();
- this._enter();
+ return commands.KEY_ENTER;
} else if (this.isPageup(e)) {
- e.preventDefault();
- this._pageup();
+ return commands.KEY_PAGEUP;
} else if (this.isPagedown(e)) {
- e.preventDefault();
- this._pagedown();
+ return commands.KEY_PAGEDOWN;
+ } else if (this.isEscape(e)) {
+ return commands.KEY_ESCAPE;
}
},
@@ -564,10 +671,10 @@ if (typeof jQuery === 'undefined') {
this._setScroll();
},
- _enter: function () {
+ _enter: function (e) {
var datum = this.data[parseInt(this._getActiveElement().data('index'), 10)];
- this.completer.select(datum.value, datum.strategy);
- this._setScroll();
+ this.completer.select(datum.value, datum.strategy, e);
+ this.deactivate();
},
_pageup: function () {
@@ -630,7 +737,7 @@ if (typeof jQuery === 'undefined') {
index = this.data.length;
this.data.push(datum);
html += '<li class="textcomplete-item" data-index="' + index + '"><a>';
- html += datum.strategy.template(datum.value);
+ html += datum.strategy.template(datum.value, datum.term);
html += '</a></li>';
}
return html;
@@ -656,6 +763,16 @@ if (typeof jQuery === 'undefined') {
}
},
+ _renderNoResultsMessage: function (unzippedData) {
+ if (this.noResultsMessage) {
+ if (!this._$noResultsMessage) {
+ this._$noResultsMessage = $('<li class="textcomplete-no-results-message"></li>').appendTo(this.$el);
+ }
+ var html = $.isFunction(this.noResultsMessage) ? this.noResultsMessage(unzippedData) : this.noResultsMessage;
+ this._$noResultsMessage.html(html);
+ }
+ },
+
_renderContents: function (html) {
if (this._$footer) {
this._$footer.before(html);
@@ -664,7 +781,32 @@ if (typeof jQuery === 'undefined') {
}
},
- _applyPlacement: function (position) {
+ _fitToBottom: function() {
+ var windowScrollBottom = $window.scrollTop() + $window.height();
+ var height = this.$el.height();
+ if ((this.$el.position().top + height) > windowScrollBottom) {
+ this.$el.offset({top: windowScrollBottom - height});
+ }
+ },
+
+ _fitToRight: function() {
+ // We don't know how wide our content is until the browser positions us, and at that point it clips us
+ // to the document width so we don't know if we would have overrun it. As a heuristic to avoid that clipping
+ // (which makes our elements wrap onto the next line and corrupt the next item), if we're close to the right
+ // edge, move left. We don't know how far to move left, so just keep nudging a bit.
+ var tolerance = 30; // pixels. Make wider than vertical scrollbar because we might not be able to use that space.
+ var lastOffset = this.$el.offset().left, offset;
+ var width = this.$el.width();
+ var maxLeft = $window.width() - tolerance;
+ while (lastOffset + width > maxLeft) {
+ this.$el.offset({left: lastOffset - tolerance});
+ offset = this.$el.offset().left;
+ if (offset >= lastOffset) { break; }
+ lastOffset = offset;
+ }
+ },
+
+ _applyPlacement: function (position) {
// If the 'placement' option set to 'top', move the position above the element.
if (this.placement.indexOf('top') !== -1) {
// Overwrite the position object to set the 'bottom' property instead of the top.
@@ -688,6 +830,7 @@ if (typeof jQuery === 'undefined') {
});
$.fn.textcomplete.Dropdown = Dropdown;
+ $.extend($.fn.textcomplete, commands);
}(jQuery);
+function ($) {
@@ -713,9 +856,12 @@ if (typeof jQuery === 'undefined') {
if (this.cache) { this.search = memoize(this.search); }
}
- Strategy.parse = function (optionsArray) {
- return $.map(optionsArray, function (options) {
- return new Strategy(options);
+ Strategy.parse = function (strategiesArray, params) {
+ return $.map(strategiesArray, function (strategy) {
+ var strategyObj = new Strategy(strategy);
+ strategyObj.el = params.el;
+ strategyObj.$el = params.$el;
+ return strategyObj;
});
};
@@ -729,6 +875,7 @@ if (typeof jQuery === 'undefined') {
search: null,
// Optional
+ id: null,
cache: false,
context: function () { return true; },
index: 2,
@@ -818,11 +965,19 @@ if (typeof jQuery === 'undefined') {
},
// Returns the caret's relative coordinates from body's left top corner.
- //
- // FIXME: Calculate the left top corner of `this.option.appendTo` element.
getCaretPosition: function () {
var position = this._getCaretRelativePosition();
var offset = this.$el.offset();
+
+ // Calculate the left top corner of `this.option.appendTo` element.
+ var $parent = this.option.appendTo;
+ if ($parent) {
+ if (!($parent instanceof $)) { $parent = $($parent); }
+ var parentOffset = $parent.offsetParent().offset();
+ offset.top -= parentOffset.top;
+ offset.left -= parentOffset.left;
+ }
+
position.top += offset.top;
position.left += offset.left;
return position;
@@ -848,6 +1003,8 @@ if (typeof jQuery === 'undefined') {
// Suppress searching if it returns true.
_skipSearch: function (clickEvent) {
switch (clickEvent.keyCode) {
+ case 9: // TAB
+ case 13: // ENTER
case 40: // DOWN
case 38: // UP
return true;
@@ -874,89 +1031,58 @@ if (typeof jQuery === 'undefined') {
this.initialize(element, completer, option);
}
- Textarea.DIV_PROPERTIES = {
- left: -9999,
- position: 'absolute',
- top: 0,
- whiteSpace: 'pre-wrap'
- }
-
- Textarea.COPY_PROPERTIES = [
- 'border-width', 'font-family', 'font-size', 'font-style', 'font-variant',
- 'font-weight', 'height', 'letter-spacing', 'word-spacing', 'line-height',
- 'text-decoration', 'text-align', 'width', 'padding-top', 'padding-right',
- 'padding-bottom', 'padding-left', 'margin-top', 'margin-right',
- 'margin-bottom', 'margin-left', 'border-style', 'box-sizing', 'tab-size'
- ];
-
$.extend(Textarea.prototype, $.fn.textcomplete.Adapter.prototype, {
// Public methods
// --------------
// Update the textarea with the given value and strategy.
- select: function (value, strategy) {
+ select: function (value, strategy, e) {
var pre = this.getTextFromHeadToCaret();
var post = this.el.value.substring(this.el.selectionEnd);
- var newSubstr = strategy.replace(value);
- if ($.isArray(newSubstr)) {
- post = newSubstr[1] + post;
- newSubstr = newSubstr[0];
+ var newSubstr = strategy.replace(value, e);
+ if (typeof newSubstr !== 'undefined') {
+ if ($.isArray(newSubstr)) {
+ post = newSubstr[1] + post;
+ newSubstr = newSubstr[0];
+ }
+ pre = pre.replace(strategy.match, newSubstr);
+ this.$el.val(pre + post);
+ this.el.selectionStart = this.el.selectionEnd = pre.length;
}
- pre = pre.replace(strategy.match, newSubstr);
- this.$el.val(pre + post);
- this.el.selectionStart = this.el.selectionEnd = pre.length;
+ },
+
+ getTextFromHeadToCaret: function () {
+ return this.el.value.substring(0, this.el.selectionEnd);
},
// Private methods
// ---------------
- // Returns the caret's relative coordinates from textarea's left top corner.
- //
- // Browser native API does not provide the way to know the position of
- // caret in pixels, so that here we use a kind of hack to accomplish
- // the aim. First of all it puts a dummy div element and completely copies
- // the textarea's style to the element, then it inserts the text and a
- // span element into the textarea.
- // Consequently, the span element's position is the thing what we want.
_getCaretRelativePosition: function () {
- var dummyDiv = $('<div></div>').css(this._copyCss())
- .text(this.getTextFromHeadToCaret());
- var span = $('<span></span>').text('.').appendTo(dummyDiv);
- this.$el.before(dummyDiv);
- var position = span.position();
- position.top += span.height() - this.$el.scrollTop();
- position.lineHeight = span.height();
- dummyDiv.remove();
- return position;
- },
-
- _copyCss: function () {
- return $.extend({
- // Set 'scroll' if a scrollbar is being shown; otherwise 'auto'.
- overflow: this.el.scrollHeight > this.el.offsetHeight ? 'scroll' : 'auto'
- }, Textarea.DIV_PROPERTIES, this._getStyles());
+ var p = $.fn.textcomplete.getCaretCoordinates(this.el, this.el.selectionStart);
+ return {
+ top: p.top + this._calculateLineHeight() - this.$el.scrollTop(),
+ left: p.left - this.$el.scrollLeft()
+ };
},
- _getStyles: (function ($) {
- var color = $('<div></div>').css(['color']).color;
- if (typeof color !== 'undefined') {
- return function () {
- return this.$el.css(Textarea.COPY_PROPERTIES);
- };
- } else { // jQuery < 1.8
- return function () {
- var $el = this.$el;
- var styles = {};
- $.each(Textarea.COPY_PROPERTIES, function (i, property) {
- styles[property] = $el.css(property);
- });
- return styles;
- };
+ _calculateLineHeight: function () {
+ var lineHeight = parseInt(this.$el.css('line-height'), 10);
+ if (isNaN(lineHeight)) {
+ // http://stackoverflow.com/a/4515470/1297336
+ var parentNode = this.el.parentNode;
+ var temp = document.createElement(this.el.nodeName);
+ var style = this.el.style;
+ temp.setAttribute(
+ 'style',
+ 'margin:0px;padding:0px;font-family:' + style.fontFamily + ';font-size:' + style.fontSize
+ );
+ temp.innerHTML = 'test';
+ parentNode.appendChild(temp);
+ lineHeight = temp.clientHeight;
+ parentNode.removeChild(temp);
}
- })($),
-
- getTextFromHeadToCaret: function () {
- return this.el.value.substring(0, this.el.selectionEnd);
+ return lineHeight;
}
});
@@ -981,22 +1107,24 @@ if (typeof jQuery === 'undefined') {
// Public methods
// --------------
- select: function (value, strategy) {
+ select: function (value, strategy, e) {
var pre = this.getTextFromHeadToCaret();
var post = this.el.value.substring(pre.length);
- var newSubstr = strategy.replace(value);
- if ($.isArray(newSubstr)) {
- post = newSubstr[1] + post;
- newSubstr = newSubstr[0];
+ var newSubstr = strategy.replace(value, e);
+ if (typeof newSubstr !== 'undefined') {
+ if ($.isArray(newSubstr)) {
+ post = newSubstr[1] + post;
+ newSubstr = newSubstr[0];
+ }
+ pre = pre.replace(strategy.match, newSubstr);
+ this.$el.val(pre + post);
+ this.el.focus();
+ var range = this.el.createTextRange();
+ range.collapse(true);
+ range.moveEnd('character', pre.length);
+ range.moveStart('character', pre.length);
+ range.select();
}
- pre = pre.replace(strategy.match, newSubstr);
- this.$el.val(pre + post);
- this.el.focus();
- var range = this.el.createTextRange();
- range.collapse(true);
- range.moveEnd('character', pre.length);
- range.moveStart('character', pre.length);
- range.select();
},
getTextFromHeadToCaret: function () {
@@ -1032,7 +1160,7 @@ if (typeof jQuery === 'undefined') {
// Update the content with the given value and strategy.
// When an dropdown item is selected, it is executed.
- select: function (value, strategy) {
+ select: function (value, strategy, e) {
var pre = this.getTextFromHeadToCaret();
var sel = window.getSelection()
var range = sel.getRangeAt(0);
@@ -1040,20 +1168,41 @@ if (typeof jQuery === 'undefined') {
selection.selectNodeContents(range.startContainer);
var content = selection.toString();
var post = content.substring(range.startOffset);
- var newSubstr = strategy.replace(value);
- if ($.isArray(newSubstr)) {
- post = newSubstr[1] + post;
- newSubstr = newSubstr[0];
+ var newSubstr = strategy.replace(value, e);
+ if (typeof newSubstr !== 'undefined') {
+ if ($.isArray(newSubstr)) {
+ post = newSubstr[1] + post;
+ newSubstr = newSubstr[0];
+ }
+ pre = pre.replace(strategy.match, newSubstr);
+ range.selectNodeContents(range.startContainer);
+ range.deleteContents();
+
+ // create temporary elements
+ var preWrapper = document.createElement("div");
+ preWrapper.innerHTML = pre;
+ var postWrapper = document.createElement("div");
+ postWrapper.innerHTML = post;
+
+ // create the fragment thats inserted
+ var fragment = document.createDocumentFragment();
+ var childNode;
+ var lastOfPre;
+ while (childNode = preWrapper.firstChild) {
+ lastOfPre = fragment.appendChild(childNode);
+ }
+ while (childNode = postWrapper.firstChild) {
+ fragment.appendChild(childNode);
+ }
+
+ // insert the fragment & jump behind the last node in "pre"
+ range.insertNode(fragment);
+ range.setStartAfter(lastOfPre);
+
+ range.collapse(true);
+ sel.removeAllRanges();
+ sel.addRange(range);
}
- pre = pre.replace(strategy.match, newSubstr);
- range.selectNodeContents(range.startContainer);
- range.deleteContents();
- var node = document.createTextNode(pre + post);
- range.insertNode(node);
- range.setStart(node, pre.length);
- range.collapse(true);
- sel.removeAllRanges();
- sel.addRange(range);
},
// Private methods
@@ -1079,8 +1228,7 @@ if (typeof jQuery === 'undefined') {
position.left -= this.$el.offset().left;
position.top += $node.height() - this.$el.offset().top;
position.lineHeight = $node.height();
- var dir = this.$el.attr('dir') || this.$el.css('direction');
- if (dir === 'rtl') { position.left -= this.listView.$el.width(); }
+ $node.remove();
return position;
},
@@ -1102,3 +1250,152 @@ if (typeof jQuery === 'undefined') {
$.fn.textcomplete.ContentEditable = ContentEditable;
}(jQuery);
+
+// The MIT License (MIT)
+//
+// Copyright (c) 2015 Jonathan Ong me@jongleberry.com
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
+// associated documentation files (the "Software"), to deal in the Software without restriction,
+// including without limitation the rights to use, copy, modify, merge, publish, distribute,
+// sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in all copies or
+// substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
+// NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+// https://github.com/component/textarea-caret-position
+
+(function ($) {
+
+// The properties that we copy into a mirrored div.
+// Note that some browsers, such as Firefox,
+// do not concatenate properties, i.e. padding-top, bottom etc. -> padding,
+// so we have to do every single property specifically.
+var properties = [
+ 'direction', // RTL support
+ 'boxSizing',
+ 'width', // on Chrome and IE, exclude the scrollbar, so the mirror div wraps exactly as the textarea does
+ 'height',
+ 'overflowX',
+ 'overflowY', // copy the scrollbar for IE
+
+ 'borderTopWidth',
+ 'borderRightWidth',
+ 'borderBottomWidth',
+ 'borderLeftWidth',
+ 'borderStyle',
+
+ 'paddingTop',
+ 'paddingRight',
+ 'paddingBottom',
+ 'paddingLeft',
+
+ // https://developer.mozilla.org/en-US/docs/Web/CSS/font
+ 'fontStyle',
+ 'fontVariant',
+ 'fontWeight',
+ 'fontStretch',
+ 'fontSize',
+ 'fontSizeAdjust',
+ 'lineHeight',
+ 'fontFamily',
+
+ 'textAlign',
+ 'textTransform',
+ 'textIndent',
+ 'textDecoration', // might not make a difference, but better be safe
+
+ 'letterSpacing',
+ 'wordSpacing',
+
+ 'tabSize',
+ 'MozTabSize'
+
+];
+
+var isBrowser = (typeof window !== 'undefined');
+var isFirefox = (isBrowser && window.mozInnerScreenX != null);
+
+function getCaretCoordinates(element, position, options) {
+ if(!isBrowser) {
+ throw new Error('textarea-caret-position#getCaretCoordinates should only be called in a browser');
+ }
+
+ var debug = options && options.debug || false;
+ if (debug) {
+ var el = document.querySelector('#input-textarea-caret-position-mirror-div');
+ if ( el ) { el.parentNode.removeChild(el); }
+ }
+
+ // mirrored div
+ var div = document.createElement('div');
+ div.id = 'input-textarea-caret-position-mirror-div';
+ document.body.appendChild(div);
+
+ var style = div.style;
+ var computed = window.getComputedStyle? getComputedStyle(element) : element.currentStyle; // currentStyle for IE < 9
+
+ // default textarea styles
+ style.whiteSpace = 'pre-wrap';
+ if (element.nodeName !== 'INPUT')
+ style.wordWrap = 'break-word'; // only for textarea-s
+
+ // position off-screen
+ style.position = 'absolute'; // required to return coordinates properly
+ if (!debug)
+ style.visibility = 'hidden'; // not 'display: none' because we want rendering
+
+ // transfer the element's properties to the div
+ properties.forEach(function (prop) {
+ style[prop] = computed[prop];
+ });
+
+ if (isFirefox) {
+ // Firefox lies about the overflow property for textareas: https://bugzilla.mozilla.org/show_bug.cgi?id=984275
+ if (element.scrollHeight > parseInt(computed.height))
+ style.overflowY = 'scroll';
+ } else {
+ style.overflow = 'hidden'; // for Chrome to not render a scrollbar; IE keeps overflowY = 'scroll'
+ }
+
+ div.textContent = element.value.substring(0, position);
+ // the second special handling for input type="text" vs textarea: spaces need to be replaced with non-breaking spaces - http://stackoverflow.com/a/13402035/1269037
+ if (element.nodeName === 'INPUT')
+ div.textContent = div.textContent.replace(/\s/g, '\u00a0');
+
+ var span = document.createElement('span');
+ // Wrapping must be replicated *exactly*, including when a long word gets
+ // onto the next line, with whitespace at the end of the line before (#7).
+ // The *only* reliable way to do that is to copy the *entire* rest of the
+ // textarea's content into the <span> created at the caret position.
+ // for inputs, just '.' would be enough, but why bother?
+ span.textContent = element.value.substring(position) || '.'; // || because a completely empty faux span doesn't render at all
+ div.appendChild(span);
+
+ var coordinates = {
+ top: span.offsetTop + parseInt(computed['borderTopWidth']),
+ left: span.offsetLeft + parseInt(computed['borderLeftWidth'])
+ };
+
+ if (debug) {
+ span.style.backgroundColor = '#aaa';
+ } else {
+ document.body.removeChild(div);
+ }
+
+ return coordinates;
+}
+
+$.fn.textcomplete.getCaretCoordinates = getCaretCoordinates;
+
+}(jQuery));
+
+return jQuery;
+}));
diff --git a/library/jquery-textcomplete/jquery.textcomplete.min.js b/library/jquery-textcomplete/jquery.textcomplete.min.js
new file mode 100644
index 000000000..d3a427f27
--- /dev/null
+++ b/library/jquery-textcomplete/jquery.textcomplete.min.js
@@ -0,0 +1,3 @@
+/*! jquery-textcomplete - v1.3.4 - 2016-04-19 */
+!function(a){if("function"==typeof define&&define.amd)define(["jquery"],a);else if("object"==typeof module&&module.exports){var b=require("jquery");module.exports=a(b)}else a(jQuery)}(function(a){if("undefined"==typeof a)throw new Error("jQuery.textcomplete requires jQuery");return+function(a){"use strict";var b=function(a){console.warn&&console.warn(a)},c=1;a.fn.textcomplete=function(d,e){var f=Array.prototype.slice.call(arguments);return this.each(function(){var g=this,h=a(this),i=h.data("textComplete");if(i||(e||(e={}),e._oid=c++,i=new a.fn.textcomplete.Completer(this,e),h.data("textComplete",i)),"string"==typeof d){if(!i)return;f.shift(),i[d].apply(i,f),"destroy"===d&&h.removeData("textComplete")}else a.each(d,function(c){a.each(["header","footer","placement","maxCount"],function(a){c[a]&&(i.option[a]=c[a],b(a+"as a strategy param is deprecated. Use option."),delete c[a])})}),i.register(a.fn.textcomplete.Strategy.parse(d,{el:g,$el:h}))})}}(a),+function(a){"use strict";function b(c,d){if(this.$el=a(c),this.id="textcomplete"+f++,this.strategies=[],this.views=[],this.option=a.extend({},b._getDefaults(),d),!(this.$el.is("input[type=text]")||this.$el.is("input[type=search]")||this.$el.is("textarea")||c.isContentEditable||"true"==c.contentEditable))throw new Error("textcomplete must be called on a Textarea or a ContentEditable.");if(c===document.activeElement)this.initialize();else{var e=this;this.$el.one("focus."+this.id,function(){e.initialize()})}}var c=function(a){var b,c;return function(){var d=Array.prototype.slice.call(arguments);if(b)return void(c=d);b=!0;var e=this;d.unshift(function f(){if(c){var d=c;c=void 0,d.unshift(f),a.apply(e,d)}else b=!1}),a.apply(this,d)}},d=function(a){return"[object String]"===Object.prototype.toString.call(a)},e=function(a){return"[object Function]"===Object.prototype.toString.call(a)},f=0;b._getDefaults=function(){return b.DEFAULTS||(b.DEFAULTS={appendTo:a("body"),zIndex:"100"}),b.DEFAULTS},a.extend(b.prototype,{id:null,option:null,strategies:null,adapter:null,dropdown:null,$el:null,initialize:function(){var b=this.$el.get(0);this.dropdown=new a.fn.textcomplete.Dropdown(b,this,this.option);var c,d;this.option.adapter?c=this.option.adapter:(d=this.$el.is("textarea")||this.$el.is("input[type=text]")||this.$el.is("input[type=search]")?"number"==typeof b.selectionEnd?"Textarea":"IETextarea":"ContentEditable",c=a.fn.textcomplete[d]),this.adapter=new c(b,this,this.option)},destroy:function(){this.$el.off("."+this.id),this.adapter&&this.adapter.destroy(),this.dropdown&&this.dropdown.destroy(),this.$el=this.adapter=this.dropdown=null},deactivate:function(){this.dropdown&&this.dropdown.deactivate()},trigger:function(a,b){this.dropdown||this.initialize(),null!=a||(a=this.adapter.getTextFromHeadToCaret());var c=this._extractSearchQuery(a);if(c.length){var d=c[1];if(b&&this._term===d&&""!==d)return;this._term=d,this._search.apply(this,c)}else this._term=null,this.dropdown.deactivate()},fire:function(a){var b=Array.prototype.slice.call(arguments,1);return this.$el.trigger(a,b),this},register:function(a){Array.prototype.push.apply(this.strategies,a)},select:function(a,b,c){this._term=null,this.adapter.select(a,b,c),this.fire("change").fire("textComplete:select",a,b),this.adapter.focus()},_clearAtNext:!0,_term:null,_extractSearchQuery:function(a){for(var b=0;b<this.strategies.length;b++){var c=this.strategies[b],f=c.context(a);if(f||""===f){var g=e(c.match)?c.match(a):c.match;d(f)&&(a=f);var h=a.match(g);if(h)return[c,h[c.index],h]}}return[]},_search:c(function(a,b,c,d){var e=this;b.search(c,function(d,f){e.dropdown.shown||e.dropdown.activate(),e._clearAtNext&&(e.dropdown.clear(),e._clearAtNext=!1),e.dropdown.setPosition(e.adapter.getCaretPosition()),e.dropdown.render(e._zip(d,b,c)),f||(a(),e._clearAtNext=!0)},d)}),_zip:function(b,c,d){return a.map(b,function(a){return{value:a,strategy:c,term:d}})}}),a.fn.textcomplete.Completer=b}(a),+function(a){"use strict";function b(c,d,f){this.$el=b.createElement(f),this.completer=d,this.id=d.id+"dropdown",this._data=[],this.$inputEl=a(c),this.option=f,f.listPosition&&(this.setPosition=f.listPosition),f.height&&this.$el.height(f.height);var g=this;a.each(["maxCount","placement","footer","header","noResultsMessage","className"],function(a,b){null!=f[b]&&(g[b]=f[b])}),this._bindEvents(c),e[this.id]=this}var c=a(window),d=function(a,b){var c,d,e=b.strategy.idProperty;for(c=0;c<a.length;c++)if(d=a[c],d.strategy===b.strategy)if(e){if(d.value[e]===b.value[e])return!0}else if(d.value===b.value)return!0;return!1},e={};a(document).on("click",function(b){var c=b.originalEvent&&b.originalEvent.keepTextCompleteDropdown;a.each(e,function(a,b){a!==c&&b.deactivate()})});var f={SKIP_DEFAULT:0,KEY_UP:1,KEY_DOWN:2,KEY_ENTER:3,KEY_PAGEUP:4,KEY_PAGEDOWN:5,KEY_ESCAPE:6};a.extend(b,{createElement:function(b){var c=b.appendTo;c instanceof a||(c=a(c));var d=a("<ul></ul>").addClass("dropdown-menu textcomplete-dropdown").attr("id","textcomplete-dropdown-"+b._oid).css({display:"none",left:0,position:"absolute",zIndex:b.zIndex}).appendTo(c);return d}}),a.extend(b.prototype,{$el:null,$inputEl:null,completer:null,footer:null,header:null,id:null,maxCount:10,placement:"",shown:!1,data:[],className:"",destroy:function(){this.deactivate(),this.$el.off("."+this.id),this.$inputEl.off("."+this.id),this.clear(),this.$el.remove(),this.$el=this.$inputEl=this.completer=null,delete e[this.id]},render:function(b){var c=this._buildContents(b),d=a.map(this.data,function(a){return a.value});if(this.data.length){var e=b[0].strategy;e.id?this.$el.attr("data-strategy",e.id):this.$el.removeAttr("data-strategy"),this._renderHeader(d),this._renderFooter(d),c&&(this._renderContents(c),this._fitToBottom(),this._fitToRight(),this._activateIndexedItem()),this._setScroll()}else this.noResultsMessage?this._renderNoResultsMessage(d):this.shown&&this.deactivate()},setPosition:function(b){var d="absolute";return this.$inputEl.add(this.$inputEl.parents()).each(function(){return"absolute"===a(this).css("position")?!1:"fixed"===a(this).css("position")?(b.top-=c.scrollTop(),b.left-=c.scrollLeft(),d="fixed",!1):void 0}),this.$el.css(this._applyPlacement(b)),this.$el.css({position:d}),this},clear:function(){this.$el.html(""),this.data=[],this._index=0,this._$header=this._$footer=this._$noResultsMessage=null},activate:function(){return this.shown||(this.clear(),this.$el.show(),this.className&&this.$el.addClass(this.className),this.completer.fire("textComplete:show"),this.shown=!0),this},deactivate:function(){return this.shown&&(this.$el.hide(),this.className&&this.$el.removeClass(this.className),this.completer.fire("textComplete:hide"),this.shown=!1),this},isUp:function(a){return 38===a.keyCode||a.ctrlKey&&80===a.keyCode},isDown:function(a){return 40===a.keyCode||a.ctrlKey&&78===a.keyCode},isEnter:function(a){var b=a.ctrlKey||a.altKey||a.metaKey||a.shiftKey;return!b&&(13===a.keyCode||9===a.keyCode||this.option.completeOnSpace===!0&&32===a.keyCode)},isPageup:function(a){return 33===a.keyCode},isPagedown:function(a){return 34===a.keyCode},isEscape:function(a){return 27===a.keyCode},_data:null,_index:null,_$header:null,_$noResultsMessage:null,_$footer:null,_bindEvents:function(){this.$el.on("mousedown."+this.id,".textcomplete-item",a.proxy(this._onClick,this)),this.$el.on("touchstart."+this.id,".textcomplete-item",a.proxy(this._onClick,this)),this.$el.on("mouseover."+this.id,".textcomplete-item",a.proxy(this._onMouseover,this)),this.$inputEl.on("keydown."+this.id,a.proxy(this._onKeydown,this))},_onClick:function(b){var c=a(b.target);b.preventDefault(),b.originalEvent.keepTextCompleteDropdown=this.id,c.hasClass("textcomplete-item")||(c=c.closest(".textcomplete-item"));var d=this.data[parseInt(c.data("index"),10)];this.completer.select(d.value,d.strategy,b);var e=this;setTimeout(function(){e.deactivate(),"touchstart"===b.type&&e.$inputEl.focus()},0)},_onMouseover:function(b){var c=a(b.target);b.preventDefault(),c.hasClass("textcomplete-item")||(c=c.closest(".textcomplete-item")),this._index=parseInt(c.data("index"),10),this._activateIndexedItem()},_onKeydown:function(b){if(this.shown){var c;switch(a.isFunction(this.option.onKeydown)&&(c=this.option.onKeydown(b,f)),null==c&&(c=this._defaultKeydown(b)),c){case f.KEY_UP:b.preventDefault(),this._up();break;case f.KEY_DOWN:b.preventDefault(),this._down();break;case f.KEY_ENTER:b.preventDefault(),this._enter(b);break;case f.KEY_PAGEUP:b.preventDefault(),this._pageup();break;case f.KEY_PAGEDOWN:b.preventDefault(),this._pagedown();break;case f.KEY_ESCAPE:b.preventDefault(),this.deactivate()}}},_defaultKeydown:function(a){return this.isUp(a)?f.KEY_UP:this.isDown(a)?f.KEY_DOWN:this.isEnter(a)?f.KEY_ENTER:this.isPageup(a)?f.KEY_PAGEUP:this.isPagedown(a)?f.KEY_PAGEDOWN:this.isEscape(a)?f.KEY_ESCAPE:void 0},_up:function(){0===this._index?this._index=this.data.length-1:this._index-=1,this._activateIndexedItem(),this._setScroll()},_down:function(){this._index===this.data.length-1?this._index=0:this._index+=1,this._activateIndexedItem(),this._setScroll()},_enter:function(a){var b=this.data[parseInt(this._getActiveElement().data("index"),10)];this.completer.select(b.value,b.strategy,a),this.deactivate()},_pageup:function(){var b=0,c=this._getActiveElement().position().top-this.$el.innerHeight();this.$el.children().each(function(d){return a(this).position().top+a(this).outerHeight()>c?(b=d,!1):void 0}),this._index=b,this._activateIndexedItem(),this._setScroll()},_pagedown:function(){var b=this.data.length-1,c=this._getActiveElement().position().top+this.$el.innerHeight();this.$el.children().each(function(d){return a(this).position().top>c?(b=d,!1):void 0}),this._index=b,this._activateIndexedItem(),this._setScroll()},_activateIndexedItem:function(){this.$el.find(".textcomplete-item.active").removeClass("active"),this._getActiveElement().addClass("active")},_getActiveElement:function(){return this.$el.children(".textcomplete-item:nth("+this._index+")")},_setScroll:function(){var a=this._getActiveElement(),b=a.position().top,c=a.outerHeight(),d=this.$el.innerHeight(),e=this.$el.scrollTop();0===this._index||this._index==this.data.length-1||0>b?this.$el.scrollTop(b+e):b+c>d&&this.$el.scrollTop(b+c+e-d)},_buildContents:function(a){var b,c,e,f="";for(c=0;c<a.length&&this.data.length!==this.maxCount;c++)b=a[c],d(this.data,b)||(e=this.data.length,this.data.push(b),f+='<li class="textcomplete-item" data-index="'+e+'"><a>',f+=b.strategy.template(b.value,b.term),f+="</a></li>");return f},_renderHeader:function(b){if(this.header){this._$header||(this._$header=a('<li class="textcomplete-header"></li>').prependTo(this.$el));var c=a.isFunction(this.header)?this.header(b):this.header;this._$header.html(c)}},_renderFooter:function(b){if(this.footer){this._$footer||(this._$footer=a('<li class="textcomplete-footer"></li>').appendTo(this.$el));var c=a.isFunction(this.footer)?this.footer(b):this.footer;this._$footer.html(c)}},_renderNoResultsMessage:function(b){if(this.noResultsMessage){this._$noResultsMessage||(this._$noResultsMessage=a('<li class="textcomplete-no-results-message"></li>').appendTo(this.$el));var c=a.isFunction(this.noResultsMessage)?this.noResultsMessage(b):this.noResultsMessage;this._$noResultsMessage.html(c)}},_renderContents:function(a){this._$footer?this._$footer.before(a):this.$el.append(a)},_fitToBottom:function(){var a=c.scrollTop()+c.height(),b=this.$el.height();this.$el.position().top+b>a&&this.$el.offset({top:a-b})},_fitToRight:function(){for(var a,b=30,d=this.$el.offset().left,e=this.$el.width(),f=c.width()-b;d+e>f&&(this.$el.offset({left:d-b}),a=this.$el.offset().left,!(a>=d));)d=a},_applyPlacement:function(a){return-1!==this.placement.indexOf("top")?a={top:"auto",bottom:this.$el.parent().height()-a.top+a.lineHeight,left:a.left}:(a.bottom="auto",delete a.lineHeight),-1!==this.placement.indexOf("absleft")?a.left=0:-1!==this.placement.indexOf("absright")&&(a.right=0,a.left="auto"),a}}),a.fn.textcomplete.Dropdown=b,a.extend(a.fn.textcomplete,f)}(a),+function(a){"use strict";function b(b){a.extend(this,b),this.cache&&(this.search=c(this.search))}var c=function(a){var b={};return function(c,d){b[c]?d(b[c]):a.call(this,c,function(a){b[c]=(b[c]||[]).concat(a),d.apply(null,arguments)})}};b.parse=function(c,d){return a.map(c,function(a){var c=new b(a);return c.el=d.el,c.$el=d.$el,c})},a.extend(b.prototype,{match:null,replace:null,search:null,id:null,cache:!1,context:function(){return!0},index:2,template:function(a){return a},idProperty:null}),a.fn.textcomplete.Strategy=b}(a),+function(a){"use strict";function b(){}var c=Date.now||function(){return(new Date).getTime()},d=function(a,b){var d,e,f,g,h,i=function(){var j=c()-g;b>j?d=setTimeout(i,b-j):(d=null,h=a.apply(f,e),f=e=null)};return function(){return f=this,e=arguments,g=c(),d||(d=setTimeout(i,b)),h}};a.extend(b.prototype,{id:null,completer:null,el:null,$el:null,option:null,initialize:function(b,c,e){this.el=b,this.$el=a(b),this.id=c.id+this.constructor.name,this.completer=c,this.option=e,this.option.debounce&&(this._onKeyup=d(this._onKeyup,this.option.debounce)),this._bindEvents()},destroy:function(){this.$el.off("."+this.id),this.$el=this.el=this.completer=null},select:function(){throw new Error("Not implemented")},getCaretPosition:function(){var b=this._getCaretRelativePosition(),c=this.$el.offset(),d=this.option.appendTo;if(d){d instanceof a||(d=a(d));var e=d.offsetParent().offset();c.top-=e.top,c.left-=e.left}return b.top+=c.top,b.left+=c.left,b},focus:function(){this.$el.focus()},_bindEvents:function(){this.$el.on("keyup."+this.id,a.proxy(this._onKeyup,this))},_onKeyup:function(a){this._skipSearch(a)||this.completer.trigger(this.getTextFromHeadToCaret(),!0)},_skipSearch:function(a){switch(a.keyCode){case 9:case 13:case 40:case 38:return!0}if(a.ctrlKey)switch(a.keyCode){case 78:case 80:return!0}}}),a.fn.textcomplete.Adapter=b}(a),+function(a){"use strict";function b(a,b,c){this.initialize(a,b,c)}a.extend(b.prototype,a.fn.textcomplete.Adapter.prototype,{select:function(b,c,d){var e=this.getTextFromHeadToCaret(),f=this.el.value.substring(this.el.selectionEnd),g=c.replace(b,d);"undefined"!=typeof g&&(a.isArray(g)&&(f=g[1]+f,g=g[0]),e=e.replace(c.match,g),this.$el.val(e+f),this.el.selectionStart=this.el.selectionEnd=e.length)},getTextFromHeadToCaret:function(){return this.el.value.substring(0,this.el.selectionEnd)},_getCaretRelativePosition:function(){var b=a.fn.textcomplete.getCaretCoordinates(this.el,this.el.selectionStart);return{top:b.top+this._calculateLineHeight()-this.$el.scrollTop(),left:b.left-this.$el.scrollLeft()}},_calculateLineHeight:function(){var a=parseInt(this.$el.css("line-height"),10);if(isNaN(a)){var b=this.el.parentNode,c=document.createElement(this.el.nodeName),d=this.el.style;c.setAttribute("style","margin:0px;padding:0px;font-family:"+d.fontFamily+";font-size:"+d.fontSize),c.innerHTML="test",b.appendChild(c),a=c.clientHeight,b.removeChild(c)}return a}}),a.fn.textcomplete.Textarea=b}(a),+function(a){"use strict";function b(b,d,e){this.initialize(b,d,e),a("<span>"+c+"</span>").css({position:"absolute",top:-9999,left:-9999}).insertBefore(b)}var c="吶";a.extend(b.prototype,a.fn.textcomplete.Textarea.prototype,{select:function(b,c,d){var e=this.getTextFromHeadToCaret(),f=this.el.value.substring(e.length),g=c.replace(b,d);if("undefined"!=typeof g){a.isArray(g)&&(f=g[1]+f,g=g[0]),e=e.replace(c.match,g),this.$el.val(e+f),this.el.focus();var h=this.el.createTextRange();h.collapse(!0),h.moveEnd("character",e.length),h.moveStart("character",e.length),h.select()}},getTextFromHeadToCaret:function(){this.el.focus();var a=document.selection.createRange();a.moveStart("character",-this.el.value.length);var b=a.text.split(c);return 1===b.length?b[0]:b[1]}}),a.fn.textcomplete.IETextarea=b}(a),+function(a){"use strict";function b(a,b,c){this.initialize(a,b,c)}a.extend(b.prototype,a.fn.textcomplete.Adapter.prototype,{select:function(b,c,d){var e=this.getTextFromHeadToCaret(),f=window.getSelection(),g=f.getRangeAt(0),h=g.cloneRange();h.selectNodeContents(g.startContainer);var i=h.toString(),j=i.substring(g.startOffset),k=c.replace(b,d);if("undefined"!=typeof k){a.isArray(k)&&(j=k[1]+j,k=k[0]),e=e.replace(c.match,k),g.selectNodeContents(g.startContainer),g.deleteContents();var l=document.createElement("div");l.innerHTML=e;var m=document.createElement("div");m.innerHTML=j;for(var n,o,p=document.createDocumentFragment();n=l.firstChild;)o=p.appendChild(n);for(;n=m.firstChild;)p.appendChild(n);g.insertNode(p),g.setStartAfter(o),g.collapse(!0),f.removeAllRanges(),f.addRange(g)}},_getCaretRelativePosition:function(){var b=window.getSelection().getRangeAt(0).cloneRange(),c=document.createElement("span");b.insertNode(c),b.selectNodeContents(c),b.deleteContents();var d=a(c),e=d.offset();return e.left-=this.$el.offset().left,e.top+=d.height()-this.$el.offset().top,e.lineHeight=d.height(),d.remove(),e},getTextFromHeadToCaret:function(){var a=window.getSelection().getRangeAt(0),b=a.cloneRange();return b.selectNodeContents(a.startContainer),b.toString().substring(0,a.startOffset)}}),a.fn.textcomplete.ContentEditable=b}(a),function(a){function b(a,b,f){if(!d)throw new Error("textarea-caret-position#getCaretCoordinates should only be called in a browser");var g=f&&f.debug||!1;if(g){var h=document.querySelector("#input-textarea-caret-position-mirror-div");h&&h.parentNode.removeChild(h)}var i=document.createElement("div");i.id="input-textarea-caret-position-mirror-div",document.body.appendChild(i);var j=i.style,k=window.getComputedStyle?getComputedStyle(a):a.currentStyle;j.whiteSpace="pre-wrap","INPUT"!==a.nodeName&&(j.wordWrap="break-word"),j.position="absolute",g||(j.visibility="hidden"),c.forEach(function(a){j[a]=k[a]}),e?a.scrollHeight>parseInt(k.height)&&(j.overflowY="scroll"):j.overflow="hidden",i.textContent=a.value.substring(0,b),"INPUT"===a.nodeName&&(i.textContent=i.textContent.replace(/\s/g," "));var l=document.createElement("span");l.textContent=a.value.substring(b)||".",i.appendChild(l);var m={top:l.offsetTop+parseInt(k.borderTopWidth),left:l.offsetLeft+parseInt(k.borderLeftWidth)};return g?l.style.backgroundColor="#aaa":document.body.removeChild(i),m}var c=["direction","boxSizing","width","height","overflowX","overflowY","borderTopWidth","borderRightWidth","borderBottomWidth","borderLeftWidth","borderStyle","paddingTop","paddingRight","paddingBottom","paddingLeft","fontStyle","fontVariant","fontWeight","fontStretch","fontSize","fontSizeAdjust","lineHeight","fontFamily","textAlign","textTransform","textIndent","textDecoration","letterSpacing","wordSpacing","tabSize","MozTabSize"],d="undefined"!=typeof window,e=d&&null!=window.mozInnerScreenX;a.fn.textcomplete.getCaretCoordinates=b}(a),a});
+//# sourceMappingURL=dist/jquery.textcomplete.min.map \ No newline at end of file
diff --git a/mod/_well_known.php b/mod/_well_known.php
deleted file mode 100644
index 23d79bb1d..000000000
--- a/mod/_well_known.php
+++ /dev/null
@@ -1,64 +0,0 @@
-<?php
-
-function _well_known_init(&$a){
-
- if(argc() > 1) {
-
- $arr = array('server' => $_SERVER, 'request' => $_REQUEST);
- call_hooks('well_known', $arr);
-
-
- if(! check_siteallowed($_SERVER['REMOTE_ADDR'])) {
- logger('well_known: site not allowed. ' . $_SERVER['REMOTE_ADDR']);
- killme();
- }
-
- // from php.net re: REMOTE_HOST:
- // Note: Your web server must be configured to create this variable. For example in Apache
- // you'll need HostnameLookups On inside httpd.conf for it to exist. See also gethostbyaddr().
-
- if(get_config('system','siteallowed_remote_host') && (! check_siteallowed($_SERVER['REMOTE_HOST']))) {
- logger('well_known: site not allowed. ' . $_SERVER['REMOTE_HOST']);
- killme();
- }
-
-
- switch(argv(1)) {
- case 'zot-info':
- App::$argc -= 1;
- array_shift(App::$argv);
- App::$argv[0] = 'zfinger';
- require_once('mod/zfinger.php');
- zfinger_init($a);
- break;
-
- case 'webfinger':
- App::$argc -= 1;
- array_shift(App::$argv);
- App::$argv[0] = 'wfinger';
- require_once('mod/wfinger.php');
- wfinger_init($a);
- break;
-
- case 'host-meta':
- App::$argc -= 1;
- array_shift(App::$argv);
- App::$argv[0] = 'hostxrd';
- require_once('mod/hostxrd.php');
- hostxrd_init($a);
- break;
-
- default:
- if(file_exists(App::$cmd)) {
- echo file_get_contents(App::$cmd);
- killme();
- }
- elseif(file_exists(App::$cmd . '.php'))
- require_once(App::$cmd . '.php');
- break;
-
- }
- }
-
- http_status_exit(404);
-} \ No newline at end of file
diff --git a/mod/achievements.php b/mod/achievements.php
deleted file mode 100644
index 9d4dad35b..000000000
--- a/mod/achievements.php
+++ /dev/null
@@ -1,87 +0,0 @@
-<?php
-
-function achievements_content(&$a) {
- // This doesn't work, so
- if (! is_developer())
- return;
-
- if(argc() > 1)
- $which = argv(1);
- else {
- notice( t('Requested profile is not available.') . EOL );
- return;
-}
-
- $profile = 0;
- $profile = argv(1);
- profile_load($a,$which,$profile);
-
- $r = q("select channel_id from channel where channel_address = '%s'",
- dbesc($which)
- );
- if($r) {
- $owner = intval($r[0]['channel_id']);
- }
-
- $observer = App::get_observer();
- $ob_hash = (($observer) ? $observer['xchan_hash'] : '');
- $perms = get_all_perms($owner,$ob_hash);
- if(! $perms['view_profile']) {
- notice( t('Permission denied.') . EOL);
- return;
- }
-
- $newmembertext = t('Some blurb about what to do when you\'re new here');
-
-
-// By default, all badges are false
- $contactbadge = false;
- $profilebadge = false;
- $keywordsbadge = false;
-
-// Check number of contacts. Award a badge if over 10
-// We'll figure these out on each page load instead of
-// writing them to the DB because that will mean one needs
-// to retain their achievements - eg, you can't add
-// a bunch of channels just to get your badge, and then
-// delete them all again. If these become popular or
-// used in profiles or something, we may need to reconsider
-// and add a table for this - because this won't scale.
-
- $r = q("select * from abook where abook_channel = %d",
- intval($owner)
- );
-
- if (count($r))
- $contacts = count($r);
- // We're checking for 11 to adjust for the abook record for self
- if ($contacts >= 11)
- $contactbadge = true;
-
-// Check if an about field in the profile has been created.
-
- $r = q("select * from profile where uid = %d and about <> ''",
- intval($owner)
- );
-
- if ($r)
- $profilebadge = 1;
-
-// Check if keywords have been set
-
- $r = q("select * from profile where uid = %d and keywords <> ''",
- intval($owner)
- );
-
- if($r)
- $keywordsbadge = 1;
-
- return replace_macros(get_markup_template("achievements.tpl"), array(
- '$newmembertext' => $newmembertext,
- '$profilebadge' => $profilebadge,
- '$contactbadge' => $contactbadge,
- '$keywordsbadge' => $keywordsbadge,
- '$channelsbadge' => $channelsbadge
-));
-
-}
diff --git a/mod/acl.php b/mod/acl.php
deleted file mode 100644
index 146cb74c8..000000000
--- a/mod/acl.php
+++ /dev/null
@@ -1,308 +0,0 @@
-<?php
-
-/* ACL selector json backend */
-require_once("include/acl_selectors.php");
-require_once("include/group.php");
-
-function acl_init(&$a){
-
-// logger('mod_acl: ' . print_r($_REQUEST,true));
-
- $start = (x($_REQUEST,'start')?$_REQUEST['start']:0);
- $count = (x($_REQUEST,'count')?$_REQUEST['count']:100);
- $search = (x($_REQUEST,'search')?$_REQUEST['search']:"");
- $type = (x($_REQUEST,'type')?$_REQUEST['type']:"");
- $noforums = (x($_REQUEST,'n') ? $_REQUEST['n'] : false);
-
- // List of channels whose connections to also suggest, e.g. currently viewed channel or channels mentioned in a post
- $extra_channels = (x($_REQUEST,'extra_channels') ? $_REQUEST['extra_channels'] : array());
-
- // For use with jquery.autocomplete for private mail completion
-
- if(x($_REQUEST,'query') && strlen($_REQUEST['query'])) {
- if(! $type)
- $type = 'm';
- $search = $_REQUEST['query'];
- }
-
- if(!(local_channel()))
- if(!($type == 'x' || $type == 'c'))
- killme();
-
- if ($search != "") {
- $sql_extra = " AND `name` LIKE " . protect_sprintf( "'%" . dbesc($search) . "%'" ) . " ";
- $sql_extra2 = "AND ( xchan_name LIKE " . protect_sprintf( "'%" . dbesc($search) . "%'" ) . " OR xchan_addr LIKE " . protect_sprintf( "'%" . dbesc($search) . ((strpos($search,'@') === false) ? "%@%'" : "%'")) . ") ";
-
- // This horrible mess is needed because position also returns 0 if nothing is found. W/ould be MUCH easier if it instead returned a very large value
- // Otherwise we could just order by LEAST(POSITION($search IN xchan_name),POSITION($search IN xchan_addr)).
- $order_extra2 = "CASE WHEN xchan_name LIKE " . protect_sprintf( "'%" . dbesc($search) . "%'" ) ." then POSITION('".dbesc($search)."' IN xchan_name) else position('".dbesc($search)."' IN xchan_addr) end, ";
- $col = ((strpos($search,'@') !== false) ? 'xchan_addr' : 'xchan_name' );
- $sql_extra3 = "AND $col like " . protect_sprintf( "'%" . dbesc($search) . "%'" ) . " ";
-
- } else {
- $sql_extra = $sql_extra2 = $sql_extra3 = "";
- }
-
-
- $groups = array();
- $contacts = array();
-
- if ($type=='' || $type=='g'){
-
- $r = q("SELECT `groups`.`id`, `groups`.`hash`, `groups`.`name`
- FROM `groups`,`group_member`
- WHERE `groups`.`deleted` = 0 AND `groups`.`uid` = %d
- AND `group_member`.`gid`=`groups`.`id`
- $sql_extra
- GROUP BY `groups`.`id`
- ORDER BY `groups`.`name`
- LIMIT %d OFFSET %d",
- intval(local_channel()),
- intval($count),
- intval($start)
- );
-
- foreach($r as $g){
-// logger('acl: group: ' . $g['name'] . ' members: ' . group_get_members_xchan($g['id']));
- $groups[] = array(
- "type" => "g",
- "photo" => "images/twopeople.png",
- "name" => $g['name'],
- "id" => $g['id'],
- "xid" => $g['hash'],
- "uids" => group_get_members_xchan($g['id']),
- "link" => ''
- );
- }
- }
-
- if ($type=='' || $type=='c') {
- $extra_channels_sql = '';
- // Only include channels who allow the observer to view their permissions
- foreach($extra_channels as $channel) {
- if(perm_is_allowed(intval($channel), get_observer_hash(),'view_contacts'))
- $extra_channels_sql .= "," . intval($channel);
- }
-
- $extra_channels_sql = substr($extra_channels_sql,1); // Remove initial comma
-
- // Getting info from the abook is better for local users because it contains info about permissions
- if(local_channel()) {
- if($extra_channels_sql != '')
- $extra_channels_sql = " OR (abook_channel IN ($extra_channels_sql)) and abook_hidden = 0 ";
-
- $r = q("SELECT abook_id as id, xchan_hash as hash, xchan_name as name, xchan_photo_s as micro, xchan_url as url, xchan_addr as nick, abook_their_perms, abook_flags, abook_self
- FROM abook left join xchan on abook_xchan = xchan_hash
- WHERE (abook_channel = %d $extra_channels_sql) AND abook_blocked = 0 and abook_pending = 0 and xchan_deleted = 0 $sql_extra2 order by $order_extra2 xchan_name asc" ,
- intval(local_channel())
- );
-
- }
- else { // Visitors
- $r = q("SELECT xchan_hash as id, xchan_hash as hash, xchan_name as name, xchan_photo_s as micro, xchan_url as url, xchan_addr as nick, 0 as abook_their_perms, 0 as abook_flags, 0 as abook_self
- FROM xchan left join xlink on xlink_link = xchan_hash
- WHERE xlink_xchan = '%s' AND xchan_deleted = 0 $sql_extra2 order by $order_extra2 xchan_name asc" ,
- dbesc(get_observer_hash())
- );
-
- // Find contacts of extra channels
- // This is probably more complicated than it needs to be
- if($extra_channels_sql) {
- // Build a list of hashes that we got previously so we don't get them again
- $known_hashes = array("'".get_observer_hash()."'");
- if($r)
- foreach($r as $rr)
- $known_hashes[] = "'".$rr['hash']."'";
- $known_hashes_sql = 'AND xchan_hash not in ('.join(',',$known_hashes).')';
-
- $r2 = q("SELECT abook_id as id, xchan_hash as hash, xchan_name as name, xchan_photo_s as micro, xchan_url as url, xchan_addr as nick, abook_their_perms, abook_flags, abook_self
- FROM abook left join xchan on abook_xchan = xchan_hash
- WHERE abook_channel IN ($extra_channels_sql) $known_hashes_sql AND abook_blocked = 0 and abook_pending = 0 and abook_hidden = 0 and xchan_deleted = 0 $sql_extra2 order by $order_extra2 xchan_name asc");
- if($r2)
- $r = array_merge($r,$r2);
-
- // Sort accoring to match position, then alphabetically. This could be avoided if the above two SQL queries could be combined into one, and the sorting could be done on the SQl server (like in the case of a local user)
- $matchpos = function($x) use($search) {
- $namepos = strpos($x['name'],$search);
- $nickpos = strpos($x['nick'],$search);
- // Use a large position if not found
- return min($namepos === false ? 9999 : $namepos, $nickpos === false ? 9999 : $nickpos);
- };
- // This could be made simpler if PHP supported stable sorting
- usort($r,function($a,$b) use($matchpos) {
- $pos1 = $matchpos($a);
- $pos2 = $matchpos($b);
- if($pos1 == $pos2) { // Order alphabetically if match position is the same
- if($a['name'] == $b['name'])
- return 0;
- else
- return ($a['name'] < $b['name']) ? -1 : 1;
- }
- return ($pos1 < $pos2) ? -1 : 1;
- });
- }
- }
- if(intval(get_config('system','taganyone')) || intval(get_pconfig(local_channel(),'system','taganyone'))) {
- if((count($r) < 100) && $type == 'c') {
- $r2 = q("SELECT substr(xchan_hash,1,18) as id, xchan_hash as hash, xchan_name as name, xchan_photo_s as micro, xchan_url as url, xchan_addr as nick, 0 as abook_their_perms, 0 as abook_flags, 0 as abook_self
- FROM xchan
- WHERE xchan_deleted = 0 $sql_extra2 order by $order_extra2 xchan_name asc"
- );
- if($r2)
- $r = array_merge($r,$r2);
- }
- }
- }
- elseif($type == 'm') {
-
- $r = q("SELECT xchan_hash as id, xchan_name as name, xchan_addr as nick, xchan_photo_s as micro, xchan_url as url
- FROM abook left join xchan on abook_xchan = xchan_hash
- WHERE abook_channel = %d and ( (abook_their_perms = null) or (abook_their_perms & %d )>0)
- and xchan_deleted = 0
- $sql_extra3
- ORDER BY `xchan_name` ASC ",
- intval(local_channel()),
- intval(PERMS_W_MAIL)
- );
- }
- elseif(($type == 'a') || ($type == 'p')) {
-
- $r = q("SELECT abook_id as id, xchan_name as name, xchan_hash as hash, xchan_addr as nick, xchan_photo_s as micro, xchan_network as network, xchan_url as url, xchan_addr as attag , abook_their_perms FROM abook left join xchan on abook_xchan = xchan_hash
- WHERE abook_channel = %d
- and xchan_deleted = 0
- $sql_extra3
- ORDER BY xchan_name ASC ",
- intval(local_channel())
- );
-
- }
- elseif($type == 'x') {
- $r = navbar_complete($a);
- $contacts = array();
- if($r) {
- foreach($r as $g) {
- $contacts[] = array(
- "photo" => $g['photo'],
- "name" => $g['name'],
- "nick" => $g['address'],
- );
- }
- }
-
- $o = array(
- 'start' => $start,
- 'count' => $count,
- 'items' => $contacts,
- );
- echo json_encode($o);
- killme();
- }
- else
- $r = array();
-
- if(count($r)) {
- foreach($r as $g){
-
- // remove RSS feeds from ACLs - they are inaccessible
- if(strpos($g['hash'],'/') && $type != 'a')
- continue;
-
- if(($g['abook_their_perms'] & PERMS_W_TAGWALL) && $type == 'c' && (! $noforums)) {
- $contacts[] = array(
- "type" => "c",
- "photo" => "images/twopeople.png",
- "name" => $g['name'] . '+',
- "id" => $g['id'] . '+',
- "xid" => $g['hash'],
- "link" => $g['nick'],
- "nick" => substr($g['nick'],0,strpos($g['nick'],'@')),
- "self" => (intval($g['abook_self']) ? 'abook-self' : ''),
- "taggable" => 'taggable',
- "label" => t('network')
- );
- }
- $contacts[] = array(
- "type" => "c",
- "photo" => $g['micro'],
- "name" => $g['name'],
- "id" => $g['id'],
- "xid" => $g['hash'],
- "link" => $g['nick'],
- "nick" => (($g['nick']) ? substr($g['nick'],0,strpos($g['nick'],'@')) : t('RSS')),
- "self" => (intval($g['abook_self']) ? 'abook-self' : ''),
- "taggable" => '',
- "label" => '',
- );
- }
- }
-
- $items = array_merge($groups, $contacts);
-
- $o = array(
- 'start' => $start,
- 'count' => $count,
- 'items' => $items,
- );
-
-
-
- echo json_encode($o);
-
- killme();
-}
-
-
-function navbar_complete(&$a) {
-
-// logger('navbar_complete');
-
- if((get_config('system','block_public')) && (! local_channel()) && (! remote_channel())) {
- return;
- }
-
- $dirmode = intval(get_config('system','directory_mode'));
- $search = ((x($_REQUEST,'search')) ? htmlentities($_REQUEST['search'],ENT_COMPAT,'UTF-8',false) : '');
- if(! $search || mb_strlen($search) < 2)
- return array();
-
- $star = false;
- $address = false;
-
- if(substr($search,0,1) === '@')
- $search = substr($search,1);
-
- if(substr($search,0,1) === '*') {
- $star = true;
- $search = substr($search,1);
- }
-
- if(strpos($search,'@') !== false) {
- $address = true;
- }
-
- if(($dirmode == DIRECTORY_MODE_PRIMARY) || ($dirmode == DIRECTORY_MODE_STANDALONE)) {
- $url = z_root() . '/dirsearch';
- }
-
- if(! $url) {
- require_once("include/dir_fns.php");
- $directory = find_upstream_directory($dirmode);
- $url = $directory['url'] . '/dirsearch';
- }
-
- $count = (x($_REQUEST,'count')?$_REQUEST['count']:100);
- if($url) {
- $query = $url . '?f=' ;
- $query .= '&name=' . urlencode($search) . "&limit=$count" . (($address) ? '&address=' . urlencode($search) : '');
-
- $x = z_fetch_url($query);
- if($x['success']) {
- $t = 0;
- $j = json_decode($x['body'],true);
- if($j && $j['results']) {
- return $j['results'];
- }
- }
- }
- return array();
-}
diff --git a/mod/admin.php b/mod/admin.php
deleted file mode 100644
index be703f922..000000000
--- a/mod/admin.php
+++ /dev/null
@@ -1,1776 +0,0 @@
-<?php
-/**
- * @file mod/admin.php
- * @brief Hubzilla's admin controller.
- *
- * Controller for the /admin/ area.
- */
-
-require_once('include/queue_fn.php');
-require_once('include/account.php');
-
-/**
- * @param App &$a
- */
-function admin_post(&$a){
- logger('admin_post', LOGGER_DEBUG);
-
- if(! is_site_admin()) {
- return;
- }
-
- // urls
- if (argc() > 1) {
- switch (argv(1)) {
- case 'site':
- admin_page_site_post($a);
- break;
- case 'users':
- admin_page_users_post($a);
- break;
- case 'channels':
- admin_page_channels_post($a);
- break;
- case 'plugins':
- if (argc() > 2 &&
- is_file("addon/" . argv(2) . "/" . argv(2) . ".php")){
- @include_once("addon/" . argv(2) . "/" . argv(2) . ".php");
- if(function_exists(argv(2).'_plugin_admin_post')) {
- $func = argv(2) . '_plugin_admin_post';
- $func($a);
- }
- }
- goaway(z_root() . '/admin/plugins/' . argv(2) );
- break;
- case 'themes':
- $theme = argv(2);
- if (is_file("view/theme/$theme/php/config.php")){
- require_once("view/theme/$theme/php/config.php");
-// fixme add parent theme if derived
- if (function_exists("theme_admin_post")){
- theme_admin_post($a);
- }
- }
- info(t('Theme settings updated.'));
- if(is_ajax()) return;
-
- goaway(z_root() . '/admin/themes/' . $theme );
- break;
- case 'logs':
- admin_page_logs_post($a);
- break;
- case 'hubloc':
- admin_page_hubloc_post($a);
- break;
- case 'security':
- admin_page_security_post($a);
- break;
- case 'features':
- admin_page_features_post($a);
- break;
- case 'dbsync':
- admin_page_dbsync_post($a);
- break;
- case 'profs':
- admin_page_profs_post($a);
- break;
- }
- }
-
- goaway(z_root() . '/admin' );
-}
-
-/**
- * @param App &$a
- * @return string
- */
-function admin_content(&$a) {
-
- logger('admin_content', LOGGER_DEBUG);
-
- if(! is_site_admin()) {
- return login(false);
- }
-
-
- /*
- * Page content
- */
- $o = '';
-
- // urls
- if (argc() > 1){
- switch (argv(1)) {
- case 'site':
- $o = admin_page_site($a);
- break;
- case 'users':
- $o = admin_page_users($a);
- break;
- case 'channels':
- $o = admin_page_channels($a);
- break;
- case 'plugins':
- $o = admin_page_plugins($a);
- break;
- case 'themes':
- $o = admin_page_themes($a);
- break;
-// case 'hubloc':
-// $o = admin_page_hubloc($a);
-// break;
- case 'security':
- $o = admin_page_security($a);
- break;
- case 'features':
- $o = admin_page_features($a);
- break;
- case 'logs':
- $o = admin_page_logs($a);
- break;
- case 'dbsync':
- $o = admin_page_dbsync($a);
- break;
- case 'profs':
- $o = admin_page_profs($a);
- break;
- case 'queue':
- $o = admin_page_queue($a);
- break;
- default:
- notice( t('Item not found.') );
- }
- } else {
- $o = admin_page_summary($a);
- }
-
- if(is_ajax()) {
- echo $o;
- killme();
- return '';
- } else {
- return $o;
- }
-}
-
-
-/**
- * @brief Returns content for Admin Summary Page.
- *
- * @param App &$a
- * @return string HTML from parsed admin_summary.tpl
- */
-function admin_page_summary(&$a) {
-
- // list total user accounts, expirations etc.
- $accounts = array();
- $r = q("SELECT COUNT(*) AS total, COUNT(CASE WHEN account_expires > %s THEN 1 ELSE NULL END) AS expiring, COUNT(CASE WHEN account_expires < %s AND account_expires != '%s' THEN 1 ELSE NULL END) AS expired, COUNT(CASE WHEN (account_flags & %d)>0 THEN 1 ELSE NULL END) AS blocked FROM account",
- db_utcnow(),
- db_utcnow(),
- dbesc(NULL_DATE),
- intval(ACCOUNT_BLOCKED)
- );
- if ($r) {
- $accounts['total'] = array('label' => t('# Accounts'), 'val' => $r[0]['total']);
- $accounts['blocked'] = array('label' => t('# blocked accounts'), 'val' => $r[0]['blocked']);
- $accounts['expired'] = array('label' => t('# expired accounts'), 'val' => $r[0]['expired']);
- $accounts['expiring'] = array('label' => t('# expiring accounts'), 'val' => $r[0]['expiring']);
- }
-
- // pending registrations
- $r = q("SELECT COUNT(id) AS `count` FROM `register` WHERE `uid` != '0'");
- $pending = $r[0]['count'];
-
- // available channels, primary and clones
- $channels = array();
- $r = q("SELECT COUNT(*) AS total, COUNT(CASE WHEN channel_primary = 1 THEN 1 ELSE NULL END) AS main, COUNT(CASE WHEN channel_primary = 0 THEN 1 ELSE NULL END) AS clones FROM channel WHERE channel_removed = 0");
- if ($r) {
- $channels['total'] = array('label' => t('# Channels'), 'val' => $r[0]['total']);
- $channels['main'] = array('label' => t('# primary'), 'val' => $r[0]['main']);
- $channels['clones'] = array('label' => t('# clones'), 'val' => $r[0]['clones']);
- }
-
- // We can do better, but this is a quick queue status
- $r = q("SELECT COUNT(outq_delivered) AS total FROM outq WHERE outq_delivered = 0");
- $queue = (($r) ? $r[0]['total'] : 0);
- $queues = array( 'label' => t('Message queues'), 'queue' => $queue );
-
- // If no plugins active return 0, otherwise list of plugin names
- $plugins = (count(App::$plugins) == 0) ? count(App::$plugins) : App::$plugins;
-
- // Could be extended to provide also other alerts to the admin
- $alertmsg = '';
- // annoy admin about upcoming unsupported PHP version
- if (version_compare(PHP_VERSION, '5.4', '<')) {
- $alertmsg = 'Your PHP version ' . PHP_VERSION . ' will not be supported with the next major release of $Projectname. You are strongly urged to upgrade to a current version.'
- . '<br>PHP 5.3 has reached its <a href="http://php.net/eol.php" class="alert-link">End of Life (EOL)</a> in August 2014.'
- . ' A list about current PHP versions can be found <a href="http://php.net/supported-versions.php" class="alert-link">here</a>.';
- }
-
- $t = get_markup_template('admin_summary.tpl');
- return replace_macros($t, array(
- '$title' => t('Administration'),
- '$page' => t('Summary'),
- '$adminalertmsg' => $alertmsg,
- '$queues' => $queues,
- '$accounts' => array( t('Registered accounts'), $accounts),
- '$pending' => array( t('Pending registrations'), $pending),
- '$channels' => array( t('Registered channels'), $channels),
- '$plugins' => array( t('Active plugins'), $plugins ),
- '$version' => array( t('Version'), RED_VERSION),
- '$build' => get_config('system', 'db_version')
- ));
-}
-
-
-/**
- * @brief POST handler for Admin Site Page.
- *
- * @param App &$a
- */
-function admin_page_site_post(&$a){
- if (!x($_POST, 'page_site')){
- return;
- }
-
- check_form_security_token_redirectOnErr('/admin/site', 'admin_site');
-
- $sitename = ((x($_POST,'sitename')) ? notags(trim($_POST['sitename'])) : '');
- $banner = ((x($_POST,'banner')) ? trim($_POST['banner']) : false);
- $admininfo = ((x($_POST,'admininfo')) ? trim($_POST['admininfo']) : false);
- $language = ((x($_POST,'language')) ? notags(trim($_POST['language'])) : '');
- $theme = ((x($_POST,'theme')) ? notags(trim($_POST['theme'])) : '');
- $theme_mobile = ((x($_POST,'theme_mobile')) ? notags(trim($_POST['theme_mobile'])) : '');
-// $site_channel = ((x($_POST,'site_channel')) ? notags(trim($_POST['site_channel'])) : '');
- $maximagesize = ((x($_POST,'maximagesize')) ? intval(trim($_POST['maximagesize'])) : 0);
-
- $register_policy = ((x($_POST,'register_policy')) ? intval(trim($_POST['register_policy'])) : 0);
-
- $access_policy = ((x($_POST,'access_policy')) ? intval(trim($_POST['access_policy'])) : 0);
- $invite_only = ((x($_POST,'invite_only')) ? True : False);
- $abandon_days = ((x($_POST,'abandon_days')) ? intval(trim($_POST['abandon_days'])) : 0);
-
- $register_text = ((x($_POST,'register_text')) ? notags(trim($_POST['register_text'])) : '');
- $frontpage = ((x($_POST,'frontpage')) ? notags(trim($_POST['frontpage'])) : '');
- $mirror_frontpage = ((x($_POST,'mirror_frontpage')) ? intval(trim($_POST['mirror_frontpage'])) : 0);
- $directory_server = ((x($_POST,'directory_server')) ? trim($_POST['directory_server']) : '');
- $allowed_sites = ((x($_POST,'allowed_sites')) ? notags(trim($_POST['allowed_sites'])) : '');
- $allowed_email = ((x($_POST,'allowed_email')) ? notags(trim($_POST['allowed_email'])) : '');
- $not_allowed_email = ((x($_POST,'not_allowed_email')) ? notags(trim($_POST['not_allowed_email'])) : '');
- $force_publish = ((x($_POST,'publish_all')) ? True : False);
- $disable_discover_tab = ((x($_POST,'disable_discover_tab')) ? False : True);
- $login_on_homepage = ((x($_POST,'login_on_homepage')) ? True : False);
- $global_directory = ((x($_POST,'directory_submit_url')) ? notags(trim($_POST['directory_submit_url'])) : '');
- $no_community_page = !((x($_POST,'no_community_page')) ? True : False);
- $default_expire_days = ((array_key_exists('default_expire_days',$_POST)) ? intval($_POST['default_expire_days']) : 0);
-
- $verifyssl = ((x($_POST,'verifyssl')) ? True : False);
- $proxyuser = ((x($_POST,'proxyuser')) ? notags(trim($_POST['proxyuser'])) : '');
- $proxy = ((x($_POST,'proxy')) ? notags(trim($_POST['proxy'])) : '');
- $timeout = ((x($_POST,'timeout')) ? intval(trim($_POST['timeout'])) : 60);
- $delivery_interval = ((x($_POST,'delivery_interval'))? intval(trim($_POST['delivery_interval'])) : 0);
- $delivery_batch_count = ((x($_POST,'delivery_batch_count') && $_POST['delivery_batch_count'] > 0)? intval(trim($_POST['delivery_batch_count'])) : 1);
- $poll_interval = ((x($_POST,'poll_interval')) ? intval(trim($_POST['poll_interval'])) : 0);
- $maxloadavg = ((x($_POST,'maxloadavg')) ? intval(trim($_POST['maxloadavg'])) : 50);
- $feed_contacts = ((x($_POST,'feed_contacts')) ? intval($_POST['feed_contacts']) : 0);
- $verify_email = ((x($_POST,'verify_email')) ? 1 : 0);
-
- set_config('system', 'feed_contacts', $feed_contacts);
- set_config('system', 'delivery_interval', $delivery_interval);
- set_config('system', 'delivery_batch_count', $delivery_batch_count);
- set_config('system', 'poll_interval', $poll_interval);
- set_config('system', 'maxloadavg', $maxloadavg);
- set_config('system', 'frontpage', $frontpage);
- set_config('system', 'mirror_frontpage', $mirror_frontpage);
- set_config('system', 'sitename', $sitename);
- set_config('system', 'login_on_homepage', $login_on_homepage);
- set_config('system', 'verify_email', $verify_email);
- set_config('system', 'default_expire_days', $default_expire_days);
-
- if($directory_server)
- set_config('system','directory_server',$directory_server);
-
- if ($banner == '') {
- del_config('system', 'banner');
- } else {
- set_config('system', 'banner', $banner);
- }
-
- if ($admininfo == ''){
- del_config('system', 'admininfo');
- } else {
- require_once('include/text.php');
- linkify_tags($a, $admininfo, local_channel());
- set_config('system', 'admininfo', $admininfo);
- }
- set_config('system', 'language', $language);
- set_config('system', 'theme', $theme);
- if ( $theme_mobile === '---' ) {
- del_config('system', 'mobile_theme');
- } else {
- set_config('system', 'mobile_theme', $theme_mobile);
- }
-// set_config('system','site_channel', $site_channel);
- set_config('system','maximagesize', $maximagesize);
-
- set_config('system','register_policy', $register_policy);
- set_config('system','invitation_only', $invite_only);
- set_config('system','access_policy', $access_policy);
- set_config('system','account_abandon_days', $abandon_days);
- set_config('system','register_text', $register_text);
- set_config('system','allowed_sites', $allowed_sites);
- set_config('system','allowed_email', $allowed_email);
- set_config('system','not_allowed_email', $not_allowed_email);
- set_config('system','publish_all', $force_publish);
- set_config('system','disable_discover_tab', $disable_discover_tab);
- if ($global_directory == '') {
- del_config('system', 'directory_submit_url');
- } else {
- set_config('system', 'directory_submit_url', $global_directory);
- }
-
- set_config('system','no_community_page', $no_community_page);
- set_config('system','no_utf', $no_utf);
- set_config('system','verifyssl', $verifyssl);
- set_config('system','proxyuser', $proxyuser);
- set_config('system','proxy', $proxy);
- set_config('system','curl_timeout', $timeout);
-
- info( t('Site settings updated.') . EOL);
- goaway(z_root() . '/admin/site' );
-}
-
-/**
- * @brief Admin page site.
- *
- * @param App $a
- * @return string
- */
-function admin_page_site(&$a) {
-
- /* Installed langs */
- $lang_choices = array();
- $langs = glob('view/*/hstrings.php');
-
- if(is_array($langs) && count($langs)) {
- if(! in_array('view/en/hstrings.php',$langs))
- $langs[] = 'view/en/';
- asort($langs);
- foreach($langs as $l) {
- $t = explode("/",$l);
- $lang_choices[$t[1]] = $t[1];
- }
- }
-
- /* Installed themes */
- $theme_choices_mobile["---"] = t("Default");
- $theme_choices = array();
- $files = glob('view/theme/*');
- if($files) {
- foreach($files as $file) {
- $vars = '';
- $f = basename($file);
- if (file_exists($file . '/library'))
- continue;
- if (file_exists($file . '/mobile'))
- $vars = t('mobile');
- if (file_exists($file . '/experimental'))
- $vars .= t('experimental');
- if (file_exists($file . '/unsupported'))
- $vars .= t('unsupported');
- if ($vars) {
- $theme_choices[$f] = $f . ' (' . $vars . ')';
- $theme_choices_mobile[$f] = $f . ' (' . $vars . ')';
- }
- else {
- $theme_choices[$f] = $f;
- $theme_choices_mobile[$f] = $f;
- }
- }
- }
-
- $dir_choices = null;
- $dirmode = get_config('system','directory_mode');
- $realm = get_directory_realm();
-
- // directory server should not be set or settable unless we are a directory client
-
- if($dirmode == DIRECTORY_MODE_NORMAL) {
- $x = q("select site_url from site where site_flags in (%d,%d) and site_realm = '%s'",
- intval(DIRECTORY_MODE_SECONDARY),
- intval(DIRECTORY_MODE_PRIMARY),
- dbesc($realm)
- );
- if($x) {
- $dir_choices = array();
- foreach($x as $xx) {
- $dir_choices[$xx['site_url']] = $xx['site_url'];
- }
- }
- }
-
- /* Banner */
-
- $banner = get_config('system', 'banner');
- if($banner === false)
- $banner = get_config('system','sitename');
-
- $banner = htmlspecialchars($banner);
-
- /* Admin Info */
- $admininfo = get_config('system', 'admininfo');
-
- /* Register policy */
- $register_choices = Array(
- REGISTER_CLOSED => t("No"),
- REGISTER_APPROVE => t("Yes - with approval"),
- REGISTER_OPEN => t("Yes")
- );
-
- /* Acess policy */
- $access_choices = Array(
- ACCESS_PRIVATE => t("My site is not a public server"),
- ACCESS_PAID => t("My site has paid access only"),
- ACCESS_FREE => t("My site has free access only"),
- ACCESS_TIERED => t("My site offers free accounts with optional paid upgrades")
- );
-
-// $ssl_choices = array(
-// SSL_POLICY_NONE => t("No SSL policy, links will track page SSL state"),
-// SSL_POLICY_FULL => t("Force all links to use SSL")
-// );
-
- $discover_tab = get_config('system','disable_discover_tab');
- // $disable public streams by default
- if($discover_tab === false)
- $discover_tab = 1;
- // now invert the logic for the setting.
- $discover_tab = (1 - $discover_tab);
-
-
- $homelogin = get_config('system','login_on_homepage');
-
- $t = get_markup_template("admin_site.tpl");
- return replace_macros($t, array(
- '$title' => t('Administration'),
- '$page' => t('Site'),
- '$submit' => t('Submit'),
- '$registration' => t('Registration'),
- '$upload' => t('File upload'),
- '$corporate' => t('Policies'),
- '$advanced' => t('Advanced'),
-
- '$baseurl' => z_root(),
- // name, label, value, help string, extra data...
- '$sitename' => array('sitename', t("Site name"), htmlspecialchars(get_config('system','sitename'), ENT_QUOTES, 'UTF-8'),''),
- '$banner' => array('banner', t("Banner/Logo"), $banner, ""),
- '$admininfo' => array('admininfo', t("Administrator Information"), $admininfo, t("Contact information for site administrators. Displayed on siteinfo page. BBCode can be used here")),
- '$language' => array('language', t("System language"), get_config('system','language'), "", $lang_choices),
- '$theme' => array('theme', t("System theme"), get_config('system','theme'), t("Default system theme - may be over-ridden by user profiles - <a href='#' id='cnftheme'>change theme settings</a>"), $theme_choices),
- '$theme_mobile' => array('theme_mobile', t("Mobile system theme"), get_config('system','mobile_theme'), t("Theme for mobile devices"), $theme_choices_mobile),
-// '$site_channel' => array('site_channel', t("Channel to use for this website's static pages"), get_config('system','site_channel'), t("Site Channel")),
- '$feed_contacts' => array('feed_contacts', t('Allow Feeds as Connections'),get_config('system','feed_contacts'),t('(Heavy system resource usage)')),
- '$maximagesize' => array('maximagesize', t("Maximum image size"), intval(get_config('system','maximagesize')), t("Maximum size in bytes of uploaded images. Default is 0, which means no limits.")),
- '$register_policy' => array('register_policy', t("Does this site allow new member registration?"), get_config('system','register_policy'), "", $register_choices),
- '$invite_only' => array('invite_only', t("Invitation only"), get_config('system','invitation_only'), t("Only allow new member registrations with an invitation code. Above register policy must be set to Yes.")),
- '$access_policy' => array('access_policy', t("Which best describes the types of account offered by this hub?"), get_config('system','access_policy'), "This is displayed on the public server site list.", $access_choices),
- '$register_text' => array('register_text', t("Register text"), htmlspecialchars(get_config('system','register_text'), ENT_QUOTES, 'UTF-8'), t("Will be displayed prominently on the registration page.")),
- '$frontpage' => array('frontpage', t("Site homepage to show visitors (default: login box)"), get_config('system','frontpage'), t("example: 'public' to show public stream, 'page/sys/home' to show a system webpage called 'home' or 'include:home.html' to include a file.")),
- '$mirror_frontpage' => array('mirror_frontpage', t("Preserve site homepage URL"), get_config('system','mirror_frontpage'), t('Present the site homepage in a frame at the original location instead of redirecting')),
- '$abandon_days' => array('abandon_days', t('Accounts abandoned after x days'), get_config('system','account_abandon_days'), t('Will not waste system resources polling external sites for abandonded accounts. Enter 0 for no time limit.')),
- '$allowed_sites' => array('allowed_sites', t("Allowed friend domains"), get_config('system','allowed_sites'), t("Comma separated list of domains which are allowed to establish friendships with this site. Wildcards are accepted. Empty to allow any domains")),
- '$allowed_email' => array('allowed_email', t("Allowed email domains"), get_config('system','allowed_email'), t("Comma separated list of domains which are allowed in email addresses for registrations to this site. Wildcards are accepted. Empty to allow any domains")),
- '$not_allowed_email' => array('not_allowed_email', t("Not allowed email domains"), get_config('system','not_allowed_email'), t("Comma separated list of domains which are not allowed in email addresses for registrations to this site. Wildcards are accepted. Empty to allow any domains, unless allowed domains have been defined.")),
- '$verify_email' => array('verify_email', t("Verify Email Addresses"), get_config('system','verify_email'), t("Check to verify email addresses used in account registration (recommended).")),
- '$force_publish' => array('publish_all', t("Force publish"), get_config('system','publish_all'), t("Check to force all profiles on this site to be listed in the site directory.")),
- '$disable_discover_tab' => array('disable_discover_tab', t('Import Public Streams'), $discover_tab, t('Import and allow access to public content pulled from other sites. Warning: this content is unmoderated.')),
- '$login_on_homepage' => array('login_on_homepage', t("login on Homepage"),((intval($homelogin) || $homelogin === false) ? 1 : '') , t("Present a login box to visitors on the home page if no other content has been configured.")),
-
- '$directory_server' => (($dir_choices) ? array('directory_server', t("Directory Server URL"), get_config('system','directory_server'), t("Default directory server"), $dir_choices) : null),
-
- '$proxyuser' => array('proxyuser', t("Proxy user"), get_config('system','proxyuser'), ""),
- '$proxy' => array('proxy', t("Proxy URL"), get_config('system','proxy'), ""),
- '$timeout' => array('timeout', t("Network timeout"), (x(get_config('system','curl_timeout'))?get_config('system','curl_timeout'):60), t("Value is in seconds. Set to 0 for unlimited (not recommended).")),
- '$delivery_interval' => array('delivery_interval', t("Delivery interval"), (x(get_config('system','delivery_interval'))?get_config('system','delivery_interval'):2), t("Delay background delivery processes by this many seconds to reduce system load. Recommend: 4-5 for shared hosts, 2-3 for virtual private servers. 0-1 for large dedicated servers.")),
- '$delivery_batch_count' => array('delivery_batch_count', t('Deliveries per process'),(x(get_config('system','delivery_batch_count'))?get_config('system','delivery_batch_count'):1), t("Number of deliveries to attempt in a single operating system process. Adjust if necessary to tune system performance. Recommend: 1-5.")),
- '$poll_interval' => array('poll_interval', t("Poll interval"), (x(get_config('system','poll_interval'))?get_config('system','poll_interval'):2), t("Delay background polling processes by this many seconds to reduce system load. If 0, use delivery interval.")),
- '$maxloadavg' => array('maxloadavg', t("Maximum Load Average"), ((intval(get_config('system','maxloadavg')) > 0)?get_config('system','maxloadavg'):50), t("Maximum system load before delivery and poll processes are deferred - default 50.")),
- '$default_expire_days' => array('default_expire_days', t('Expiration period in days for imported (grid/network) content'), intval(get_config('system','default_expire_days')), t('0 for no expiration of imported content')),
- '$form_security_token' => get_form_security_token("admin_site"),
- ));
-}
-
-function admin_page_hubloc_post(&$a){
- check_form_security_token_redirectOnErr('/admin/hubloc', 'admin_hubloc');
- require_once('include/zot.php');
-
- //prepare for ping
-
- if ( $_POST['hublocid']) {
- $hublocid = $_POST['hublocid'];
- $arrhublocurl = q("SELECT hubloc_url FROM hubloc WHERE hubloc_id = %d ",
- intval($hublocid)
- );
- $hublocurl = $arrhublocurl[0]['hubloc_url'] . '/post';
-
- //perform ping
- $m = zot_build_packet(App::get_channel(),'ping');
- $r = zot_zot($hublocurl,$m);
- //handle results and set the hubloc flags in db to make results visible
- $r2 = $r['body'];
- $r3 = $r2['success'];
- if ( $r3['success'] == True ){
- //set HUBLOC_OFFLINE to 0
- logger(' success = true ',LOGGER_DEBUG);
- } else {
- //set HUBLOC_OFFLINE to 1
- logger(' success = false ', LOGGER_DEBUG);
- }
-
- //unfotunatly zping wont work, I guess return format is not correct
- //require_once('mod/zping.php');
- //$r = zping_content($hublocurl);
- //logger('zping answer: ' . $r, LOGGER_DEBUG);
-
- //in case of repair store new pub key for tested hubloc (all channel with this hubloc) in db
- //after repair set hubloc flags to 0
- }
-
- goaway(z_root() . '/admin/hubloc' );
-}
-
-function trim_array_elems($arr) {
- $narr = array();
-
- if($arr && is_array($arr)) {
- for($x = 0; $x < count($arr); $x ++) {
- $y = trim($arr[$x]);
- if($y)
- $narr[] = $y;
- }
- }
- return $narr;
-}
-
-function admin_page_security_post(&$a){
- check_form_security_token_redirectOnErr('/admin/security', 'admin_security');
-
-logger('post: ' . print_r($_POST,true));
-
- $block_public = ((x($_POST,'block_public')) ? True : False);
- set_config('system','block_public',$block_public);
-
- $ws = trim_array_elems(explode("\n",$_POST['whitelisted_sites']));
- set_config('system','whitelisted_sites',$ws);
-
- $bs = trim_array_elems(explode("\n",$_POST['blacklisted_sites']));
- set_config('system','blacklisted_sites',$bs);
-
- $wc = trim_array_elems(explode("\n",$_POST['whitelisted_channels']));
- set_config('system','whitelisted_channels',$wc);
-
- $bc = trim_array_elems(explode("\n",$_POST['blacklisted_channels']));
- set_config('system','blacklisted_channels',$bc);
-
- $embed_coop = ((x($_POST,'embed_coop')) ? True : False);
- set_config('system','embed_coop',$embed_coop);
-
- $we = trim_array_elems(explode("\n",$_POST['embed_allow']));
- set_config('system','embed_allow',$we);
-
- $be = trim_array_elems(explode("\n",$_POST['embed_deny']));
- set_config('system','embed_deny',$be);
-
- goaway(z_root() . '/admin/security');
-}
-
-
-
-
-function admin_page_features_post(&$a) {
-
- check_form_security_token_redirectOnErr('/admin/features', 'admin_manage_features');
-
- logger('postvars: ' . print_r($_POST,true));
-
- $arr = array();
- $features = get_features(false);
-
- foreach($features as $fname => $fdata) {
- foreach(array_slice($fdata,1) as $f) {
- $feature = $f[0];
-
- if(array_key_exists('feature_' . $feature,$_POST))
- $val = intval($_POST['feature_' . $feature]);
- else
- $val = 0;
- set_config('feature',$feature,$val);
-
- if(array_key_exists('featurelock_' . $feature,$_POST))
- set_config('feature_lock',$feature,$val);
- else
- del_config('feature_lock',$feature);
- }
- }
-
- goaway(z_root() . '/admin/features' );
-
-}
-
-function admin_page_features(&$a) {
-
- if((argc() > 1) && (argv(1) === 'features')) {
- $arr = array();
- $features = get_features(false);
-
- foreach($features as $fname => $fdata) {
- $arr[$fname] = array();
- $arr[$fname][0] = $fdata[0];
- foreach(array_slice($fdata,1) as $f) {
-
- $set = get_config('feature',$f[0]);
- if($set === false)
- $set = $f[3];
- $arr[$fname][1][] = array(
- array('feature_' .$f[0],$f[1],$set,$f[2],array(t('Off'),t('On'))),
- array('featurelock_' .$f[0],sprintf( t('Lock feature %s'),$f[1]),(($f[4] !== false) ? 1 : 0),'',array(t('Off'),t('On')))
- );
- }
- }
-
- $tpl = get_markup_template("admin_settings_features.tpl");
- $o .= replace_macros($tpl, array(
- '$form_security_token' => get_form_security_token("admin_manage_features"),
- '$title' => t('Manage Additional Features'),
- '$features' => $arr,
- '$submit' => t('Submit'),
- ));
-
- return $o;
- }
-}
-
-
-
-
-
-function admin_page_hubloc(&$a) {
- $hubloc = q("SELECT hubloc_id, hubloc_addr, hubloc_host, hubloc_status FROM hubloc");
-
- if(! $hubloc){
- notice( t('No server found') . EOL);
- goaway(z_root() . '/admin/hubloc');
- }
-
- $t = get_markup_template('admin_hubloc.tpl');
- return replace_macros($t, array(
- '$hubloc' => $hubloc,
- '$th_hubloc' => array(t('ID'), t('for channel'), t('on server'), t('Status')),
- '$title' => t('Administration'),
- '$page' => t('Server'),
- '$queues' => $queues,
- //'$accounts' => $accounts, /*$accounts is empty here*/
- '$pending' => array( t('Pending registrations'), $pending),
- '$plugins' => array( t('Active plugins'), App::$plugins ),
- '$form_security_token' => get_form_security_token('admin_hubloc')
- ));
-}
-
-function admin_page_security(&$a) {
-
- $whitesites = get_config('system','whitelisted_sites');
- $whitesites_str = ((is_array($whitesites)) ? implode($whitesites,"\n") : '');
-
- $blacksites = get_config('system','blacklisted_sites');
- $blacksites_str = ((is_array($blacksites)) ? implode($blacksites,"\n") : '');
-
-
- $whitechannels = get_config('system','whitelisted_channels');
- $whitechannels_str = ((is_array($whitechannels)) ? implode($whitechannels,"\n") : '');
-
- $blackchannels = get_config('system','blacklisted_channels');
- $blackchannels_str = ((is_array($blackchannels)) ? implode($blackchannels,"\n") : '');
-
-
- $whiteembeds = get_config('system','embed_allow');
- $whiteembeds_str = ((is_array($whiteembeds)) ? implode($whiteembeds,"\n") : '');
-
- $blackembeds = get_config('system','embed_deny');
- $blackembeds_str = ((is_array($blackembeds)) ? implode($blackembeds,"\n") : '');
-
- $embed_coop = intval(get_config('system','embed_coop'));
-
-// wait to implement this until we have a co-op in place.
-// if((! $whiteembeds) && (! $blackembeds) && (! $embed_coop))
-// $whiteembeds_str = "youtube.com\nyoutu.be\ntwitter.com\nvimeo.com\nsoundcloud.com\nwikipedia.com";
-
- $t = get_markup_template('admin_security.tpl');
- return replace_macros($t, array(
- '$title' => t('Administration'),
- '$page' => t('Security'),
- '$form_security_token' => get_form_security_token('admin_security'),
- '$block_public' => array('block_public', t("Block public"), get_config('system','block_public'), t("Check to block public access to all otherwise public personal pages on this site unless you are currently authenticated.")),
- '$whitelisted_sites' => array('whitelisted_sites', t('Allow communications only from these sites'), $whitesites_str, t('One site per line. Leave empty to allow communication from anywhere by default')),
- '$blacklisted_sites' => array('blacklisted_sites', t('Block communications from these sites'), $blacksites_str, ''),
- '$whitelisted_channels' => array('whitelisted_channels', t('Allow communications only from these channels'), $whitechannels_str, t('One channel (hash) per line. Leave empty to allow from any channel by default')),
- '$blacklisted_channels' => array('blacklisted_channels', t('Block communications from these channels'), $blackchannels_str, ''),
- '$embed_allow' => array('embed_allow', t('Allow embedded HTML content only from these domains'), $whiteembeds_str, t('One site per line. Leave empty to allow from any site by default')),
- '$embed_deny' => array('embed_deny', t('Block embedded HTML from these domains'), $blackembeds_str, ''),
-
- '$embed_coop' => array('embed_coop', t('Cooperative embed security'), $embed_coop, t('Enable to share embed security with other compatible sites/hubs')),
- '$submit' => t('Submit')
- ));
-}
-
-
-
-
-function admin_page_dbsync(&$a) {
- $o = '';
-
- if(argc() > 3 && intval(argv(3)) && argv(2) === 'mark') {
- set_config('database', 'update_r' . intval(argv(3)), 'success');
- if(intval(get_config('system','db_version')) <= intval(argv(3)))
- set_config('system','db_version',intval(argv(3)) + 1);
- info( t('Update has been marked successful') . EOL);
- goaway(z_root() . '/admin/dbsync');
- }
-
- if(argc() > 2 && intval(argv(2))) {
- require_once('install/update.php');
- $func = 'update_r' . intval(argv(2));
- if(function_exists($func)) {
- $retval = $func();
- if($retval === UPDATE_FAILED) {
- $o .= sprintf( t('Executing %s failed. Check system logs.'), $func);
- }
- elseif($retval === UPDATE_SUCCESS) {
- $o .= sprintf( t('Update %s was successfully applied.'), $func);
- set_config('database',$func, 'success');
- }
- else
- $o .= sprintf( t('Update %s did not return a status. Unknown if it succeeded.'), $func);
- }
- else
- $o .= sprintf( t('Update function %s could not be found.'), $func);
-
- return $o;
- }
-
- $failed = array();
- $r = q("select * from config where `cat` = 'database' ");
- if(count($r)) {
- foreach($r as $rr) {
- $upd = intval(substr($rr['k'],8));
- if($rr['v'] === 'success')
- continue;
- $failed[] = $upd;
- }
- }
- if(! count($failed))
- return '<div class="generic-content-wrapper-styled"><h3>' . t('No failed updates.') . '</h3></div>';
-
- $o = replace_macros(get_markup_template('failed_updates.tpl'),array(
- '$base' => z_root(),
- '$banner' => t('Failed Updates'),
- '$desc' => '',
- '$mark' => t('Mark success (if update was manually applied)'),
- '$apply' => t('Attempt to execute this update step automatically'),
- '$failed' => $failed
- ));
-
- return $o;
-}
-
-function admin_page_queue($a) {
- $o = '';
-
- $expert = ((array_key_exists('expert',$_REQUEST)) ? intval($_REQUEST['expert']) : 0);
-
- if($_REQUEST['drophub']) {
- require_once('hubloc.php');
- hubloc_mark_as_down($_REQUEST['drophub']);
- remove_queue_by_posturl($_REQUEST['drophub']);
- }
-
- if($_REQUEST['emptyhub']) {
- remove_queue_by_posturl($_REQUEST['emptyhub']);
- }
-
- $r = q("select count(outq_posturl) as total, max(outq_priority) as priority, outq_posturl from outq
- where outq_delivered = 0 group by outq_posturl order by total desc");
-
- for($x = 0; $x < count($r); $x ++) {
- $r[$x]['eurl'] = urlencode($r[$x]['outq_posturl']);
- $r[$x]['connected'] = datetime_convert('UTC',date_default_timezone_get(),$r[$x]['connected'],'Y-m-d');
- }
-
- $o = replace_macros(get_markup_template('admin_queue.tpl'), array(
- '$banner' => t('Queue Statistics'),
- '$numentries' => t('Total Entries'),
- '$priority' => t('Priority'),
- '$desturl' => t('Destination URL'),
- '$nukehub' => t('Mark hub permanently offline'),
- '$empty' => t('Empty queue for this hub'),
- '$lastconn' => t('Last known contact'),
- '$hasentries' => ((count($r)) ? true : false),
- '$entries' => $r,
- '$expert' => $expert
- ));
-
- return $o;
-}
-
-/**
- * @brief Handle POST actions on users admin page.
- *
- * This function is called when on the admin user/account page the form was
- * submitted to handle multiple operations at once. If one of the icons next
- * to an entry are pressed the function admin_page_users() will handle this.
- *
- * @param App $a
- */
-function admin_page_users_post($a) {
- $pending = ( x($_POST, 'pending') ? $_POST['pending'] : array() );
- $users = ( x($_POST, 'user') ? $_POST['user'] : array() );
- $blocked = ( x($_POST, 'blocked') ? $_POST['blocked'] : array() );
-
- check_form_security_token_redirectOnErr('/admin/users', 'admin_users');
-
- // change to switch structure?
- // account block/unblock button was submitted
- if (x($_POST, 'page_users_block')) {
- for ($i = 0; $i < count($users); $i++) {
- // if account is blocked remove blocked bit-flag, otherwise add blocked bit-flag
- $op = ($blocked[$i]) ? '& ~' : '| ';
- q("UPDATE account SET account_flags = (account_flags $op%d) WHERE account_id = %d",
- intval(ACCOUNT_BLOCKED),
- intval($users[$i])
- );
- }
- notice( sprintf( tt("%s account blocked/unblocked", "%s account blocked/unblocked", count($users)), count($users)) );
- }
- // account delete button was submitted
- if (x($_POST, 'page_users_delete')) {
- require_once('include/Contact.php');
- foreach ($users as $uid){
- account_remove($uid, true, false);
- }
- notice( sprintf( tt("%s account deleted", "%s accounts deleted", count($users)), count($users)) );
- }
- // registration approved button was submitted
- if (x($_POST, 'page_users_approve')) {
- foreach ($pending as $hash) {
- account_allow($hash);
- }
- }
- // registration deny button was submitted
- if (x($_POST, 'page_users_deny')) {
- foreach ($pending as $hash) {
- account_deny($hash);
- }
- }
-
- goaway(z_root() . '/admin/users' );
-}
-
-/**
- * @brief Generate users admin page and handle single item operations.
- *
- * This function generates the users/account admin page and handles the actions
- * if an icon next to an entry was clicked. If several items were selected and
- * the form was submitted it is handled by the function admin_page_users_post().
- *
- * @param App &$a
- * @return string
- */
-function admin_page_users(&$a){
- if (argc() > 2) {
- $uid = argv(3);
- $account = q("SELECT * FROM account WHERE account_id = %d",
- intval($uid)
- );
-
- if (! $account) {
- notice( t('Account not found') . EOL);
- goaway(z_root() . '/admin/users' );
- }
-
- check_form_security_token_redirectOnErr('/admin/users', 'admin_users', 't');
-
- switch (argv(2)){
- case 'delete':
- // delete user
- require_once('include/Contact.php');
- account_remove($uid,true,false);
-
- notice( sprintf(t("Account '%s' deleted"), $account[0]['account_email']) . EOL);
- break;
- case 'block':
- q("UPDATE account SET account_flags = ( account_flags | %d ) WHERE account_id = %d",
- intval(ACCOUNT_BLOCKED),
- intval($uid)
- );
-
- notice( sprintf( t("Account '%s' blocked") , $account[0]['account_email']) . EOL);
- break;
- case 'unblock':
- q("UPDATE account SET account_flags = ( account_flags & ~%d ) WHERE account_id = %d",
- intval(ACCOUNT_BLOCKED),
- intval($uid)
- );
-
- notice( sprintf( t("Account '%s' unblocked"), $account[0]['account_email']) . EOL);
- break;
- }
-
- goaway(z_root() . '/admin/users' );
- }
-
- /* get pending */
- $pending = q("SELECT account.*, register.hash from account left join register on account_id = register.uid where (account_flags & %d )>0 ",
- intval(ACCOUNT_PENDING)
- );
-
- /* get users */
-
- $total = q("SELECT count(*) as total FROM account");
- if (count($total)) {
- App::set_pager_total($total[0]['total']);
- App::set_pager_itemspage(100);
- }
-
-
-// We'll still need to link email addresses to admin/users/channels or some such, but this bit doesn't exist yet.
-// That's where we need to be doing last post/channel flags/etc, not here.
-
- $serviceclass = (($_REQUEST['class']) ? " and account_service_class = '" . dbesc($_REQUEST['class']) . "' " : '');
-
- $order = " order by account_email asc ";
- if($_REQUEST['order'] === 'expires')
- $order = " order by account_expires desc ";
- if($_REQUEST['order'] === 'created')
- $order = " order by account_created desc ";
-
- $users = q("SELECT `account_id` , `account_email`, `account_lastlog`, `account_created`, `account_expires`, " . "`account_service_class`, ( account_flags & %d )>0 as `blocked`, " .
- "(SELECT %s FROM channel as ch " .
- "WHERE ch.channel_account_id = ac.account_id and ch.channel_removed = 0 ) as `channels` " .
- "FROM account as ac where true $serviceclass $order limit %d offset %d ",
- intval(ACCOUNT_BLOCKED),
- db_concat('ch.channel_address', ' '),
- intval(App::$pager['itemspage']),
- intval(App::$pager['start'])
- );
-
-// function _setup_users($e){
-// $accounts = Array(
-// t('Normal Account'),
-// t('Soapbox Account'),
-// t('Community/Celebrity Account'),
-// t('Automatic Friend Account')
-// );
-
-// $e['page_flags'] = $accounts[$e['page-flags']];
-// $e['register_date'] = relative_date($e['register_date']);
-// $e['login_date'] = relative_date($e['login_date']);
-// $e['lastitem_date'] = relative_date($e['lastitem_date']);
-// return $e;
-// }
-// $users = array_map("_setup_users", $users);
-
- $t = get_markup_template('admin_users.tpl');
- $o = replace_macros($t, array(
- // strings //
- '$title' => t('Administration'),
- '$page' => t('Users'),
- '$submit' => t('Submit'),
- '$select_all' => t('select all'),
- '$h_pending' => t('User registrations waiting for confirm'),
- '$th_pending' => array( t('Request date'), t('Email') ),
- '$no_pending' => t('No registrations.'),
- '$approve' => t('Approve'),
- '$deny' => t('Deny'),
- '$delete' => t('Delete'),
- '$block' => t('Block'),
- '$unblock' => t('Unblock'),
-
- '$h_users' => t('Users'),
- '$th_users' => array( t('ID'), t('Email'), t('All Channels'), t('Register date'), t('Last login'), t('Expires'), t('Service Class')),
-
- '$confirm_delete_multi' => t('Selected accounts will be deleted!\n\nEverything these accounts had posted on this site will be permanently deleted!\n\nAre you sure?'),
- '$confirm_delete' => t('The account {0} will be deleted!\n\nEverything this account has posted on this site will be permanently deleted!\n\nAre you sure?'),
-
- '$form_security_token' => get_form_security_token("admin_users"),
-
- // values //
- '$baseurl' => z_root(),
-
- '$pending' => $pending,
- '$users' => $users,
- ));
- $o .= paginate($a);
-
- return $o;
-}
-
-
-/**
- * @brief Channels admin page.
- *
- * @param App &$a
- */
-function admin_page_channels_post(&$a) {
- $channels = ( x($_POST, 'channel') ? $_POST['channel'] : Array() );
-
- check_form_security_token_redirectOnErr('/admin/channels', 'admin_channels');
-
- $xor = db_getfunc('^');
-
- if (x($_POST,'page_channels_block')){
- foreach($channels as $uid){
- q("UPDATE channel SET channel_pageflags = ( channel_pageflags $xor %d ) where channel_id = %d",
- intval(PAGE_CENSORED),
- intval( $uid )
- );
- proc_run('php','include/directory.php',$uid,'nopush');
- }
- notice( sprintf( tt("%s channel censored/uncensored", "%s channels censored/uncensored", count($channels)), count($channels)) );
- }
- if (x($_POST,'page_channels_code')){
- foreach($channels as $uid){
- q("UPDATE channel SET channel_pageflags = ( channel_pageflags $xor %d ) where channel_id = %d",
- intval(PAGE_ALLOWCODE),
- intval( $uid )
- );
- }
- notice( sprintf( tt("%s channel code allowed/disallowed", "%s channels code allowed/disallowed", count($channels)), count($channels)) );
- }
- if (x($_POST,'page_channels_delete')){
- require_once("include/Contact.php");
- foreach($channels as $uid){
- channel_remove($uid,true);
- }
- notice( sprintf( tt("%s channel deleted", "%s channels deleted", count($channels)), count($channels)) );
- }
-
- goaway(z_root() . '/admin/channels' );
-}
-
-/**
- * @brief
- *
- * @param App &$a
- * @return string
- */
-function admin_page_channels(&$a){
- if (argc() > 2) {
- $uid = argv(3);
- $channel = q("SELECT * FROM channel WHERE channel_id = %d",
- intval($uid)
- );
-
- if (! $channel) {
- notice( t('Channel not found') . EOL);
- goaway(z_root() . '/admin/channels' );
- }
-
- switch(argv(2)) {
- case "delete":{
- check_form_security_token_redirectOnErr('/admin/channels', 'admin_channels', 't');
- // delete channel
- require_once("include/Contact.php");
- channel_remove($uid,true);
-
- notice( sprintf(t("Channel '%s' deleted"), $channel[0]['channel_name']) . EOL);
- }; break;
-
- case "block":{
- check_form_security_token_redirectOnErr('/admin/channels', 'admin_channels', 't');
- $pflags = $channel[0]['channel_pageflags'] ^ PAGE_CENSORED;
- q("UPDATE channel SET channel_pageflags = %d where channel_id = %d",
- intval($pflags),
- intval( $uid )
- );
- proc_run('php','include/directory.php',$uid,'nopush');
-
- notice( sprintf( (($pflags & PAGE_CENSORED) ? t("Channel '%s' censored"): t("Channel '%s' uncensored")) , $channel[0]['channel_name'] . ' (' . $channel[0]['channel_address'] . ')' ) . EOL);
- }; break;
-
- case "code":{
- check_form_security_token_redirectOnErr('/admin/channels', 'admin_channels', 't');
- $pflags = $channel[0]['channel_pageflags'] ^ PAGE_ALLOWCODE;
- q("UPDATE channel SET channel_pageflags = %d where channel_id = %d",
- intval($pflags),
- intval( $uid )
- );
-
- notice( sprintf( (($pflags & PAGE_ALLOWCODE) ? t("Channel '%s' code allowed"): t("Channel '%s' code disallowed")) , $channel[0]['channel_name'] . ' (' . $channel[0]['channel_address'] . ')' ) . EOL);
- }; break;
-
- default:
- break;
- }
- goaway(z_root() . '/admin/channels' );
- }
-
- /* get channels */
-
- $total = q("SELECT count(*) as total FROM channel where channel_removed = 0 and channel_system = 0");
- if($total) {
- App::set_pager_total($total[0]['total']);
- App::set_pager_itemspage(100);
- }
-
- $order = " order by channel_name asc ";
-
- $channels = q("SELECT * from channel where channel_removed = 0 and channel_system = 0 $order limit %d offset %d ",
- intval(App::$pager['itemspage']),
- intval(App::$pager['start'])
- );
-
- if($channels) {
- for($x = 0; $x < count($channels); $x ++) {
- if($channels[$x]['channel_pageflags'] & PAGE_CENSORED)
- $channels[$x]['blocked'] = true;
- else
- $channels[$x]['blocked'] = false;
-
- if($channels[$x]['channel_pageflags'] & PAGE_ALLOWCODE)
- $channels[$x]['allowcode'] = true;
- else
- $channels[$x]['allowcode'] = false;
- }
- }
-
- $t = get_markup_template("admin_channels.tpl");
- $o = replace_macros($t, array(
- // strings //
- '$title' => t('Administration'),
- '$page' => t('Channels'),
- '$submit' => t('Submit'),
- '$select_all' => t('select all'),
- '$delete' => t('Delete'),
- '$block' => t('Censor'),
- '$unblock' => t('Uncensor'),
- '$code' => t('Allow Code'),
- '$uncode' => t('Disallow Code'),
- '$h_channels' => t('Channel'),
- '$th_channels' => array( t('UID'), t('Name'), t('Address')),
-
- '$confirm_delete_multi' => t('Selected channels will be deleted!\n\nEverything that was posted in these channels on this site will be permanently deleted!\n\nAre you sure?'),
- '$confirm_delete' => t('The channel {0} will be deleted!\n\nEverything that was posted in this channel on this site will be permanently deleted!\n\nAre you sure?'),
-
- '$form_security_token' => get_form_security_token("admin_channels"),
-
- // values //
- '$baseurl' => z_root(),
- '$channels' => $channels,
- ));
- $o .= paginate($a);
-
- return $o;
-}
-
-
-/**
- * Plugins admin page
- *
- * @param App $a
- * @return string
- */
-function admin_page_plugins(&$a){
-
- /*
- * Single plugin
- */
- if (App::$argc == 3){
- $plugin = App::$argv[2];
- if (!is_file("addon/$plugin/$plugin.php")){
- notice( t("Item not found.") );
- return '';
- }
-
- $enabled = in_array($plugin,App::$plugins);
- $info = get_plugin_info($plugin);
- $x = check_plugin_versions($info);
-
- // disable plugins which are installed but incompatible versions
-
- if($enabled && ! $x) {
- $enabled = false;
- $idz = array_search($plugin, App::$plugins);
- if ($idz !== false) {
- unset(App::$plugins[$idz]);
- uninstall_plugin($plugin);
- set_config("system","addon", implode(", ",App::$plugins));
- }
- }
- $info['disabled'] = 1-intval($x);
-
- if (x($_GET,"a") && $_GET['a']=="t"){
- check_form_security_token_redirectOnErr('/admin/plugins', 'admin_plugins', 't');
-
- // Toggle plugin status
- $idx = array_search($plugin, App::$plugins);
- if ($idx !== false){
- unset(App::$plugins[$idx]);
- uninstall_plugin($plugin);
- info( sprintf( t("Plugin %s disabled."), $plugin ) );
- } else {
- App::$plugins[] = $plugin;
- install_plugin($plugin);
- info( sprintf( t("Plugin %s enabled."), $plugin ) );
- }
- set_config("system","addon", implode(", ",App::$plugins));
- goaway(z_root() . '/admin/plugins' );
- }
- // display plugin details
- require_once('library/markdown.php');
-
- if (in_array($plugin, App::$plugins)){
- $status = 'on';
- $action = t('Disable');
- } else {
- $status = 'off';
- $action = t('Enable');
- }
-
- $readme = null;
- if (is_file("addon/$plugin/README.md")){
- $readme = file_get_contents("addon/$plugin/README.md");
- $readme = Markdown($readme);
- } else if (is_file("addon/$plugin/README")){
- $readme = "<pre>". file_get_contents("addon/$plugin/README") ."</pre>";
- }
-
- $admin_form = '';
-
- $r = q("select * from addon where plugin_admin = 1 and name = '%s' limit 1",
- dbesc($plugin)
- );
-
- if($r) {
- @require_once("addon/$plugin/$plugin.php");
- if(function_exists($plugin.'_plugin_admin')) {
- $func = $plugin.'_plugin_admin';
- $func($a, $admin_form);
- }
- }
-
-
- $t = get_markup_template('admin_plugins_details.tpl');
- return replace_macros($t, array(
- '$title' => t('Administration'),
- '$page' => t('Plugins'),
- '$toggle' => t('Toggle'),
- '$settings' => t('Settings'),
- '$baseurl' => z_root(),
-
- '$plugin' => $plugin,
- '$status' => $status,
- '$action' => $action,
- '$info' => $info,
- '$str_author' => t('Author: '),
- '$str_maintainer' => t('Maintainer: '),
- '$str_minversion' => t('Minimum project version: '),
- '$str_maxversion' => t('Maximum project version: '),
- '$str_minphpversion' => t('Minimum PHP version: '),
- '$str_requires' => t('Requires: '),
- '$disabled' => t('Disabled - version incompatibility'),
-
- '$admin_form' => $admin_form,
- '$function' => 'plugins',
- '$screenshot' => '',
- '$readme' => $readme,
-
- '$form_security_token' => get_form_security_token('admin_plugins'),
- ));
- }
-
-
- /*
- * List plugins
- */
- $plugins = array();
- $files = glob('addon/*/');
- if($files) {
- foreach($files as $file) {
- if (is_dir($file)){
- list($tmp, $id) = array_map('trim', explode('/', $file));
- $info = get_plugin_info($id);
- $enabled = in_array($id,App::$plugins);
- $x = check_plugin_versions($info);
-
- // disable plugins which are installed but incompatible versions
-
- if($enabled && ! $x) {
- $enabled = false;
- $idz = array_search($id, App::$plugins);
- if ($idz !== false) {
- unset(App::$plugins[$idz]);
- uninstall_plugin($id);
- set_config("system","addon", implode(", ",App::$plugins));
- }
- }
- $info['disabled'] = 1-intval($x);
-
- $plugins[] = array( $id, (($enabled)?"on":"off") , $info);
- }
- }
- }
-
- $t = get_markup_template('admin_plugins.tpl');
- return replace_macros($t, array(
- '$title' => t('Administration'),
- '$page' => t('Plugins'),
- '$submit' => t('Submit'),
- '$baseurl' => z_root(),
- '$function' => 'plugins',
- '$plugins' => $plugins,
- '$disabled' => t('Disabled - version incompatibility'),
- '$form_security_token' => get_form_security_token('admin_plugins'),
- ));
-}
-
-/**
- * @param array $themes
- * @param string $th
- * @param int $result
- */
-function toggle_theme(&$themes, $th, &$result) {
- for($x = 0; $x < count($themes); $x ++) {
- if($themes[$x]['name'] === $th) {
- if($themes[$x]['allowed']) {
- $themes[$x]['allowed'] = 0;
- $result = 0;
- }
- else {
- $themes[$x]['allowed'] = 1;
- $result = 1;
- }
- }
- }
-}
-
-/**
- * @param array $themes
- * @param string $th
- * @return int
- */
-function theme_status($themes, $th) {
- for($x = 0; $x < count($themes); $x ++) {
- if($themes[$x]['name'] === $th) {
- if($themes[$x]['allowed']) {
- return 1;
- }
- else {
- return 0;
- }
- }
- }
- return 0;
-}
-
-
-/**
- * @param array $themes
- * @return string
- */
-function rebuild_theme_table($themes) {
- $o = '';
- if(count($themes)) {
- foreach($themes as $th) {
- if($th['allowed']) {
- if(strlen($o))
- $o .= ',';
- $o .= $th['name'];
- }
- }
- }
- return $o;
-}
-
-
-/**
- * @brief Themes admin page.
- *
- * @param App &$a
- * @return string
- */
-function admin_page_themes(&$a){
-
- $allowed_themes_str = get_config('system', 'allowed_themes');
- $allowed_themes_raw = explode(',', $allowed_themes_str);
- $allowed_themes = array();
- if(count($allowed_themes_raw))
- foreach($allowed_themes_raw as $x)
- if(strlen(trim($x)))
- $allowed_themes[] = trim($x);
-
- $themes = array();
- $files = glob('view/theme/*');
- if($files) {
- foreach($files as $file) {
- $f = basename($file);
- $is_experimental = intval(file_exists($file . '/.experimental'));
- $is_supported = 1-(intval(file_exists($file . '/.unsupported'))); // Is not used yet
- $is_allowed = intval(in_array($f,$allowed_themes));
- $themes[] = array('name' => $f, 'experimental' => $is_experimental, 'supported' => $is_supported, 'allowed' => $is_allowed);
- }
- }
-
- if(! count($themes)) {
- notice( t('No themes found.'));
- return '';
- }
-
- /*
- * Single theme
- */
-
- if (App::$argc == 3){
- $theme = App::$argv[2];
- if(! is_dir("view/theme/$theme")){
- notice( t("Item not found.") );
- return '';
- }
-
- if (x($_GET,"a") && $_GET['a']=="t"){
- check_form_security_token_redirectOnErr('/admin/themes', 'admin_themes', 't');
-
- // Toggle theme status
-
- toggle_theme($themes, $theme, $result);
- $s = rebuild_theme_table($themes);
- if($result)
- info( sprintf('Theme %s enabled.', $theme));
- else
- info( sprintf('Theme %s disabled.', $theme));
-
- set_config('system', 'allowed_themes', $s);
- goaway(z_root() . '/admin/themes' );
- }
-
- // display theme details
- require_once('library/markdown.php');
-
- if (theme_status($themes,$theme)) {
- $status="on"; $action= t("Disable");
- } else {
- $status="off"; $action= t("Enable");
- }
-
- $readme=Null;
- if (is_file("view/theme/$theme/README.md")){
- $readme = file_get_contents("view/theme/$theme/README.md");
- $readme = Markdown($readme);
- } else if (is_file("view/theme/$theme/README")){
- $readme = "<pre>". file_get_contents("view/theme/$theme/README") ."</pre>";
- }
-
- $admin_form = '';
- if (is_file("view/theme/$theme/php/config.php")){
- require_once("view/theme/$theme/php/config.php");
- if(function_exists("theme_admin")){
- $admin_form = theme_admin($a);
- }
- }
-
- $screenshot = array( get_theme_screenshot($theme), t('Screenshot'));
- if(! stristr($screenshot[0],$theme))
- $screenshot = null;
-
- $t = get_markup_template('admin_plugins_details.tpl');
- return replace_macros($t, array(
- '$title' => t('Administration'),
- '$page' => t('Themes'),
- '$toggle' => t('Toggle'),
- '$settings' => t('Settings'),
- '$baseurl' => z_root(),
-
- '$plugin' => $theme,
- '$status' => $status,
- '$action' => $action,
- '$info' => get_theme_info($theme),
- '$function' => 'themes',
- '$admin_form' => $admin_form,
- '$str_author' => t('Author: '),
- '$str_maintainer' => t('Maintainer: '),
- '$screenshot' => $screenshot,
- '$readme' => $readme,
-
- '$form_security_token' => get_form_security_token('admin_themes'),
- ));
- }
-
- /*
- * List themes
- */
-
- $xthemes = array();
- if($themes) {
- foreach($themes as $th) {
- $xthemes[] = array($th['name'],(($th['allowed']) ? "on" : "off"), get_theme_info($th['name']));
- }
- }
-
- $t = get_markup_template('admin_plugins.tpl');
- return replace_macros($t, array(
- '$title' => t('Administration'),
- '$page' => t('Themes'),
- '$submit' => t('Submit'),
- '$baseurl' => z_root(),
- '$function' => 'themes',
- '$plugins' => $xthemes,
- '$experimental' => t('[Experimental]'),
- '$unsupported' => t('[Unsupported]'),
- '$form_security_token' => get_form_security_token('admin_themes'),
- ));
-}
-
-
-/**
- * @brief POST handler for logs admin page.
- *
- * @param App &$a
- */
-function admin_page_logs_post(&$a) {
- if (x($_POST, 'page_logs')) {
- check_form_security_token_redirectOnErr('/admin/logs', 'admin_logs');
-
- $logfile = ((x($_POST,'logfile')) ? notags(trim($_POST['logfile'])) : '');
- $debugging = ((x($_POST,'debugging')) ? true : false);
- $loglevel = ((x($_POST,'loglevel')) ? intval(trim($_POST['loglevel'])) : 0);
-
- set_config('system','logfile', $logfile);
- set_config('system','debugging', $debugging);
- set_config('system','loglevel', $loglevel);
- }
-
- info( t('Log settings updated.') );
- goaway(z_root() . '/admin/logs' );
-}
-
-/**
- * @brief Logs admin page.
- *
- * @param App $a
- * @return string
- */
-function admin_page_logs(&$a){
-
- $log_choices = Array(
- LOGGER_NORMAL => 'Normal',
- LOGGER_TRACE => 'Trace',
- LOGGER_DEBUG => 'Debug',
- LOGGER_DATA => 'Data',
- LOGGER_ALL => 'All'
- );
-
- $t = get_markup_template('admin_logs.tpl');
-
- $f = get_config('system', 'logfile');
-
- $data = '';
-
- if(!file_exists($f)) {
- $data = t("Error trying to open <strong>$f</strong> log file.\r\n<br/>Check to see if file $f exist and is
-readable.");
- }
- else {
- $fp = fopen($f, 'r');
- if(!$fp) {
- $data = t("Couldn't open <strong>$f</strong> log file.\r\n<br/>Check to see if file $f is readable.");
- }
- else {
- $fstat = fstat($fp);
- $size = $fstat['size'];
- if($size != 0)
- {
- if($size > 5000000 || $size < 0)
- $size = 5000000;
- $seek = fseek($fp,0-$size,SEEK_END);
- if($seek === 0) {
- $data = escape_tags(fread($fp,$size));
- while(! feof($fp))
- $data .= escape_tags(fread($fp,4096));
- }
- }
- fclose($fp);
- }
- }
-
- return replace_macros($t, array(
- '$title' => t('Administration'),
- '$page' => t('Logs'),
- '$submit' => t('Submit'),
- '$clear' => t('Clear'),
- '$data' => $data,
- '$baseurl' => z_root(),
- '$logname' => get_config('system','logfile'),
-
- // name, label, value, help string, extra data...
- '$debugging' => array('debugging', t("Debugging"),get_config('system','debugging'), ""),
- '$logfile' => array('logfile', t("Log file"), get_config('system','logfile'), t("Must be writable by web server. Relative to your Red top-level directory.")),
- '$loglevel' => array('loglevel', t("Log level"), get_config('system','loglevel'), "", $log_choices),
-
- '$form_security_token' => get_form_security_token('admin_logs'),
- ));
-}
-
-function admin_page_profs_post(&$a) {
-
- if(array_key_exists('basic',$_REQUEST)) {
- $arr = explode(',',$_REQUEST['basic']);
- for($x = 0; $x < count($arr); $x ++)
- if(trim($arr[$x]))
- $arr[$x] = trim($arr[$x]);
- set_config('system','profile_fields_basic',$arr);
-
- if(array_key_exists('advanced',$_REQUEST)) {
- $arr = explode(',',$_REQUEST['advanced']);
- for($x = 0; $x < count($arr); $x ++)
- if(trim($arr[$x]))
- $arr[$x] = trim($arr[$x]);
- set_config('system','profile_fields_advanced',$arr);
- }
- goaway(z_root() . '/admin/profs');
- }
-
-
- if(array_key_exists('field_name',$_REQUEST)) {
- if($_REQUEST['id']) {
- $r = q("update profdef set field_name = '%s', field_type = '%s', field_desc = '%s' field_help = '%s', field_inputs = '%s' where id = %d",
- dbesc($_REQUEST['field_name']),
- dbesc($_REQUEST['field_type']),
- dbesc($_REQUEST['field_desc']),
- dbesc($_REQUEST['field_help']),
- dbesc($_REQUEST['field_inputs']),
- intval($_REQUEST['id'])
- );
- }
- else {
- $r = q("insert into profdef ( field_name, field_type, field_desc, field_help, field_inputs ) values ( '%s' , '%s', '%s', '%s', '%s' )",
- dbesc($_REQUEST['field_name']),
- dbesc($_REQUEST['field_type']),
- dbesc($_REQUEST['field_desc']),
- dbesc($_REQUEST['field_help']),
- dbesc($_REQUEST['field_inputs'])
- );
- }
- }
-
-
- // add to chosen array basic or advanced
-
- goaway(z_root() . '/admin/profs');
-}
-
-function admin_page_profs(&$a) {
-
- if((argc() > 3) && argv(2) == 'drop' && intval(argv(3))) {
- $r = q("delete from profdef where id = %d",
- intval(argv(3))
- );
- // remove from allowed fields
-
- goaway(z_root() . '/admin/profs');
- }
-
- if((argc() > 2) && argv(2) === 'new') {
- return replace_macros(get_markup_template('profdef_edit.tpl'),array(
- '$header' => t('New Profile Field'),
- '$field_name' => array('field_name',t('Field nickname'),$_REQUEST['field_name'],t('System name of field')),
- '$field_type' => array('field_type',t('Input type'),(($_REQUEST['field_type']) ? $_REQUEST['field_type'] : 'text'),''),
- '$field_desc' => array('field_desc',t('Field Name'),$_REQUEST['field_desc'],t('Label on profile pages')),
- '$field_help' => array('field_help',t('Help text'),$_REQUEST['field_help'],t('Additional info (optional)')),
- '$submit' => t('Save')
- ));
- }
-
- if((argc() > 2) && intval(argv(2))) {
- $r = q("select * from profdef where id = %d limit 1",
- intval(argv(2))
- );
- if(! $r) {
- notice( t('Field definition not found') . EOL);
- goaway(z_root() . '/admin/profs');
- }
-
- return replace_macros(get_markup_template('profdef_edit.tpl'),array(
- '$id' => intval($r[0]['id']),
- '$header' => t('Edit Profile Field'),
- '$field_name' => array('field_name',t('Field nickname'),$r[0]['field_name'],t('System name of field')),
- '$field_type' => array('field_type',t('Input type'),$r[0]['field_type'],''),
- '$field_desc' => array('field_desc',t('Field Name'),$r[0]['field_desc'],t('Label on profile pages')),
- '$field_help' => array('field_help',t('Help text'),$r[0]['field_help'],t('Additional info (optional)')),
- '$submit' => t('Save')
- ));
- }
-
- $basic = '';
- $barr = array();
- $fields = get_profile_fields_basic();
- if(! $fields)
- $fields = get_profile_fields_basic(1);
- if($fields) {
- foreach($fields as $k => $v) {
- if($basic)
- $basic .= ', ';
- $basic .= trim($k);
- $barr[] = trim($k);
- }
- }
-
- $advanced = '';
- $fields = get_profile_fields_advanced();
- if(! $fields)
- $fields = get_profile_fields_advanced(1);
- if($fields) {
- foreach($fields as $k => $v) {
- if(in_array(trim($k),$barr))
- continue;
- if($advanced)
- $advanced .= ', ';
- $advanced .= trim($k);
- }
- }
-
- $all = '';
- $fields = get_profile_fields_advanced(1);
- if($fields) {
- foreach($fields as $k => $v) {
- if($all)
- $all .= ', ';
- $all .= trim($k);
- }
- }
-
- $r = q("select * from profdef where true");
- if($r) {
- foreach($r as $rr) {
- if($all)
- $all .= ', ';
- $all .= $rr['field_name'];
- }
- }
-
-
- $o = replace_macros(get_markup_template('admin_profiles.tpl'),array(
- '$title' => t('Profile Fields'),
- '$basic' => array('basic',t('Basic Profile Fields'),$basic,''),
- '$advanced' => array('advanced',t('Advanced Profile Fields'),$advanced,t('(In addition to basic fields)')),
- '$all' => $all,
- '$all_desc' => t('All available fields'),
- '$cust_field_desc' => t('Custom Fields'),
- '$cust_fields' => $r,
- '$edit' => t('Edit'),
- '$drop' => t('Delete'),
- '$new' => t('Create Custom Field'),
- '$submit' => t('Submit')
- ));
-
- return $o;
-
-
-}
diff --git a/mod/api.php b/mod/api.php
deleted file mode 100644
index aa95b81dd..000000000
--- a/mod/api.php
+++ /dev/null
@@ -1,115 +0,0 @@
-<?php
-
-require_once('include/api.php');
-
-function oauth_get_client($request){
-
-
- $params = $request->get_parameters();
- $token = $params['oauth_token'];
-
- $r = q("SELECT `clients`.*
- FROM `clients`, `tokens`
- WHERE `clients`.`client_id`=`tokens`.`client_id`
- AND `tokens`.`id`='%s' AND `tokens`.`scope`='request'",
- dbesc($token));
-
- if (!count($r))
- return null;
-
- return $r[0];
-}
-
-function api_post(&$a) {
-
- if(! local_channel()) {
- notice( t('Permission denied.') . EOL);
- return;
- }
-
- if(count(App::$user) && x(App::$user,'uid') && App::$user['uid'] != local_channel()) {
- notice( t('Permission denied.') . EOL);
- return;
- }
-
-}
-
-function api_content(&$a) {
- if(App::$cmd=='api/oauth/authorize'){
-
- /*
- * api/oauth/authorize interact with the user. return a standard page
- */
-
- App::$page['template'] = "minimal";
-
- // get consumer/client from request token
- try {
- $request = OAuth1Request::from_request();
- } catch(Exception $e) {
- echo "<pre>"; var_dump($e); killme();
- }
-
-
- if(x($_POST,'oauth_yes')){
-
- $app = oauth_get_client($request);
- if (is_null($app)) return "Invalid request. Unknown token.";
- $consumer = new OAuth1Consumer($app['client_id'], $app['pw'], $app['redirect_uri']);
-
- $verifier = md5($app['secret'].local_channel());
- set_config("oauth", $verifier, local_channel());
-
-
- if($consumer->callback_url!=null) {
- $params = $request->get_parameters();
- $glue="?";
- if (strstr($consumer->callback_url,$glue)) $glue="?";
- goaway($consumer->callback_url . $glue . "oauth_token=" . OAuth1Util::urlencode_rfc3986($params['oauth_token']) . "&oauth_verifier=" . OAuth1Util::urlencode_rfc3986($verifier));
- killme();
- }
-
- $tpl = get_markup_template("oauth_authorize_done.tpl");
- $o = replace_macros($tpl, array(
- '$title' => t('Authorize application connection'),
- '$info' => t('Return to your app and insert this Securty Code:'),
- '$code' => $verifier,
- ));
-
- return $o;
- }
-
-
- if(! local_channel()) {
- //TODO: we need login form to redirect to this page
- notice( t('Please login to continue.') . EOL );
- return login(false,'api-login',$request->get_parameters());
- }
- //FKOAuth1::loginUser(4);
-
- $app = oauth_get_client($request);
- if (is_null($app)) return "Invalid request. Unknown token.";
-
-
-
-
- $tpl = get_markup_template('oauth_authorize.tpl');
- $o = replace_macros($tpl, array(
- '$title' => t('Authorize application connection'),
- '$app' => $app,
- '$authorize' => t('Do you want to authorize this application to access your posts and contacts, and/or create new posts for you?'),
- '$yes' => t('Yes'),
- '$no' => t('No'),
- ));
-
- //echo "<pre>"; var_dump($app); killme();
-
- return $o;
- }
-
- echo api_call($a);
- killme();
-}
-
-
-
diff --git a/mod/appman.php b/mod/appman.php
deleted file mode 100644
index d8d030465..000000000
--- a/mod/appman.php
+++ /dev/null
@@ -1,102 +0,0 @@
-<?php /** @file */
-
-require_once('include/apps.php');
-
-function appman_post(&$a) {
-
- if(! local_channel())
- return;
-
- if($_POST['url']) {
- $arr = array(
- 'uid' => intval($_REQUEST['uid']),
- 'url' => escape_tags($_REQUEST['url']),
- 'guid' => escape_tags($_REQUEST['guid']),
- 'author' => escape_tags($_REQUEST['author']),
- 'addr' => escape_tags($_REQUEST['addr']),
- 'name' => escape_tags($_REQUEST['name']),
- 'desc' => escape_tags($_REQUEST['desc']),
- 'photo' => escape_tags($_REQUEST['photo']),
- 'version' => escape_tags($_REQUEST['version']),
- 'price' => escape_tags($_REQUEST['price']),
- 'sig' => escape_tags($_REQUEST['sig'])
- );
-
- $_REQUEST['appid'] = app_install(local_channel(),$arr);
-
- if(app_installed(local_channel(),$arr))
- info( t('App installed.') . EOL);
-
- return;
- }
-
-
- $papp = app_decode($_POST['papp']);
-
- if(! is_array($papp)) {
- notice( t('Malformed app.') . EOL);
- return;
- }
-
- if($_POST['install']) {
- app_install(local_channel(),$papp);
- if(app_installed(local_channel(),$papp))
- info( t('App installed.') . EOL);
- }
-
- if($_POST['delete']) {
- app_destroy(local_channel(),$papp);
- }
-
- if($_POST['edit']) {
- return;
- }
-
- if($_SESSION['return_url'])
- goaway(z_root() . '/' . $_SESSION['return_url']);
- goaway(z_root() . '/apps');
-
-
-}
-
-
-function appman_content(&$a) {
-
- if(! local_channel()) {
- notice( t('Permission denied.') . EOL);
- return;
- }
-
- $channel = App::get_channel();
- $app = null;
- $embed = null;
- if($_REQUEST['appid']) {
- $r = q("select * from app where app_id = '%s' and app_channel = %d limit 1",
- dbesc($_REQUEST['appid']),
- dbesc(local_channel())
- );
- if($r)
- $app = $r[0];
- $embed = array('embed', t('Embed code'), app_encode($app,true),'', 'onclick="this.select();"');
-
- }
-
- return replace_macros(get_markup_template('app_create.tpl'), array(
-
- '$banner' => (($app) ? t('Edit App') : t('Create App')),
- '$app' => $app,
- '$guid' => (($app) ? $app['app_id'] : ''),
- '$author' => (($app) ? $app['app_author'] : $channel['channel_hash']),
- '$addr' => (($app) ? $app['app_addr'] : $channel['xchan_addr']),
- '$name' => array('name', t('Name of app'),(($app) ? $app['app_name'] : ''), t('Required')),
- '$url' => array('url', t('Location (URL) of app'),(($app) ? $app['app_url'] : ''), t('Required')),
- '$desc' => array('desc', t('Description'),(($app) ? $app['app_desc'] : ''), ''),
- '$photo' => array('photo', t('Photo icon URL'),(($app) ? $app['app_photo'] : ''), t('80 x 80 pixels - optional')),
- '$version' => array('version', t('Version ID'),(($app) ? $app['app_version'] : ''), ''),
- '$price' => array('price', t('Price of app'),(($app) ? $app['app_price'] : ''), ''),
- '$page' => array('page', t('Location (URL) to purchase app'),(($app) ? $app['app_page'] : ''), ''),
- '$embed' => $embed,
- '$submit' => t('Submit')
- ));
-
-}
diff --git a/mod/apps.php b/mod/apps.php
deleted file mode 100644
index 3539b2bc0..000000000
--- a/mod/apps.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-
-require_once('include/apps.php');
-
-function apps_content(&$a) {
-
- if(argc() == 2 && argv(1) == 'edit')
- $mode = 'edit';
- else
- $mode = 'list';
-
- $_SESSION['return_url'] = App::$cmd;
-
- $apps = array();
-
- $syslist = get_system_apps();
-
- if(local_channel()) {
- $list = app_list(local_channel());
- if($list) {
- foreach($list as $x) {
- $syslist[] = app_encode($x);
- }
- }
- }
- usort($syslist,'app_name_compare');
-
-// logger('apps: ' . print_r($syslist,true));
-
- foreach($syslist as $app) {
- $apps[] = app_render($app,$mode);
- }
-
- return replace_macros(get_markup_template('myapps.tpl'), array(
- '$sitename' => get_config('system','sitename'),
- '$title' => t('Apps'),
- '$apps' => $apps,
- ));
-
-}
diff --git a/mod/attach.php b/mod/attach.php
deleted file mode 100644
index 306e39519..000000000
--- a/mod/attach.php
+++ /dev/null
@@ -1,55 +0,0 @@
-<?php
-
-require_once('include/security.php');
-require_once('include/attach.php');
-
-function attach_init(&$a) {
-
- if(argc() < 2) {
- notice( t('Item not available.') . EOL);
- return;
- }
-
- $r = attach_by_hash(argv(1),((argc() > 2) ? intval(argv(2)) : 0));
-
- if(! $r['success']) {
- notice( $r['message'] . EOL);
- return;
- }
-
- $c = q("select channel_address from channel where channel_id = %d limit 1",
- intval($r['data']['uid'])
- );
-
- if(! $c)
- return;
-
-
- $unsafe_types = array('text/html','text/css','application/javascript');
-
- if(in_array($r['data']['filetype'],$unsafe_types)) {
- header('Content-type: text/plain');
- }
- else {
- header('Content-type: ' . $r['data']['filetype']);
- }
-
- header('Content-disposition: attachment; filename="' . $r['data']['filename'] . '"');
- if(intval($r['data']['os_storage'])) {
- $fname = dbunescbin($r['data']['data']);
- if(strpos($fname,'store') !== false)
- $istream = fopen($fname,'rb');
- else
- $istream = fopen('store/' . $c[0]['channel_address'] . '/' . $fname,'rb');
- $ostream = fopen('php://output','wb');
- if($istream && $ostream) {
- pipe_streams($istream,$ostream);
- fclose($istream);
- fclose($ostream);
- }
- }
- else
- echo dbunescbin($r['data']['data']);
- killme();
-
-}
diff --git a/mod/authtest.php b/mod/authtest.php
deleted file mode 100644
index 6ef6c22ad..000000000
--- a/mod/authtest.php
+++ /dev/null
@@ -1,54 +0,0 @@
-<?php
-
-require_once('include/zot.php');
-require_once('mod/magic.php');
-
-function authtest_content(&$a) {
-
-
- $auth_success = false;
- $o .= '<h3>Magic-Auth Diagnostic</h3>';
-
- if(! local_channel()) {
- notice( t('Permission denied.') . EOL);
- return $o;
- }
-
- $o .= '<form action="authtest" method="get">';
- $o .= 'Target URL: <input type="text" style="width: 250px;" name="dest" value="' . $_GET['dest'] .'" />';
- $o .= '<input type="submit" name="submit" value="Submit" /></form>';
-
- $o .= '<br /><br />';
-
- if(x($_GET,'dest')) {
- if(strpos($_GET['dest'],'@')) {
- $_GET['dest'] = $_REQUEST['dest'] = 'https://' . substr($_GET['dest'],strpos($_GET['dest'],'@')+1) . '/channel/' . substr($_GET['dest'],0,strpos($_GET['dest'],'@'));
- }
-
- $_REQUEST['test'] = 1;
- $x = magic_init($a);
- $o .= 'Local Setup returns: ' . print_r($x,true);
-
-
-
- if($x['url']) {
- $z = z_fetch_url($x['url'] . '&test=1');
- if($z['success']) {
- $j = json_decode($z['body'],true);
- if(! $j)
- $o .= 'json_decode failure from remote site. ' . print_r($z['body'],true);
- $o .= 'Remote site responded: ' . print_r($j,true);
- if($j['success'] && strpos($j['message'],'Authentication Success'))
- $auth_success = true;
- }
- else {
- $o .= 'fetch url failure.' . print_r($z,true);
- }
- }
-
- if(! $auth_success)
- $o .= 'Authentication Failed!' . EOL;
- }
-
- return str_replace("\n",'<br />',$o);
-}
diff --git a/mod/block.php b/mod/block.php
deleted file mode 100644
index 301993d03..000000000
--- a/mod/block.php
+++ /dev/null
@@ -1,86 +0,0 @@
-<?php
-
-require_once('include/items.php');
-require_once('include/conversation.php');
-require_once('include/page_widgets.php');
-
-function block_init(&$a) {
-
- $which = argv(1);
- $profile = 0;
- profile_load($a,$which,$profile);
-
- if(App::$profile['profile_uid'])
- head_set_icon(App::$profile['thumb']);
-
-}
-
-
-function block_content(&$a) {
-
- if(! perm_is_allowed(App::$profile['profile_uid'],get_observer_hash(),'view_pages')) {
- notice( t('Permission denied.') . EOL);
- return;
- }
-
- if(argc() < 3) {
- notice( t('Invalid item.') . EOL);
- return;
- }
-
- $channel_address = argv(1);
- $page_id = argv(2);
-
- $u = q("select channel_id from channel where channel_address = '%s' limit 1",
- dbesc($channel_address)
- );
-
- if(! $u) {
- notice( t('Channel not found.') . EOL);
- return;
- }
-
- if($_REQUEST['rev'])
- $revision = " and revision = " . intval($_REQUEST['rev']) . " ";
- else
- $revision = " order by revision desc ";
-
- require_once('include/security.php');
- $sql_options = item_permissions_sql($u[0]['channel_id']);
-
- $r = q("select item.* from item left join item_id on item.id = item_id.iid
- where item.uid = %d and sid = '%s' and service = 'BUILDBLOCK' and
- item_type = %d $sql_options $revision limit 1",
- intval($u[0]['channel_id']),
- dbesc($page_id),
- intval(ITEM_TYPE_BLOCK)
- );
-
- if(! $r) {
-
- // Check again with no permissions clause to see if it is a permissions issue
-
- $x = q("select item.* from item left join item_id on item.id = item_id.iid
- where item.uid = %d and sid = '%s' and service = 'BUILDBLOCK' and
- item_type = %d $revision limit 1",
- intval($u[0]['channel_id']),
- dbesc($page_id),
- intval(ITEM_TYPE_BLOCK)
- );
- if($x) {
- // Yes, it's there. You just aren't allowed to see it.
- notice( t('Permission denied.') . EOL);
- }
- else {
- notice( t('Page not found.') . EOL);
- }
- return;
- }
-
- xchan_query($r);
- $r = fetch_post_tags($r,true);
-
- $o .= prepare_page($r[0]);
- return $o;
-
-}
diff --git a/mod/blocks.php b/mod/blocks.php
deleted file mode 100644
index 3c9274991..000000000
--- a/mod/blocks.php
+++ /dev/null
@@ -1,166 +0,0 @@
-<?php
-
-require_once('include/identity.php');
-require_once('include/conversation.php');
-require_once('include/acl_selectors.php');
-
-function blocks_init(&$a) {
-
- if(argc() > 1 && argv(1) === 'sys' && is_site_admin()) {
- $sys = get_sys_channel();
- if($sys && intval($sys['channel_id'])) {
- App::$is_sys = true;
- }
- }
-
- if(argc() > 1)
- $which = argv(1);
- else
- return;
-
- profile_load($a,$which);
-
-}
-
-
-function blocks_content(&$a) {
-
- if(! App::$profile) {
- notice( t('Requested profile is not available.') . EOL );
- App::$error = 404;
- return;
- }
-
- $which = argv(1);
-
- $_SESSION['return_url'] = App::$query_string;
-
- $uid = local_channel();
- $owner = 0;
- $channel = null;
- $observer = App::get_observer();
-
- $channel = App::get_channel();
-
- if(App::$is_sys && is_site_admin()) {
- $sys = get_sys_channel();
- if($sys && intval($sys['channel_id'])) {
- $uid = $owner = intval($sys['channel_id']);
- $channel = $sys;
- $observer = $sys;
- }
- }
-
- if(! $owner) {
- // Figure out who the page owner is.
- $r = q("select channel_id from channel where channel_address = '%s'",
- dbesc($which)
- );
- if($r) {
- $owner = intval($r[0]['channel_id']);
- }
- }
-
- $ob_hash = (($observer) ? $observer['xchan_hash'] : '');
-
- $perms = get_all_perms($owner,$ob_hash);
-
- if(! $perms['write_pages']) {
- notice( t('Permission denied.') . EOL);
- return;
- }
-
- // Block design features from visitors
-
- if((! $uid) || ($uid != $owner)) {
- notice( t('Permission denied.') . EOL);
- return;
- }
-
- $mimetype = (($_REQUEST['mimetype']) ? $_REQUEST['mimetype'] : get_pconfig($owner,'system','page_mimetype'));
-
- if(! $mimetype) {
- $mimetype = 'choose';
- }
-
- $x = array(
- 'webpage' => ITEM_TYPE_BLOCK,
- 'is_owner' => true,
- 'nickname' => App::$profile['channel_address'],
- 'lockstate' => (($channel['channel_allow_cid'] || $channel['channel_allow_gid'] || $channel['channel_deny_cid'] || $channel['channel_deny_gid']) ? 'lock' : 'unlock'),
- 'bang' => '',
- 'showacl' => false,
- 'visitor' => true,
- 'mimetype' => $mimetype,
- 'ptlabel' => t('Block Name'),
- 'profile_uid' => intval($owner),
- 'expanded' => true,
- 'novoting' => true,
- 'bbco_autocomplete' => 'bbcode',
- 'bbcode' => true
- );
-
- if($_REQUEST['title'])
- $x['title'] = $_REQUEST['title'];
- if($_REQUEST['body'])
- $x['body'] = $_REQUEST['body'];
- if($_REQUEST['pagetitle'])
- $x['pagetitle'] = $_REQUEST['pagetitle'];
-
- $editor = status_editor($a,$x);
-
- $r = q("select iid, sid, mid, title, body, mimetype, created, edited from item_id left join item on item_id.iid = item.id
- where item_id.uid = %d and service = 'BUILDBLOCK' and item_type = %d order by item.created desc",
- intval($owner),
- intval(ITEM_TYPE_BLOCK)
- );
-
- $pages = null;
-
- if($r) {
- $pages = array();
- foreach($r as $rr) {
- $element_arr = array(
- 'type' => 'block',
- 'title' => $rr['title'],
- 'body' => $rr['body'],
- 'created' => $rr['created'],
- 'edited' => $rr['edited'],
- 'mimetype' => $rr['mimetype'],
- 'pagetitle' => $rr['sid'],
- 'mid' => $rr['mid']
- );
- $pages[$rr['iid']][] = array(
- 'url' => $rr['iid'],
- 'name' => $rr['sid'],
- 'title' => $rr['title'],
- 'created' => $rr['created'],
- 'edited' => $rr['edited'],
- 'bb_element' => '[element]' . base64url_encode(json_encode($element_arr)) . '[/element]'
- );
- }
- }
-
- //Build the base URL for edit links
- $url = z_root() . '/editblock/' . $which;
-
- $o .= replace_macros(get_markup_template('blocklist.tpl'), array(
- '$baseurl' => $url,
- '$title' => t('Blocks'),
- '$name' => t('Block Name'),
- '$blocktitle' => t('Block Title'),
- '$created' => t('Created'),
- '$edited' => t('Edited'),
- '$create' => t('Create'),
- '$edit' => t('Edit'),
- '$share' => t('Share'),
- '$delete' => t('Delete'),
- '$editor' => $editor,
- '$pages' => $pages,
- '$channel' => $which,
- '$view' => t('View'),
- '$preview' => '1',
- ));
-
- return $o;
-}
diff --git a/mod/bookmarks.php b/mod/bookmarks.php
deleted file mode 100644
index 5c48ce5a9..000000000
--- a/mod/bookmarks.php
+++ /dev/null
@@ -1,99 +0,0 @@
-<?php
-
-function bookmarks_init(&$a) {
- if(! local_channel())
- return;
- $item_id = intval($_REQUEST['item']);
- $burl = trim($_REQUEST['burl']);
-
- if(! $item_id)
- return;
-
- $u = App::get_channel();
-
- $item_normal = item_normal();
-
- $i = q("select * from item where id = %d and uid = %d $item_normal limit 1",
- intval($item_id),
- intval(local_channel())
- );
-
- if(! $i)
- return;
-
- $i = fetch_post_tags($i);
-
- $item = $i[0];
-
- $terms = get_terms_oftype($item['term'],TERM_BOOKMARK);
-
- if($terms) {
- require_once('include/bookmarks.php');
-
- $s = q("select * from xchan where xchan_hash = '%s' limit 1",
- dbesc($item['author_xchan'])
- );
- if(! $s) {
- logger('mod_bookmarks: author lookup failed.');
- killme();
- }
- foreach($terms as $t) {
- if($burl) {
- if($burl == $t['url']) {
- bookmark_add($u,$s[0],$t,$item['item_private']);
- }
- }
- else
- bookmark_add($u,$s[0],$t,$item['item_private']);
-
- info( t('Bookmark added') . EOL);
- }
- }
- killme();
-}
-
-function bookmarks_content(&$a) {
- if(! local_channel()) {
- notice( t('Permission denied.') . EOL);
- return;
- }
-
-
- require_once('include/menu.php');
- require_once('include/conversation.php');
-
- $channel = App::get_channel();
-
- $o = profile_tabs($a,true,$channel['channel_address']);
-
- $o .= '<div class="generic-content-wrapper-styled">';
-
- $o .= '<h3>' . t('My Bookmarks') . '</h3>';
-
- $x = menu_list(local_channel(),'',MENU_BOOKMARK);
-
- if($x) {
- foreach($x as $xx) {
- $y = menu_fetch($xx['menu_name'],local_channel(),get_observer_hash());
- $o .= menu_render($y,'',true);
- }
- }
-
- $o .= '<h3>' . t('My Connections Bookmarks') . '</h3>';
-
-
- $x = menu_list(local_channel(),'',MENU_SYSTEM|MENU_BOOKMARK);
-
- if($x) {
- foreach($x as $xx) {
- $y = menu_fetch($xx['menu_name'],local_channel(),get_observer_hash());
- $o .= menu_render($y,'',true);
- }
- }
-
- $o .= '</div>';
-
- return $o;
-
-}
-
diff --git a/mod/branchtopic.php b/mod/branchtopic.php
deleted file mode 100644
index 3702e6d53..000000000
--- a/mod/branchtopic.php
+++ /dev/null
@@ -1,41 +0,0 @@
-<?php
-
-function branchtopic_init(&$a) {
-
- if(! local_channel())
- return;
-
- $item_id = 0;
-
- if(argc() > 1)
- $item_id = intval(argv(1));
-
- if(! $item_id)
- return;
-
- $channel = App::get_channel();
-
- if(! $channel)
- return;
-
-
- $r = q("select * from item where id = %d and uid = %d and owner_xchan = '%s' and id != parent limit 1",
- intval($item_id),
- intval(local_channel()),
- dbesc($channel['channel_hash'])
- );
-
- if(! $r)
- return;
-
- $p = q("select * from item where id = %d and uid = %d limit 1",
- intval($r[0]['parent']),
- intval(local_channel())
- );
-
- $x = q("update item set parent = id, route = '', item_thread_top = 1 where id = %d",
- intval($item_id)
- );
-
- return;
-}
diff --git a/mod/cal.php b/mod/cal.php
deleted file mode 100755
index 56d65d3f2..000000000
--- a/mod/cal.php
+++ /dev/null
@@ -1,351 +0,0 @@
-<?php
-
-require_once('include/conversation.php');
-require_once('include/bbcode.php');
-require_once('include/datetime.php');
-require_once('include/event.php');
-require_once('include/items.php');
-require_once('include/Contact.php');
-
-
-function cal_init(&$a) {
- if((get_config('system','block_public')) && (! local_channel()) && (! remote_channel())) {
- return;
- }
-
- $o = '';
-
- if(argc() > 1) {
- $nick = argv(1);
-
- profile_load($a,$nick);
-
- $channelx = channelx_by_nick($nick);
-
- if(! $channelx)
- return;
-
- App::$data['channel'] = $channelx;
-
- $observer = App::get_observer();
- App::$data['observer'] = $observer;
-
- $observer_xchan = (($observer) ? $observer['xchan_hash'] : '');
-
- head_set_icon(App::$data['channel']['xchan_photo_s']);
-
- App::$page['htmlhead'] .= "<script> var ispublic = '" . t('everybody') . "'; var profile_uid = " . ((App::$data['channel']) ? App::$data['channel']['channel_id'] : 0) . "; </script>" ;
-
- }
-
- return;
-}
-
-
-
-function cal_content(&$a) {
-
- if((get_config('system','block_public')) && (! local_channel()) && (! remote_channel())) {
- return;
- }
-
-
- $channel = null;
-
- if(argc() > 1) {
- $channel = channelx_by_nick(argv(1));
- }
-
-
- if(! $channel) {
- notice( t('Channel not found.') . EOL);
- return;
- }
-
- // since we don't currently have an event permission - use the stream permission
-
- if(! perm_is_allowed($channel['channel_id'], get_observer_hash(), 'view_stream')) {
- notice( t('Permissions denied.') . EOL);
- return;
- }
-
- $sql_extra = permissions_sql($channel['channel_id'],get_observer_hash(),'event');
-
- $first_day = get_pconfig(local_channel(),'system','cal_first_day');
- $first_day = (($first_day) ? $first_day : 0);
-
- $htpl = get_markup_template('event_head.tpl');
- App::$page['htmlhead'] .= replace_macros($htpl,array(
- '$baseurl' => z_root(),
- '$module_url' => '/cal/' . $channel['channel_address'],
- '$modparams' => 2,
- '$lang' => App::$language,
- '$first_day' => $first_day
- ));
-
- $o = '';
-
- $tabs = profile_tabs($a, True, $channel['channel_address']);
-
- $mode = 'view';
- $y = 0;
- $m = 0;
- $ignored = ((x($_REQUEST,'ignored')) ? " and ignored = " . intval($_REQUEST['ignored']) . " " : '');
-
- // logger('args: ' . print_r(App::$argv,true));
-
- if(argc() > 3 && intval(argv(2)) && intval(argv(3))) {
- $mode = 'view';
- $y = intval(argv(2));
- $m = intval(argv(3));
- }
- if(argc() <= 3) {
- $mode = 'view';
- $event_id = argv(2);
- }
-
- if($mode == 'view') {
-
- /* edit/create form */
- if($event_id) {
- $r = q("SELECT * FROM `event` WHERE event_hash = '%s' AND `uid` = %d LIMIT 1",
- dbesc($event_id),
- intval($channel['channel_id'])
- );
- if(count($r))
- $orig_event = $r[0];
- }
-
-
- // Passed parameters overrides anything found in the DB
- if(!x($orig_event))
- $orig_event = array();
-
-
-
- $tz = date_default_timezone_get();
- if(x($orig_event))
- $tz = (($orig_event['adjust']) ? date_default_timezone_get() : 'UTC');
-
- $syear = datetime_convert('UTC', $tz, $sdt, 'Y');
- $smonth = datetime_convert('UTC', $tz, $sdt, 'm');
- $sday = datetime_convert('UTC', $tz, $sdt, 'd');
- $shour = datetime_convert('UTC', $tz, $sdt, 'H');
- $sminute = datetime_convert('UTC', $tz, $sdt, 'i');
-
- $stext = datetime_convert('UTC',$tz,$sdt);
- $stext = substr($stext,0,14) . "00:00";
-
- $fyear = datetime_convert('UTC', $tz, $fdt, 'Y');
- $fmonth = datetime_convert('UTC', $tz, $fdt, 'm');
- $fday = datetime_convert('UTC', $tz, $fdt, 'd');
- $fhour = datetime_convert('UTC', $tz, $fdt, 'H');
- $fminute = datetime_convert('UTC', $tz, $fdt, 'i');
-
- $ftext = datetime_convert('UTC',$tz,$fdt);
- $ftext = substr($ftext,0,14) . "00:00";
-
- $type = ((x($orig_event)) ? $orig_event['type'] : 'event');
-
- $f = get_config('system','event_input_format');
- if(! $f)
- $f = 'ymd';
-
- $catsenabled = feature_enabled($channel['channel_id'],'categories');
-
-
- $show_bd = perm_is_allowed($channel['channel_id'], get_observer_hash(), 'view_contacts');
- if(! $show_bd) {
- $sql_extra .= " and event.type != 'birthday' ";
- }
-
-
- $category = '';
-
- $thisyear = datetime_convert('UTC',date_default_timezone_get(),'now','Y');
- $thismonth = datetime_convert('UTC',date_default_timezone_get(),'now','m');
- if(! $y)
- $y = intval($thisyear);
- if(! $m)
- $m = intval($thismonth);
-
- // Put some limits on dates. The PHP date functions don't seem to do so well before 1900.
- // An upper limit was chosen to keep search engines from exploring links millions of years in the future.
-
- if($y < 1901)
- $y = 1900;
- if($y > 2099)
- $y = 2100;
-
- $nextyear = $y;
- $nextmonth = $m + 1;
- if($nextmonth > 12) {
- $nextmonth = 1;
- $nextyear ++;
- }
-
- $prevyear = $y;
- if($m > 1)
- $prevmonth = $m - 1;
- else {
- $prevmonth = 12;
- $prevyear --;
- }
-
- $dim = get_dim($y,$m);
- $start = sprintf('%d-%d-%d %d:%d:%d',$y,$m,1,0,0,0);
- $finish = sprintf('%d-%d-%d %d:%d:%d',$y,$m,$dim,23,59,59);
-
-
- if (argv(2) === 'json'){
- if (x($_GET,'start')) $start = $_GET['start'];
- if (x($_GET,'end')) $finish = $_GET['end'];
- }
-
- $start = datetime_convert('UTC','UTC',$start);
- $finish = datetime_convert('UTC','UTC',$finish);
-
- $adjust_start = datetime_convert('UTC', date_default_timezone_get(), $start);
- $adjust_finish = datetime_convert('UTC', date_default_timezone_get(), $finish);
-
- if (x($_GET,'id')){
- $r = q("SELECT event.*, item.plink, item.item_flags, item.author_xchan, item.owner_xchan
- from event left join item on resource_id = event_hash where resource_type = 'event' and event.uid = %d and event.id = %d $sql_extra limit 1",
- intval($channel['channel_id']),
- intval($_GET['id'])
- );
- }
- else {
- // fixed an issue with "nofinish" events not showing up in the calendar.
- // There's still an issue if the finish date crosses the end of month.
- // Noting this for now - it will need to be fixed here and in Friendica.
- // Ultimately the finish date shouldn't be involved in the query.
-
- $r = q("SELECT event.*, item.plink, item.item_flags, item.author_xchan, item.owner_xchan
- from event left join item on event_hash = resource_id
- where resource_type = 'event' and event.uid = %d $ignored
- AND (( adjust = 0 AND ( finish >= '%s' or nofinish = 1 ) AND start <= '%s' )
- OR ( adjust = 1 AND ( finish >= '%s' or nofinish = 1 ) AND start <= '%s' )) $sql_extra ",
- intval($channel['channel_id']),
- dbesc($start),
- dbesc($finish),
- dbesc($adjust_start),
- dbesc($adjust_finish)
- );
-
- }
-
- $links = array();
-
- if($r) {
- xchan_query($r);
- $r = fetch_post_tags($r,true);
-
- $r = sort_by_date($r);
- }
-
- if($r) {
- foreach($r as $rr) {
- $j = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['start'], 'j') : datetime_convert('UTC','UTC',$rr['start'],'j'));
- if(! x($links,$j))
- $links[$j] = z_root() . '/' . App::$cmd . '#link-' . $j;
- }
- }
-
- $events=array();
-
- $last_date = '';
- $fmt = t('l, F j');
-
- if($r) {
-
- foreach($r as $rr) {
-
- $j = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['start'], 'j') : datetime_convert('UTC','UTC',$rr['start'],'j'));
- $d = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['start'], $fmt) : datetime_convert('UTC','UTC',$rr['start'],$fmt));
- $d = day_translate($d);
-
- $start = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['start'], 'c') : datetime_convert('UTC','UTC',$rr['start'],'c'));
- if ($rr['nofinish']){
- $end = null;
- } else {
- $end = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['finish'], 'c') : datetime_convert('UTC','UTC',$rr['finish'],'c'));
- }
-
-
- $is_first = ($d !== $last_date);
-
- $last_date = $d;
-
- $edit = false;
-
- $drop = false;
-
- $title = strip_tags(html_entity_decode(bbcode($rr['summary']),ENT_QUOTES,'UTF-8'));
- if(! $title) {
- list($title, $_trash) = explode("<br",bbcode($rr['desc']),2);
- $title = strip_tags(html_entity_decode($title,ENT_QUOTES,'UTF-8'));
- }
- $html = format_event_html($rr);
- $rr['desc'] = bbcode($rr['desc']);
- $rr['location'] = bbcode($rr['location']);
- $events[] = array(
- 'id'=>$rr['id'],
- 'hash' => $rr['event_hash'],
- 'start'=> $start,
- 'end' => $end,
- 'drop' => $drop,
- 'allDay' => false,
- 'title' => $title,
-
- 'j' => $j,
- 'd' => $d,
- 'edit' => $edit,
- 'is_first'=>$is_first,
- 'item'=>$rr,
- 'html'=>$html,
- 'plink' => array($rr['plink'],t('Link to Source'),'',''),
- );
-
-
- }
- }
-
- if (argv(2) === 'json'){
- echo json_encode($events); killme();
- }
-
- // links: array('href', 'text', 'extra css classes', 'title')
- if (x($_GET,'id')){
- $tpl = get_markup_template("event_cal.tpl");
- }
- else {
- $tpl = get_markup_template("events_cal-js.tpl");
- }
-
- $nick = $channel['channel_address'];
-
- $o = replace_macros($tpl, array(
- '$baseurl' => z_root(),
- '$new_event' => array(z_root().'/cal',(($event_id) ? t('Edit Event') : t('Create Event')),'',''),
- '$previus' => array(z_root()."/cal/$nick/$prevyear/$prevmonth",t('Previous'),'',''),
- '$next' => array(z_root()."/cal/$nick/$nextyear/$nextmonth",t('Next'),'',''),
- '$export' => array(z_root()."/cal/$nick/$y/$m/export",t('Export'),'',''),
- '$calendar' => cal($y,$m,$links, ' eventcal'),
- '$events' => $events,
- '$upload' => t('Import'),
- '$submit' => t('Submit'),
- '$prev' => t('Previous'),
- '$next' => t('Next'),
- '$today' => t('Today'),
- '$form' => $form,
- '$expandform' => ((x($_GET,'expandform')) ? true : false),
- '$tabs' => $tabs
- ));
-
- if (x($_GET,'id')){ echo $o; killme(); }
-
- return $o;
- }
-
-}
diff --git a/mod/chanview.php b/mod/chanview.php
deleted file mode 100644
index 705fb5a7d..000000000
--- a/mod/chanview.php
+++ /dev/null
@@ -1,104 +0,0 @@
-<?php
-
-require_once('include/Contact.php');
-require_once('include/zot.php');
-
-function chanview_content(&$a) {
-
- $observer = App::get_observer();
- $xchan = null;
-
- $r = null;
-
- if($_REQUEST['hash']) {
- $r = q("select * from xchan where xchan_hash = '%s' limit 1",
- dbesc($_REQUEST['hash'])
- );
- }
- if($_REQUEST['address']) {
- $r = q("select * from xchan where xchan_addr = '%s' limit 1",
- dbesc($_REQUEST['address'])
- );
- }
- elseif(local_channel() && intval($_REQUEST['cid'])) {
- $r = q("SELECT abook.*, xchan.*
- FROM abook left join xchan on abook_xchan = xchan_hash
- WHERE abook_channel = %d and abook_id = %d LIMIT 1",
- intval(local_channel()),
- intval($_REQUEST['cid'])
- );
- }
- elseif($_REQUEST['url']) {
-
- // if somebody re-installed they will have more than one xchan, use the most recent name date as this is
- // the most useful consistently ascending table item we have.
-
- $r = q("select * from xchan where xchan_url = '%s' order by xchan_name_date desc limit 1",
- dbesc($_REQUEST['url'])
- );
- }
- if($r) {
- App::$poi = $r[0];
- }
-
-
- // Here, let's see if we have an xchan. If we don't, how we proceed is determined by what
- // info we do have. If it's a URL, we can offer to visit it directly. If it's a webbie or
- // address, we can and should try to import it. If it's just a hash, we can't continue, but we
- // probably wouldn't have a hash if we don't already have an xchan for this channel.
-
- if(! App::$poi) {
- logger('mod_chanview: fallback');
- // This is hackish - construct a zot address from the url
- if($_REQUEST['url']) {
- if(preg_match('/https?\:\/\/(.*?)(\/channel\/|\/profile\/)(.*?)$/ism',$_REQUEST['url'],$matches)) {
- $_REQUEST['address'] = $matches[3] . '@' . $matches[1];
- }
- logger('mod_chanview: constructed address ' . print_r($matches,true));
- }
-
- if($_REQUEST['address']) {
- $ret = zot_finger($_REQUEST['address'],null);
- if($ret['success']) {
- $j = json_decode($ret['body'],true);
- if($j)
- import_xchan($j);
- $r = q("select * from xchan where xchan_addr = '%s' limit 1",
- dbesc($_REQUEST['address'])
- );
- if($r)
- App::$poi = $r[0];
- }
-
- }
- }
-
- if(! App::$poi) {
-// We don't know who this is, and we can't figure it out from the URL
-// On the plus side, there's a good chance we know somebody else at that
-// hub so sending them there with a Zid will probably work anyway.
- $url = ($_REQUEST['url']);
- if($observer)
- $url = zid($url);
- }
-
- if (App::$poi) {
- $url = App::$poi['xchan_url'];
- if($observer)
- $url = zid($url);
- }
- // let somebody over-ride the iframed viewport presentation
- // or let's just declare this a failed experiment.
-
-// if((! local_channel()) || (get_pconfig(local_channel(),'system','chanview_full')))
-
- goaway($url);
-
-// $o = replace_macros(get_markup_template('chanview.tpl'),array(
-// '$url' => $url,
-// '$full' => t('toggle full screen mode')
-// ));
-
-// return $o;
-
-}
diff --git a/mod/chat.php b/mod/chat.php
deleted file mode 100644
index 375d069be..000000000
--- a/mod/chat.php
+++ /dev/null
@@ -1,255 +0,0 @@
-<?php /** @file */
-
-require_once('include/chat.php');
-require_once('include/bookmarks.php');
-
-function chat_init(&$a) {
-
- $which = null;
- if(argc() > 1)
- $which = argv(1);
- if(! $which) {
- if(local_channel()) {
- $channel = App::get_channel();
- if($channel && $channel['channel_address'])
- $which = $channel['channel_address'];
- }
- }
- if(! $which) {
- notice( t('You must be logged in to see this page.') . EOL );
- return;
- }
-
- $profile = 0;
- $channel = App::get_channel();
-
- if((local_channel()) && (argc() > 2) && (argv(2) === 'view')) {
- $which = $channel['channel_address'];
- $profile = argv(1);
- }
-
- App::$page['htmlhead'] .= '<link rel="alternate" type="application/atom+xml" href="' . z_root() . '/feed/' . $which .'" />' . "\r\n" ;
-
- // Run profile_load() here to make sure the theme is set before
- // we start loading content
-
- profile_load($a,$which,$profile);
-
-}
-
-function chat_post(&$a) {
-
- if($_POST['room_name'])
- $room = strip_tags(trim($_POST['room_name']));
-
- if((! $room) || (! local_channel()))
- return;
-
- $channel = App::get_channel();
-
-
- if($_POST['action'] === 'drop') {
- logger('delete chatroom');
- chatroom_destroy($channel,array('cr_name' => $room));
- goaway(z_root() . '/chat/' . $channel['channel_address']);
- }
-
- $acl = new Zotlabs\Access\AccessList($channel);
- $acl->set_from_array($_REQUEST);
-
- $arr = $acl->get();
- $arr['name'] = $room;
- $arr['expire'] = intval($_POST['chat_expire']);
- if(intval($arr['expire']) < 0)
- $arr['expire'] = 0;
-
- chatroom_create($channel,$arr);
-
- $x = q("select * from chatroom where cr_name = '%s' and cr_uid = %d limit 1",
- dbesc($room),
- intval(local_channel())
- );
-
- build_sync_packet(0, array('chatroom' => $x));
-
- if($x)
- goaway(z_root() . '/chat/' . $channel['channel_address'] . '/' . $x[0]['cr_id']);
-
- // that failed. Try again perhaps?
-
- goaway(z_root() . '/chat/' . $channel['channel_address'] . '/new');
-
-
-}
-
-
-function chat_content(&$a) {
-
- if(local_channel())
- $channel = App::get_channel();
-
- $ob = App::get_observer();
- $observer = get_observer_hash();
- if(! $observer) {
- notice( t('Permission denied.') . EOL);
- return;
- }
-
- if(! perm_is_allowed(App::$profile['profile_uid'],$observer,'chat')) {
- notice( t('Permission denied.') . EOL);
- return;
- }
-
- if((argc() > 3) && intval(argv(2)) && (argv(3) === 'leave')) {
- chatroom_leave($observer,argv(2),$_SERVER['REMOTE_ADDR']);
- goaway(z_root() . '/channel/' . argv(1));
- }
-
-
- if((argc() > 3) && intval(argv(2)) && (argv(3) === 'status')) {
- $ret = array('success' => false);
- $room_id = intval(argv(2));
- if(! $room_id || ! $observer)
- return;
-
- $r = q("select * from chatroom where cr_id = %d limit 1",
- intval($room_id)
- );
- if(! $r) {
- json_return_and_die($ret);
- }
- require_once('include/security.php');
- $sql_extra = permissions_sql($r[0]['cr_uid']);
-
- $x = q("select * from chatroom where cr_id = %d and cr_uid = %d $sql_extra limit 1",
- intval($room_id),
- intval($r[0]['cr_uid'])
- );
- if(! $x) {
- json_return_and_die($ret);
- }
- $y = q("select count(*) as total from chatpresence where cp_room = %d",
- intval($room_id)
- );
- if($y) {
- $ret['success'] = true;
- $ret['chatroom'] = $r[0]['cr_name'];
- $ret['inroom'] = $y[0]['total'];
- }
-
- // figure out how to present a timestamp of the last activity, since we don't know the observer's timezone.
-
- $z = q("select created from chat where chat_room = %d order by created desc limit 1",
- intval($room_id)
- );
- if($z) {
- $ret['last'] = $z[0]['created'];
- }
- json_return_and_die($ret);
- }
-
-
- if(argc() > 2 && intval(argv(2))) {
-
- $room_id = intval(argv(2));
- $bookmark_link = get_bookmark_link($ob);
-
- $x = chatroom_enter($observer,$room_id,'online',$_SERVER['REMOTE_ADDR']);
- if(! $x)
- return;
- $x = q("select * from chatroom where cr_id = %d and cr_uid = %d $sql_extra limit 1",
- intval($room_id),
- intval(App::$profile['profile_uid'])
- );
-
- if($x) {
- $acl = new Zotlabs\Access\AccessList(false);
- $acl->set($x[0]);
-
- $private = $acl->is_private();
- $room_name = $x[0]['cr_name'];
- if($bookmark_link)
- $bookmark_link .= '&url=' . z_root() . '/chat/' . argv(1) . '/' . argv(2) . '&title=' . urlencode($x[0]['cr_name']) . (($private) ? '&private=1' : '') . '&ischat=1';
- }
- else {
- notice( t('Room not found') . EOL);
- return;
- }
-
- $cipher = get_pconfig(local_channel(),'system','default_cipher');
- if(! $cipher)
- $cipher = 'aes256';
-
-
- $o = replace_macros(get_markup_template('chat.tpl'),array(
- '$is_owner' => ((local_channel() && local_channel() == $x[0]['cr_uid']) ? true : false),
- '$room_name' => $room_name,
- '$room_id' => $room_id,
- '$baseurl' => z_root(),
- '$nickname' => argv(1),
- '$submit' => t('Submit'),
- '$leave' => t('Leave Room'),
- '$drop' => t('Delete Room'),
- '$away' => t('I am away right now'),
- '$online' => t('I am online'),
- '$bookmark_link' => $bookmark_link,
- '$bookmark' => t('Bookmark this room'),
- '$feature_encrypt' => ((feature_enabled(local_channel(),'content_encrypt')) ? true : false),
- '$cipher' => $cipher,
- '$linkurl' => t('Please enter a link URL:'),
- '$encrypt' => t('Encrypt text'),
- '$insert' => t('Insert web link')
- ));
- return $o;
- }
-
-
- require_once('include/conversation.php');
-
- $o = profile_tabs($a,((local_channel() && local_channel() == App::$profile['profile_uid']) ? true : false),App::$profile['channel_address']);
-
- if(! feature_enabled(App::$profile['profile_uid'],'ajaxchat')) {
- notice( t('Feature disabled.') . EOL);
- return $o;
- }
-
-
- $acl = new Zotlabs\Access\AccessList($channel);
- $channel_acl = $acl->get();
-
- $lockstate = (($channel_acl['allow_cid'] || $channel_acl['allow_gid'] || $channel_acl['deny_cid'] || $channel_acl['deny_gid']) ? 'lock' : 'unlock');
- require_once('include/acl_selectors.php');
-
- $chatroom_new = '';
- if(local_channel()) {
- $chatroom_new = replace_macros(get_markup_template('chatroom_new.tpl'),array(
- '$header' => t('New Chatroom'),
- '$name' => array('room_name',t('Chatroom name'),'', ''),
- '$chat_expire' => array('chat_expire',t('Expiration of chats (minutes)'),120,''),
- '$permissions' => t('Permissions'),
- '$acl' => populate_acl($channel_acl,false),
- '$lockstate' => $lockstate,
- '$submit' => t('Submit')
-
- ));
- }
-
- $rooms = chatroom_list(App::$profile['profile_uid']);
-
- $o .= replace_macros(get_markup_template('chatrooms.tpl'), array(
- '$header' => sprintf( t('%1$s\'s Chatrooms'), App::$profile['name']),
- '$name' => t('Name'),
- '$baseurl' => z_root(),
- '$nickname' => App::$profile['channel_address'],
- '$rooms' => $rooms,
- '$norooms' => t('No chatrooms available'),
- '$newroom' => t('Create New'),
- '$is_owner' => ((local_channel() && local_channel() == App::$profile['profile_uid']) ? 1 : 0),
- '$chatroom_new' => $chatroom_new,
- '$expire' => t('Expiration'),
- '$expire_unit' => t('min') //minutes
- ));
-
- return $o;
-
-}
diff --git a/mod/chatsvc.php b/mod/chatsvc.php
deleted file mode 100644
index 4fa38e819..000000000
--- a/mod/chatsvc.php
+++ /dev/null
@@ -1,162 +0,0 @@
-<?php /** @file */
-
-require_once('include/security.php');
-
-function chatsvc_init(&$a) {
-
-//logger('chatsvc');
-
- $ret = array('success' => false);
-
- App::$data['chat']['room_id'] = intval($_REQUEST['room_id']);
- $x = q("select cr_uid from chatroom where cr_id = %d and cr_id != 0 limit 1",
- intval(App::$data['chat']['room_id'])
- );
- if(! $x)
- json_return_and_die($ret);
-
- App::$data['chat']['uid'] = $x[0]['cr_uid'];
-
- if(! perm_is_allowed(App::$data['chat']['uid'],get_observer_hash(),'chat')) {
- json_return_and_die($ret);
- }
-
-}
-
-function chatsvc_post(&$a) {
-
- $ret = array('success' => false);
-
- $room_id = App::$data['chat']['room_id'];
- $text = escape_tags($_REQUEST['chat_text']);
- if(! $text)
- return;
-
- $sql_extra = permissions_sql(App::$data['chat']['uid']);
-
- $r = q("select * from chatroom where cr_uid = %d and cr_id = %d $sql_extra",
- intval(App::$data['chat']['uid']),
- intval(App::$data['chat']['room_id'])
- );
- if(! $r)
- json_return_and_die($ret);
-
- $arr = array(
- 'chat_room' => App::$data['chat']['room_id'],
- 'chat_xchan' => get_observer_hash(),
- 'chat_text' => $text
- );
-
- call_hooks('chat_post',$arr);
-
- $x = q("insert into chat ( chat_room, chat_xchan, created, chat_text )
- values( %d, '%s', '%s', '%s' )",
- intval(App::$data['chat']['room_id']),
- dbesc(get_observer_hash()),
- dbesc(datetime_convert()),
- dbesc($arr['chat_text'])
- );
-
- $ret['success'] = true;
- json_return_and_die($ret);
-}
-
-function chatsvc_content(&$a) {
-
- $status = strip_tags($_REQUEST['status']);
- $room_id = intval(App::$data['chat']['room_id']);
- $stopped = ((x($_REQUEST,'stopped') && intval($_REQUEST['stopped'])) ? true : false);
-
- if($status && $room_id) {
-
- $x = q("select channel_address from channel where channel_id = %d limit 1",
- intval(App::$data['chat']['uid'])
- );
-
- $r = q("update chatpresence set cp_status = '%s', cp_last = '%s' where cp_room = %d and cp_xchan = '%s' and cp_client = '%s'",
- dbesc($status),
- dbesc(datetime_convert()),
- intval($room_id),
- dbesc(get_observer_hash()),
- dbesc($_SERVER['REMOTE_ADDR'])
- );
-
- goaway(z_root() . '/chat/' . $x[0]['channel_address'] . '/' . $room_id);
- }
-
- if(! $stopped) {
-
- $lastseen = intval($_REQUEST['last']);
-
- $ret = array('success' => false);
-
- $sql_extra = permissions_sql(App::$data['chat']['uid']);
-
- $r = q("select * from chatroom where cr_uid = %d and cr_id = %d $sql_extra",
- intval(App::$data['chat']['uid']),
- intval(App::$data['chat']['room_id'])
- );
- if(! $r)
- json_return_and_die($ret);
-
- $inroom = array();
-
- $r = q("select * from chatpresence left join xchan on xchan_hash = cp_xchan where cp_room = %d order by xchan_name",
- intval(App::$data['chat']['room_id'])
- );
- if($r) {
- foreach($r as $rr) {
- switch($rr['cp_status']) {
- case 'away':
- $status = t('Away');
- $status_class = 'away';
- break;
- case 'online':
- default:
- $status = t('Online');
- $status_class = 'online';
- break;
- }
-
- $inroom[] = array('img' => zid($rr['xchan_photo_m']), 'img_type' => $rr['xchan_photo_mimetype'],'name' => $rr['xchan_name'], 'status' => $status, 'status_class' => $status_class);
- }
- }
-
- $chats = array();
-
- $r = q("select * from chat left join xchan on chat_xchan = xchan_hash where chat_room = %d and chat_id > %d order by created",
- intval(App::$data['chat']['room_id']),
- intval($lastseen)
- );
- if($r) {
- foreach($r as $rr) {
- $chats[] = array(
- 'id' => $rr['chat_id'],
- 'img' => zid($rr['xchan_photo_m']),
- 'img_type' => $rr['xchan_photo_mimetype'],
- 'name' => $rr['xchan_name'],
- 'isotime' => datetime_convert('UTC', date_default_timezone_get(), $rr['created'], 'c'),
- 'localtime' => datetime_convert('UTC', date_default_timezone_get(), $rr['created'], 'r'),
- 'text' => smilies(bbcode($rr['chat_text'])),
- 'self' => ((get_observer_hash() == $rr['chat_xchan']) ? 'self' : '')
- );
- }
- }
- }
-
- $r = q("update chatpresence set cp_last = '%s' where cp_room = %d and cp_xchan = '%s' and cp_client = '%s'",
- dbesc(datetime_convert()),
- intval(App::$data['chat']['room_id']),
- dbesc(get_observer_hash()),
- dbesc($_SERVER['REMOTE_ADDR'])
- );
-
- $ret['success'] = true;
- if(! $stopped) {
- $ret['inroom'] = $inroom;
- $ret['chats'] = $chats;
- }
- json_return_and_die($ret);
-
-}
-
diff --git a/mod/cloud.php b/mod/cloud.php
deleted file mode 100644
index eed941ff7..000000000
--- a/mod/cloud.php
+++ /dev/null
@@ -1,104 +0,0 @@
-<?php
-/**
- * @file mod/cloud.php
- * @brief Initialize Hubzilla's cloud (SabreDAV).
- *
- * Module for accessing the DAV storage area.
- */
-
-use Sabre\DAV;
-use Zotlabs\Storage;
-
-// composer autoloader for SabreDAV
-require_once('vendor/autoload.php');
-
-/**
- * @brief Fires up the SabreDAV server.
- *
- * @param App &$a
- */
-
-function cloud_init(&$a) {
- require_once('include/reddav.php');
-
- if (! is_dir('store'))
- os_mkdir('store', STORAGE_DEFAULT_PERMISSIONS, false);
-
- $which = null;
- if (argc() > 1)
- $which = argv(1);
-
- $profile = 0;
-
- App::$page['htmlhead'] .= '<link rel="alternate" type="application/atom+xml" href="' . z_root() . '/feed/' . $which . '" />' . "\r\n";
-
- if ($which)
- profile_load($a, $which, $profile);
-
- $auth = new Zotlabs\Storage\BasicAuth();
-
- $ob_hash = get_observer_hash();
-
- if ($ob_hash) {
- if (local_channel()) {
- $channel = App::get_channel();
- $auth->setCurrentUser($channel['channel_address']);
- $auth->channel_id = $channel['channel_id'];
- $auth->channel_hash = $channel['channel_hash'];
- $auth->channel_account_id = $channel['channel_account_id'];
- if($channel['channel_timezone'])
- $auth->setTimezone($channel['channel_timezone']);
- }
- $auth->observer = $ob_hash;
- }
-
- if ($_GET['davguest'])
- $_SESSION['davguest'] = true;
-
- $_SERVER['QUERY_STRING'] = str_replace(array('?f=', '&f='), array('', ''), $_SERVER['QUERY_STRING']);
- $_SERVER['QUERY_STRING'] = strip_zids($_SERVER['QUERY_STRING']);
- $_SERVER['QUERY_STRING'] = preg_replace('/[\?&]davguest=(.*?)([\?&]|$)/ism', '', $_SERVER['QUERY_STRING']);
-
- $_SERVER['REQUEST_URI'] = str_replace(array('?f=', '&f='), array('', ''), $_SERVER['REQUEST_URI']);
- $_SERVER['REQUEST_URI'] = strip_zids($_SERVER['REQUEST_URI']);
- $_SERVER['REQUEST_URI'] = preg_replace('/[\?&]davguest=(.*?)([\?&]|$)/ism', '', $_SERVER['REQUEST_URI']);
-
- $rootDirectory = new Zotlabs\Storage\Directory('/', $auth);
-
- // A SabreDAV server-object
- $server = new DAV\Server($rootDirectory);
- // prevent overwriting changes each other with a lock backend
- $lockBackend = new DAV\Locks\Backend\File('store/[data]/locks');
- $lockPlugin = new DAV\Locks\Plugin($lockBackend);
-
- $server->addPlugin($lockPlugin);
-
- $is_readable = false;
-
- if($_SERVER['REQUEST_METHOD'] === 'GET') {
- try {
- $x = RedFileData('/' . App::$cmd, $auth);
- }
- catch(\Exception $e) {
- if($e instanceof Sabre\DAV\Exception\Forbidden) {
- http_status_exit(401, 'Permission denied.');
- }
- }
- }
-
-// require_once('Zotlabs/Storage/Browser.php');
- // provide a directory view for the cloud in Hubzilla
- $browser = new Zotlabs\Storage\Browser($auth);
- $auth->setBrowserPlugin($browser);
-
- $server->addPlugin($browser);
-
- // Experimental QuotaPlugin
-// require_once('Zotlabs\Storage/QuotaPlugin.php');
-// $server->addPlugin(new Zotlabs\Storage\\QuotaPlugin($auth));
-
- // All we need to do now, is to fire up the server
- $server->exec();
-
- killme();
-}
diff --git a/mod/common.php b/mod/common.php
deleted file mode 100644
index 3390bd997..000000000
--- a/mod/common.php
+++ /dev/null
@@ -1,67 +0,0 @@
-<?php
-
-require_once('include/socgraph.php');
-
-function common_init(&$a) {
-
- if(argc() > 1 && intval(argv(1)))
- $channel_id = intval(argv(1));
- else {
- notice( t('No channel.') . EOL );
- App::$error = 404;
- return;
- }
-
- $x = q("select channel_address from channel where channel_id = %d limit 1",
- intval($channel_id)
- );
-
- if($x)
- profile_load($a,$x[0]['channel_address'],0);
-
-}
-
-function common_content(&$a) {
-
- $o = '';
-
- if(! App::$profile['profile_uid'])
- return;
-
- $observer_hash = get_observer_hash();
-
-
- if(! perm_is_allowed(App::$profile['profile_uid'],$observer_hash,'view_contacts')) {
- notice( t('Permission denied.') . EOL);
- return;
- }
-
- $o .= '<h2>' . t('Common connections') . '</h2>';
-
- $t = count_common_friends(App::$profile['profile_uid'],$observer_hash);
-
- if(! $t) {
- notice( t('No connections in common.') . EOL);
- return $o;
- }
-
- $r = common_friends(App::$profile['profile_uid'],$observer_hash);
-
- if($r) {
-
- $tpl = get_markup_template('common_friends.tpl');
-
- foreach($r as $rr) {
- $o .= replace_macros($tpl,array(
- '$url' => $rr['xchan_url'],
- '$name' => $rr['xchan_name'],
- '$photo' => $rr['xchan_photo_m'],
- '$tags' => ''
- ));
- }
-
- $o .= cleardiv();
- }
-
- return $o;
-}
diff --git a/mod/connect.php b/mod/connect.php
deleted file mode 100644
index 84c67e4d2..000000000
--- a/mod/connect.php
+++ /dev/null
@@ -1,125 +0,0 @@
-<?php /** @file */
-
-
-require_once('include/Contact.php');
-require_once('include/contact_widgets.php');
-require_once('include/items.php');
-
-
-function connect_init(&$a) {
- if(argc() > 1)
- $which = argv(1);
- else {
- notice( t('Requested profile is not available.') . EOL );
- App::$error = 404;
- return;
- }
-
- $r = q("select * from channel where channel_address = '%s' limit 1",
- dbesc($which)
- );
-
- if($r)
- App::$data['channel'] = $r[0];
-
- profile_load($a,$which,'');
-}
-
-function connect_post(&$a) {
-
- if(! array_key_exists('channel', App::$data))
- return;
-
- $edit = ((local_channel() && (local_channel() == App::$data['channel']['channel_id'])) ? true : false);
-
- if($edit) {
- $has_premium = ((App::$data['channel']['channel_pageflags'] & PAGE_PREMIUM) ? 1 : 0);
- $premium = (($_POST['premium']) ? intval($_POST['premium']) : 0);
- $text = escape_tags($_POST['text']);
-
- if($has_premium != $premium) {
- $r = q("update channel set channel_pageflags = ( channel_pageflags %s %d ) where channel_id = %d",
- db_getfunc('^'),
- intval(PAGE_PREMIUM),
- intval(local_channel())
- );
- proc_run('php','include/notifier.php','refresh_all',App::$data['channel']['channel_id']);
- }
- set_pconfig(App::$data['channel']['channel_id'],'system','selltext',$text);
- // reload the page completely to get fresh data
- goaway(z_root() . '/' . App::$query_string);
-
- }
-
- $url = '';
- $observer = App::get_observer();
- if(($observer) && ($_POST['submit'] === t('Continue'))) {
- if($observer['xchan_follow'])
- $url = sprintf($observer['xchan_follow'],urlencode(App::$data['channel']['channel_address'] . '@' . App::get_hostname()));
- if(! $url) {
- $r = q("select * from hubloc where hubloc_hash = '%s' order by hubloc_id desc limit 1",
- dbesc($observer['xchan_hash'])
- );
- if($r)
- $url = $r[0]['hubloc_url'] . '/follow?f=&url=' . urlencode(App::$data['channel']['channel_address'] . '@' . App::get_hostname());
- }
- }
- if($url)
- goaway($url . '&confirm=1');
- else
- notice('Unable to connect to your home hub location.');
-
-}
-
-
-
-function connect_content(&$a) {
-
- $edit = ((local_channel() && (local_channel() == App::$data['channel']['channel_id'])) ? true : false);
-
- $text = get_pconfig(App::$data['channel']['channel_id'],'system','selltext');
-
- if($edit) {
-
- $o = replace_macros(get_markup_template('sellpage_edit.tpl'),array(
- '$header' => t('Premium Channel Setup'),
- '$address' => App::$data['channel']['channel_address'],
- '$premium' => array('premium', t('Enable premium channel connection restrictions'),((App::$data['channel']['channel_pageflags'] & PAGE_PREMIUM) ? '1' : ''),''),
- '$lbl_about' => t('Please enter your restrictions or conditions, such as paypal receipt, usage guidelines, etc.'),
- '$text' => $text,
- '$desc' => t('This channel may require additional steps or acknowledgement of the following conditions prior to connecting:'),
- '$lbl2' => t('Potential connections will then see the following text before proceeding:'),
- '$desc2' => t('By continuing, I certify that I have complied with any instructions provided on this page.'),
- '$submit' => t('Submit'),
-
-
- ));
- return $o;
- }
- else {
- if(! $text)
- $text = t('(No specific instructions have been provided by the channel owner.)');
-
- $submit = replace_macros(get_markup_template('sellpage_submit.tpl'), array(
- '$continue' => t('Continue'),
- '$address' => App::$data['channel']['channel_address']
- ));
-
- $o = replace_macros(get_markup_template('sellpage_view.tpl'),array(
- '$header' => t('Restricted or Premium Channel'),
- '$desc' => t('This channel may require additional steps or acknowledgement of the following conditions prior to connecting:'),
- '$text' => prepare_text($text),
-
- '$desc2' => t('By continuing, I certify that I have complied with any instructions provided on this page.'),
- '$submit' => $submit,
-
- ));
-
- $arr = array('channel' => App::$data['channel'],'observer' => App::get_observer(), 'sellpage' => $o, 'submit' => $submit);
- call_hooks('connect_premium', $arr);
- $o = $arr['sellpage'];
-
- }
-
- return $o;
-} \ No newline at end of file
diff --git a/mod/connections.php b/mod/connections.php
deleted file mode 100644
index 992d485bd..000000000
--- a/mod/connections.php
+++ /dev/null
@@ -1,318 +0,0 @@
-<?php
-
-require_once('include/Contact.php');
-require_once('include/socgraph.php');
-require_once('include/contact_selectors.php');
-require_once('include/group.php');
-require_once('include/contact_widgets.php');
-require_once('include/zot.php');
-require_once('include/widgets.php');
-
-function connections_init(&$a) {
-
- if(! local_channel())
- return;
-
- $channel = App::get_channel();
- if($channel)
- head_set_icon($channel['xchan_photo_s']);
-
-}
-
-function connections_content(&$a) {
-
- $sort_type = 0;
- $o = '';
-
-
- if(! local_channel()) {
- notice( t('Permission denied.') . EOL);
- return login();
- }
-
- $blocked = false;
- $hidden = false;
- $ignored = false;
- $archived = false;
- $unblocked = false;
- $pending = false;
- $unconnected = false;
- $all = false;
-
- if(! $_REQUEST['aj'])
- $_SESSION['return_url'] = App::$query_string;
-
- $search_flags = '';
- $head = '';
-
- if(argc() == 2) {
- switch(argv(1)) {
- case 'blocked':
- $search_flags = " and abook_blocked = 1 ";
- $head = t('Blocked');
- $blocked = true;
- break;
- case 'ignored':
- $search_flags = " and abook_ignored = 1 ";
- $head = t('Ignored');
- $ignored = true;
- break;
- case 'hidden':
- $search_flags = " and abook_hidden = 1 ";
- $head = t('Hidden');
- $hidden = true;
- break;
- case 'archived':
- $search_flags = " and abook_archived = 1 ";
- $head = t('Archived');
- $archived = true;
- break;
- case 'pending':
- $search_flags = " and abook_pending = 1 ";
- $head = t('New');
- $pending = true;
- nav_set_selected('intros');
- break;
- case 'ifpending':
- $r = q("SELECT COUNT(abook.abook_id) AS total FROM abook left join xchan on abook.abook_xchan = xchan.xchan_hash where abook_channel = %d and abook_pending = 1 and abook_self = 0 and abook_ignored = 0 and xchan_deleted = 0 and xchan_orphan = 0 ",
- intval(local_channel())
- );
- if($r && $r[0]['total']) {
- $search_flags = " and abook_pending = 1 ";
- $head = t('New');
- $pending = true;
- nav_set_selected('intros');
- App::$argv[1] = 'pending';
- }
- else {
- $head = t('All');
- $search_flags = '';
- $all = true;
- App::$argc = 1;
- unset(App::$argv[1]);
- }
- nav_set_selected('intros');
- break;
-// case 'unconnected':
-// $search_flags = " and abook_unconnected = 1 ";
-// $head = t('Unconnected');
-// $unconnected = true;
-// break;
-
- case 'all':
- $head = t('All');
- default:
- $search_flags = '';
- $all = true;
- break;
-
- }
-
- $sql_extra = $search_flags;
- if(argv(1) === 'pending')
- $sql_extra .= " and abook_ignored = 0 ";
-
- }
- else {
- $sql_extra = " and abook_blocked = 0 ";
- $unblocked = true;
- }
-
- $search = ((x($_REQUEST,'search')) ? notags(trim($_REQUEST['search'])) : '');
-
- $tabs = array(
- /*
- array(
- 'label' => t('Suggestions'),
- 'url' => z_root() . '/suggest',
- 'sel' => '',
- 'title' => t('Suggest new connections'),
- ),
- */
-
- 'pending' => array(
- 'label' => t('New Connections'),
- 'url' => z_root() . '/connections/pending',
- 'sel' => ($pending) ? 'active' : '',
- 'title' => t('Show pending (new) connections'),
- ),
-
- 'all' => array(
- 'label' => t('All Connections'),
- 'url' => z_root() . '/connections/all',
- 'sel' => ($all) ? 'active' : '',
- 'title' => t('Show all connections'),
- ),
-
- /*
- array(
- 'label' => t('Unblocked'),
- 'url' => z_root() . '/connections',
- 'sel' => (($unblocked) && (! $search) && (! $nets)) ? 'active' : '',
- 'title' => t('Only show unblocked connections'),
- ),
- */
-
- 'blocked' => array(
- 'label' => t('Blocked'),
- 'url' => z_root() . '/connections/blocked',
- 'sel' => ($blocked) ? 'active' : '',
- 'title' => t('Only show blocked connections'),
- ),
-
- 'ignored' => array(
- 'label' => t('Ignored'),
- 'url' => z_root() . '/connections/ignored',
- 'sel' => ($ignored) ? 'active' : '',
- 'title' => t('Only show ignored connections'),
- ),
-
- 'archived' => array(
- 'label' => t('Archived'),
- 'url' => z_root() . '/connections/archived',
- 'sel' => ($archived) ? 'active' : '',
- 'title' => t('Only show archived connections'),
- ),
-
- 'hidden' => array(
- 'label' => t('Hidden'),
- 'url' => z_root() . '/connections/hidden',
- 'sel' => ($hidden) ? 'active' : '',
- 'title' => t('Only show hidden connections'),
- ),
-
-// array(
-// 'label' => t('Unconnected'),
-// 'url' => z_root() . '/connections/unconnected',
-// 'sel' => ($unconnected) ? 'active' : '',
-// 'title' => t('Only show one-way connections'),
-// ),
-
-
- );
-
- //$tab_tpl = get_markup_template('common_tabs.tpl');
- //$t = replace_macros($tab_tpl, array('$tabs'=>$tabs));
-
- $searching = false;
- if($search) {
- $search_hdr = $search;
- $search_txt = dbesc(protect_sprintf(preg_quote($search)));
- $searching = true;
- }
- $sql_extra .= (($searching) ? protect_sprintf(" AND xchan_name like '%$search_txt%' ") : "");
-
- if($_REQUEST['gid']) {
- $sql_extra .= " and xchan_hash in ( select xchan from group_member where gid = " . intval($_REQUEST['gid']) . " and uid = " . intval(local_channel()) . " ) ";
- }
-
- $r = q("SELECT COUNT(abook.abook_id) AS total FROM abook left join xchan on abook.abook_xchan = xchan.xchan_hash
- where abook_channel = %d and abook_self = 0 and xchan_deleted = 0 and xchan_orphan = 0 $sql_extra $sql_extra2 ",
- intval(local_channel())
- );
- if($r) {
- App::set_pager_total($r[0]['total']);
- $total = $r[0]['total'];
- }
-
- $r = q("SELECT abook.*, xchan.* FROM abook left join xchan on abook.abook_xchan = xchan.xchan_hash
- WHERE abook_channel = %d and abook_self = 0 and xchan_deleted = 0 and xchan_orphan = 0 $sql_extra $sql_extra2 ORDER BY xchan_name LIMIT %d OFFSET %d ",
- intval(local_channel()),
- intval(App::$pager['itemspage']),
- intval(App::$pager['start'])
- );
-
- $contacts = array();
-
- if(count($r)) {
-
- foreach($r as $rr) {
- if($rr['xchan_url']) {
-
- $status_str = '';
- $status = array(
- ((intval($rr['abook_pending'])) ? t('Pending approval') : ''),
- ((intval($rr['abook_archived'])) ? t('Archived') : ''),
- ((intval($rr['abook_hidden'])) ? t('Hidden') : ''),
- ((intval($rr['abook_ignored'])) ? t('Ignored') : ''),
- ((intval($rr['abook_blocked'])) ? t('Blocked') : '')
- );
-
- foreach($status as $str) {
- if(!$str)
- continue;
- $status_str .= $str;
- $status_str .= ', ';
- }
- $status_str = rtrim($status_str, ', ');
-
- $contacts[] = array(
- 'img_hover' => sprintf( t('%1$s [%2$s]'),$rr['xchan_name'],$rr['xchan_url']),
- 'edit_hover' => t('Edit connection'),
- 'delete_hover' => t('Delete connection'),
- 'id' => $rr['abook_id'],
- 'thumb' => $rr['xchan_photo_m'],
- 'name' => $rr['xchan_name'],
- 'classes' => (intval($rr['abook_archived']) ? 'archived' : ''),
- 'link' => z_root() . '/connedit/' . $rr['abook_id'],
- 'deletelink' => z_root() . '/connedit/' . intval($rr['abook_id']) . '/drop',
- 'delete' => t('Delete'),
- 'url' => chanlink_url($rr['xchan_url']),
- 'webbie_label' => t('Channel address'),
- 'webbie' => $rr['xchan_addr'],
- 'network_label' => t('Network'),
- 'network' => network_to_name($rr['xchan_network']),
- 'public_forum' => ((intval($rr['xchan_pubforum'])) ? true : false),
- 'status_label' => t('Status'),
- 'status' => $status_str,
- 'connected_label' => t('Connected'),
- 'connected' => datetime_convert('UTC',date_default_timezone_get(),$rr['abook_created'], 'c'),
- 'approve_hover' => t('Approve connection'),
- 'approve' => (($rr['abook_pending']) ? t('Approve') : false),
- 'ignore_hover' => t('Ignore connection'),
- 'ignore' => ((! $rr['abook_ignored']) ? t('Ignore') : false),
- 'recent_label' => t('Recent activity'),
- 'recentlink' => z_root() . '/network/?f=&cid=' . intval($rr['abook_id'])
- );
- }
- }
- }
-
-
- if($_REQUEST['aj']) {
- if($contacts) {
- $o = replace_macros(get_markup_template('contactsajax.tpl'),array(
- '$contacts' => $contacts,
- '$edit' => t('Edit'),
- ));
- }
- else {
- $o = '<div id="content-complete"></div>';
- }
- echo $o;
- killme();
- }
- else {
- $o .= "<script> var page_query = '" . $_GET['q'] . "'; var extra_args = '" . extra_query_args() . "' ; </script>";
- $o .= replace_macros(get_markup_template('connections.tpl'),array(
- '$header' => t('Connections') . (($head) ? ': ' . $head : ''),
- '$tabs' => $tabs,
- '$total' => $total,
- '$search' => $search_hdr,
- '$label' => t('Search'),
- '$desc' => t('Search your connections'),
- '$finding' => (($searching) ? t('Connections search') . ": '" . $search . "'" : ""),
- '$submit' => t('Find'),
- '$edit' => t('Edit'),
- '$cmd' => App::$cmd,
- '$contacts' => $contacts,
- '$paginate' => paginate($a),
-
- ));
- }
-
- if(! $contacts)
- $o .= '<div id="content-complete"></div>';
-
- return $o;
-}
diff --git a/mod/connedit.php b/mod/connedit.php
deleted file mode 100644
index f57fdefc6..000000000
--- a/mod/connedit.php
+++ /dev/null
@@ -1,756 +0,0 @@
-<?php
-
-/* @file connedit.php
- * @brief In this file the connection-editor form is generated and evaluated.
- *
- *
- */
-
-require_once('include/Contact.php');
-require_once('include/socgraph.php');
-require_once('include/contact_selectors.php');
-require_once('include/group.php');
-require_once('include/contact_widgets.php');
-require_once('include/zot.php');
-require_once('include/widgets.php');
-
-/* @brief Initialize the connection-editor
- *
- *
- */
-
-function connedit_init(&$a) {
-
- if(! local_channel())
- return;
-
- if((argc() >= 2) && intval(argv(1))) {
- $r = q("SELECT abook.*, xchan.*
- FROM abook left join xchan on abook_xchan = xchan_hash
- WHERE abook_channel = %d and abook_id = %d LIMIT 1",
- intval(local_channel()),
- intval(argv(1))
- );
- if($r) {
- App::$poi = $r[0];
- }
- }
-
- $channel = App::get_channel();
- if($channel)
- head_set_icon($channel['xchan_photo_s']);
-
-}
-
-/* @brief Evaluate posted values and set changes
- *
- */
-
-function connedit_post(&$a) {
-
- if(! local_channel())
- return;
-
- $contact_id = intval(argv(1));
- if(! $contact_id)
- return;
-
- $channel = App::get_channel();
-
- // TODO if configured for hassle-free permissions, we'll post the form with ajax as soon as the
- // connection enable is toggled to a special autopost url and set permissions immediately, leaving
- // the other form elements alone pending a manual submit of the form. The downside is that there
- // will be a window of opportunity when the permissions have been set but before you've had a chance
- // to review and possibly restrict them. The upside is we won't have to warn you that your connection
- // can't do anything until you save the bloody form.
-
- $autopost = (((argc() > 2) && (argv(2) === 'auto')) ? true : false);
-
- $orig_record = q("SELECT * FROM abook WHERE abook_id = %d AND abook_channel = %d LIMIT 1",
- intval($contact_id),
- intval(local_channel())
- );
-
- if(! $orig_record) {
- notice( t('Could not access contact record.') . EOL);
- goaway(z_root() . '/connections');
- return; // NOTREACHED
- }
-
- call_hooks('contact_edit_post', $_POST);
-
- if(intval($orig_record[0]['abook_self'])) {
- $autoperms = intval($_POST['autoperms']);
- $is_self = true;
- }
- else {
- $autoperms = null;
- $is_self = false;
- }
-
-
- $profile_id = $_POST['profile_assign'];
- if($profile_id) {
- $r = q("SELECT profile_guid FROM profile WHERE profile_guid = '%s' AND `uid` = %d LIMIT 1",
- dbesc($profile_id),
- intval(local_channel())
- );
- if(! count($r)) {
- notice( t('Could not locate selected profile.') . EOL);
- return;
- }
- }
-
- $abook_incl = escape_tags($_POST['abook_incl']);
- $abook_excl = escape_tags($_POST['abook_excl']);
-
- $hidden = intval($_POST['hidden']);
-
- $priority = intval($_POST['poll']);
- if($priority > 5 || $priority < 0)
- $priority = 0;
-
- $closeness = intval($_POST['closeness']);
- if($closeness < 0)
- $closeness = 99;
-
- $rating = intval($_POST['rating']);
- if($rating < (-10))
- $rating = (-10);
- if($rating > 10)
- $rating = 10;
-
- $rating_text = trim(escape_tags($_REQUEST['rating_text']));
-
- $abook_my_perms = 0;
-
- foreach($_POST as $k => $v) {
- if(strpos($k,'perms_') === 0) {
- $abook_my_perms += $v;
- }
- }
-
- $new_friend = false;
-
- if(! $is_self) {
-
- $signed = $orig_record[0]['abook_xchan'] . '.' . $rating . '.' . $rating_text;
-
- $sig = base64url_encode(rsa_sign($signed,$channel['channel_prvkey']));
-
- $z = q("select * from xlink where xlink_xchan = '%s' and xlink_link = '%s' and xlink_static = 1 limit 1",
- dbesc($channel['channel_hash']),
- dbesc($orig_record[0]['abook_xchan'])
- );
-
- if($z) {
- $record = $z[0]['xlink_id'];
- $w = q("update xlink set xlink_rating = '%d', xlink_rating_text = '%s', xlink_sig = '%s', xlink_updated = '%s'
- where xlink_id = %d",
- intval($rating),
- dbesc($rating_text),
- dbesc($sig),
- dbesc(datetime_convert()),
- intval($record)
- );
- }
- else {
- $w = q("insert into xlink ( xlink_xchan, xlink_link, xlink_rating, xlink_rating_text, xlink_sig, xlink_updated, xlink_static ) values ( '%s', '%s', %d, '%s', '%s', '%s', 1 ) ",
- dbesc($channel['channel_hash']),
- dbesc($orig_record[0]['abook_xchan']),
- intval($rating),
- dbesc($rating_text),
- dbesc($sig),
- dbesc(datetime_convert())
- );
- $z = q("select * from xlink where xlink_xchan = '%s' and xlink_link = '%s' and xlink_static = 1 limit 1",
- dbesc($channel['channel_hash']),
- dbesc($orig_record[0]['abook_xchan'])
- );
- if($z)
- $record = $z[0]['xlink_id'];
- }
- if($record) {
- proc_run('php','include/ratenotif.php','rating',$record);
- }
- }
-
- if(($_REQUEST['pending']) && intval($orig_record[0]['abook_pending'])) {
- $new_friend = true;
-
- // @fixme it won't be common, but when you accept a new connection request
- // the permissions will now be that of your permissions role and ignore
- // any you may have set manually on the form. We'll probably see a bug if somebody
- // tries to set the permissions *and* approve the connection in the same
- // request. The workaround is to approve the connection, then go back and
- // adjust permissions as desired.
-
- $abook_my_perms = get_channel_default_perms(local_channel());
-
- $role = get_pconfig(local_channel(),'system','permissions_role');
- if($role) {
- $x = get_role_perms($role);
- if($x['perms_accept'])
- $abook_my_perms = $x['perms_accept'];
- }
- }
-
- $abook_pending = (($new_friend) ? 0 : $orig_record[0]['abook_pending']);
-
- $r = q("UPDATE abook SET abook_profile = '%s', abook_my_perms = %d , abook_closeness = %d, abook_pending = %d,
- abook_incl = '%s', abook_excl = '%s'
- where abook_id = %d AND abook_channel = %d",
- dbesc($profile_id),
- intval($abook_my_perms),
- intval($closeness),
- intval($abook_pending),
- dbesc($abook_incl),
- dbesc($abook_excl),
- intval($contact_id),
- intval(local_channel())
- );
-
- if($orig_record[0]['abook_profile'] != $profile_id) {
- //Update profile photo permissions
-
- logger('A new profile was assigned - updating profile photos');
- require_once('mod/profile_photo.php');
- profile_photo_set_profile_perms($profile_id);
-
- }
-
- if($r)
- info( t('Connection updated.') . EOL);
- else
- notice( t('Failed to update connection record.') . EOL);
-
- if(App::$poi && App::$poi['abook_my_perms'] != $abook_my_perms
- && (! intval(App::$poi['abook_self']))) {
- proc_run('php', 'include/notifier.php', (($new_friend) ? 'permission_create' : 'permission_update'), $contact_id);
- }
-
- if($new_friend) {
- $default_group = $channel['channel_default_group'];
- if($default_group) {
- require_once('include/group.php');
- $g = group_rec_byhash(local_channel(),$default_group);
- if($g)
- group_add_member(local_channel(),'',App::$poi['abook_xchan'],$g['id']);
- }
-
- // Check if settings permit ("post new friend activity" is allowed, and
- // friends in general or this friend in particular aren't hidden)
- // and send out a new friend activity
-
- $pr = q("select * from profile where uid = %d and is_default = 1 and hide_friends = 0",
- intval($channel['channel_id'])
- );
- if(($pr) && (! intval($orig_record[0]['abook_hidden'])) && (intval(get_pconfig($channel['channel_id'],'system','post_newfriend')))) {
- $xarr = array();
- $xarr['verb'] = ACTIVITY_FRIEND;
- $xarr['item_wall'] = 1;
- $xarr['item_origin'] = 1;
- $xarr['item_thread_top'] = 1;
- $xarr['owner_xchan'] = $xarr['author_xchan'] = $channel['channel_hash'];
- $xarr['allow_cid'] = $channel['channel_allow_cid'];
- $xarr['allow_gid'] = $channel['channel_allow_gid'];
- $xarr['deny_cid'] = $channel['channel_deny_cid'];
- $xarr['deny_gid'] = $channel['channel_deny_gid'];
- $xarr['item_private'] = (($xarr['allow_cid']||$xarr['allow_gid']||$xarr['deny_cid']||$xarr['deny_gid']) ? 1 : 0);
- $obj = array(
- 'type' => ACTIVITY_OBJ_PERSON,
- 'title' => App::$poi['xchan_name'],
- 'id' => App::$poi['xchan_hash'],
- 'link' => array(
- array('rel' => 'alternate', 'type' => 'text/html', 'href' => App::$poi['xchan_url']),
- array('rel' => 'photo', 'type' => App::$poi['xchan_photo_mimetype'], 'href' => App::$poi['xchan_photo_l'])
- ),
- );
- $xarr['object'] = json_encode($obj);
- $xarr['obj_type'] = ACTIVITY_OBJ_PERSON;
-
- $xarr['body'] = '[zrl=' . $channel['xchan_url'] . ']' . $channel['xchan_name'] . '[/zrl]' . ' ' . t('is now connected to') . ' ' . '[zrl=' . App::$poi['xchan_url'] . ']' . App::$poi['xchan_name'] . '[/zrl]';
-
- $xarr['body'] .= "\n\n\n" . '[zrl=' . App::$poi['xchan_url'] . '][zmg=80x80]' . App::$poi['xchan_photo_m'] . '[/zmg][/zrl]';
-
- post_activity_item($xarr);
-
- }
-
-
- // pull in a bit of content if there is any to pull in
- proc_run('php','include/onepoll.php',$contact_id);
-
- }
-
- // Refresh the structure in memory with the new data
-
- $r = q("SELECT abook.*, xchan.*
- FROM abook left join xchan on abook_xchan = xchan_hash
- WHERE abook_channel = %d and abook_id = %d LIMIT 1",
- intval(local_channel()),
- intval($contact_id)
- );
- if($r) {
- App::$poi = $r[0];
- }
-
- if($new_friend) {
- $arr = array('channel_id' => local_channel(), 'abook' => App::$poi);
- call_hooks('accept_follow', $arr);
- }
-
- if(! is_null($autoperms))
- set_pconfig(local_channel(),'system','autoperms',(($autoperms) ? $abook_my_perms : 0));
-
- connedit_clone($a);
-
- if(($_REQUEST['pending']) && (!$_REQUEST['done']))
- goaway(z_root() . '/connections/ifpending');
-
- return;
-
-}
-
-/* @brief Clone connection
- *
- *
- */
-
-function connedit_clone(&$a) {
-
- if(! App::$poi)
- return;
-
-
- $channel = App::get_channel();
-
- $r = q("SELECT abook.*, xchan.*
- FROM abook left join xchan on abook_xchan = xchan_hash
- WHERE abook_channel = %d and abook_id = %d LIMIT 1",
- intval(local_channel()),
- intval(App::$poi['abook_id'])
- );
- if($r) {
- App::$poi = $r[0];
- }
-
- $clone = App::$poi;
-
- unset($clone['abook_id']);
- unset($clone['abook_account']);
- unset($clone['abook_channel']);
-
- $abconfig = load_abconfig($channel['channel_hash'],$clone['abook_xchan']);
- if($abconfig)
- $clone['abconfig'] = $abconfig;
-
- build_sync_packet(0 /* use the current local_channel */, array('abook' => array($clone)));
-}
-
-/* @brief Generate content of connection edit page
- *
- *
- */
-
-function connedit_content(&$a) {
-
- $sort_type = 0;
- $o = '';
-
- if(! local_channel()) {
- notice( t('Permission denied.') . EOL);
- return login();
- }
-
- $channel = App::get_channel();
- $my_perms = get_channel_default_perms(local_channel());
- $role = get_pconfig(local_channel(),'system','permissions_role');
- if($role) {
- $x = get_role_perms($role);
- if($x['perms_accept'])
- $my_perms = $x['perms_accept'];
- }
-
- $yes_no = array(t('No'),t('Yes'));
-
- if($my_perms) {
- $o .= "<script>function connectDefaultShare() {
- \$('.abook-edit-me').each(function() {
- if(! $(this).is(':disabled'))
- $(this).prop('checked', false);
- });\n\n";
- $perms = get_perms();
- foreach($perms as $p => $v) {
- if($my_perms & $v[1]) {
- $o .= "\$('#me_id_perms_" . $p . "').prop('checked', true); \n";
- }
- }
- $o .= " }\n</script>\n";
- }
-
- if(argc() == 3) {
-
- $contact_id = intval(argv(1));
- if(! $contact_id)
- return;
-
- $cmd = argv(2);
-
- $orig_record = q("SELECT abook.*, xchan.* FROM abook left join xchan on abook_xchan = xchan_hash
- WHERE abook_id = %d AND abook_channel = %d AND abook_self = 0 LIMIT 1",
- intval($contact_id),
- intval(local_channel())
- );
-
- if(! count($orig_record)) {
- notice( t('Could not access address book record.') . EOL);
- goaway(z_root() . '/connections');
- }
-
- if($cmd === 'update') {
- // pull feed and consume it, which should subscribe to the hub.
- proc_run('php',"include/poller.php","$contact_id");
- goaway(z_root() . '/connedit/' . $contact_id);
-
- }
-
- if($cmd === 'refresh') {
- if($orig_record[0]['xchan_network'] === 'zot') {
- if(! zot_refresh($orig_record[0],App::get_channel()))
- notice( t('Refresh failed - channel is currently unavailable.') );
- }
- else {
-
- // if you are on a different network we'll force a refresh of the connection basic info
- proc_run('php','include/notifier.php','permission_update',$contact_id);
- }
- goaway(z_root() . '/connedit/' . $contact_id);
- }
-
- if($cmd === 'block') {
- if(abook_toggle_flag($orig_record[0],ABOOK_FLAG_BLOCKED)) {
- connedit_clone($a);
- }
- else
- notice(t('Unable to set address book parameters.') . EOL);
- goaway(z_root() . '/connedit/' . $contact_id);
- }
-
- if($cmd === 'ignore') {
- if(abook_toggle_flag($orig_record[0],ABOOK_FLAG_IGNORED)) {
- connedit_clone($a);
- }
- else
- notice(t('Unable to set address book parameters.') . EOL);
- goaway(z_root() . '/connedit/' . $contact_id);
- }
-
- if($cmd === 'archive') {
- if(abook_toggle_flag($orig_record[0],ABOOK_FLAG_ARCHIVED)) {
- connedit_clone($a);
- }
- else
- notice(t('Unable to set address book parameters.') . EOL);
- goaway(z_root() . '/connedit/' . $contact_id);
- }
-
- if($cmd === 'hide') {
- if(abook_toggle_flag($orig_record[0],ABOOK_FLAG_HIDDEN)) {
- connedit_clone($a);
- }
- else
- notice(t('Unable to set address book parameters.') . EOL);
- goaway(z_root() . '/connedit/' . $contact_id);
- }
-
- // We'll prevent somebody from unapproving an already approved contact.
- // Though maybe somebody will want this eventually (??)
-
- if($cmd === 'approve') {
- if(intval($orig_record[0]['abook_pending'])) {
- if(abook_toggle_flag($orig_record[0],ABOOK_FLAG_PENDING)) {
- connedit_clone($a);
- }
- else
- notice(t('Unable to set address book parameters.') . EOL);
- }
- goaway(z_root() . '/connedit/' . $contact_id);
- }
-
-
- if($cmd === 'drop') {
-
- require_once('include/Contact.php');
-
-// FIXME
-// We need to send either a purge or a refresh packet to the other side (the channel being unfriended).
-// The issue is that the abook DB record _may_ get destroyed when we call contact_remove. As the notifier runs
-// in the background there could be a race condition preventing this packet from being sent in all cases.
-// PLACEHOLDER
-
- contact_remove(local_channel(), $orig_record[0]['abook_id']);
- build_sync_packet(0 /* use the current local_channel */,
- array('abook' => array(array(
- 'abook_xchan' => $orig_record[0]['abook_xchan'],
- 'entry_deleted' => true))
- )
- );
-
- info( t('Connection has been removed.') . EOL );
- if(x($_SESSION,'return_url'))
- goaway(z_root() . '/' . $_SESSION['return_url']);
- goaway(z_root() . '/contacts');
-
- }
- }
-
- if(App::$poi) {
-
- $contact_id = App::$poi['abook_id'];
- $contact = App::$poi;
-
- $buttons = array(
-
- 'view' => array(
- 'label' => t('View Profile'),
- 'url' => chanlink_cid($contact['abook_id']),
- 'sel' => '',
- 'title' => sprintf( t('View %s\'s profile'), $contact['xchan_name']),
- ),
-
- 'refresh' => array(
- 'label' => t('Refresh Permissions'),
- 'url' => z_root() . '/connedit/' . $contact['abook_id'] . '/refresh',
- 'sel' => '',
- 'title' => t('Fetch updated permissions'),
- ),
-
- 'recent' => array(
- 'label' => t('Recent Activity'),
- 'url' => z_root() . '/network/?f=&cid=' . $contact['abook_id'],
- 'sel' => '',
- 'title' => t('View recent posts and comments'),
- ),
-
- 'block' => array(
- 'label' => (intval($contact['abook_blocked']) ? t('Unblock') : t('Block')),
- 'url' => z_root() . '/connedit/' . $contact['abook_id'] . '/block',
- 'sel' => (intval($contact['abook_blocked']) ? 'active' : ''),
- 'title' => t('Block (or Unblock) all communications with this connection'),
- 'info' => (intval($contact['abook_blocked']) ? t('This connection is blocked!') : ''),
- ),
-
- 'ignore' => array(
- 'label' => (intval($contact['abook_ignored']) ? t('Unignore') : t('Ignore')),
- 'url' => z_root() . '/connedit/' . $contact['abook_id'] . '/ignore',
- 'sel' => (intval($contact['abook_ignored']) ? 'active' : ''),
- 'title' => t('Ignore (or Unignore) all inbound communications from this connection'),
- 'info' => (intval($contact['abook_ignored']) ? t('This connection is ignored!') : ''),
- ),
-
- 'archive' => array(
- 'label' => (intval($contact['abook_archived']) ? t('Unarchive') : t('Archive')),
- 'url' => z_root() . '/connedit/' . $contact['abook_id'] . '/archive',
- 'sel' => (intval($contact['abook_archived']) ? 'active' : ''),
- 'title' => t('Archive (or Unarchive) this connection - mark channel dead but keep content'),
- 'info' => (intval($contact['abook_archived']) ? t('This connection is archived!') : ''),
- ),
-
- 'hide' => array(
- 'label' => (intval($contact['abook_hidden']) ? t('Unhide') : t('Hide')),
- 'url' => z_root() . '/connedit/' . $contact['abook_id'] . '/hide',
- 'sel' => (intval($contact['abook_hidden']) ? 'active' : ''),
- 'title' => t('Hide or Unhide this connection from your other connections'),
- 'info' => (intval($contact['abook_hidden']) ? t('This connection is hidden!') : ''),
- ),
-
- 'delete' => array(
- 'label' => t('Delete'),
- 'url' => z_root() . '/connedit/' . $contact['abook_id'] . '/drop',
- 'sel' => '',
- 'title' => t('Delete this connection'),
- ),
-
- );
-
- $self = false;
-
- if(intval($contact['abook_self']))
- $self = true;
-
- require_once('include/contact_selectors.php');
-
- $tpl = get_markup_template("abook_edit.tpl");
-
- if(feature_enabled(local_channel(),'affinity')) {
-
- $labels = array(
- t('Me'),
- t('Family'),
- t('Friends'),
- t('Acquaintances'),
- t('All')
- );
- call_hooks('affinity_labels',$labels);
- $label_str = '';
-
- if($labels) {
- foreach($labels as $l) {
- if($label_str) {
- $label_str .= ", '|'";
- $label_str .= ", '" . $l . "'";
- }
- else
- $label_str .= "'" . $l . "'";
- }
- }
-
- $slider_tpl = get_markup_template('contact_slider.tpl');
- $slide = replace_macros($slider_tpl,array(
- '$min' => 1,
- '$val' => (($contact['abook_closeness']) ? $contact['abook_closeness'] : 99),
- '$labels' => $label_str,
- ));
- }
-
- $rating_val = 0;
- $rating_text = '';
-
- $xl = q("select * from xlink where xlink_xchan = '%s' and xlink_link = '%s' and xlink_static = 1",
- dbesc($channel['channel_hash']),
- dbesc($contact['xchan_hash'])
- );
-
- if($xl) {
- $rating_val = intval($xl[0]['xlink_rating']);
- $rating_text = $xl[0]['xlink_rating_text'];
- }
-
- $poco_rating = get_config('system','poco_rating_enable');
-
- // if unset default to enabled
- if($poco_rating === false)
- $poco_rating = true;
-
- if($poco_rating) {
- $rating = replace_macros(get_markup_template('rating_slider.tpl'),array(
- '$min' => -10,
- '$val' => $rating_val
- ));
- }
- else {
- $rating = false;
- }
-
-
- $perms = array();
- $channel = App::get_channel();
-
- $global_perms = get_perms();
- $existing = get_all_perms(local_channel(),$contact['abook_xchan']);
-
- $unapproved = array('pending', t('Approve this connection'), '', t('Accept connection to allow communication'), array(t('No'),('Yes')));
-
- $multiprofs = ((feature_enabled(local_channel(),'multi_profiles')) ? true : false);
-
- if($slide && !$multiprofs)
- $affinity = t('Set Affinity');
-
- if(!$slide && $multiprofs)
- $affinity = t('Set Profile');
-
- if($slide && $multiprofs)
- $affinity = t('Set Affinity & Profile');
-
- foreach($global_perms as $k => $v) {
- $thisperm = (($contact['abook_my_perms'] & $v[1]) ? "1" : '');
- $checkinherited = ((($channel[$v[0]]) && ($channel[$v[0]] != PERMS_SPECIFIC)) ? "1" : '');
-
- // For auto permissions (when $self is true) we don't want to look at existing
- // permissions because they are enabled for the channel owner
- if((! $self) && ($existing[$k]))
- $thisperm = "1";
-
- $perms[] = array('perms_' . $k, $v[3], (($contact['abook_their_perms'] & $v[1]) ? "1" : ""),$thisperm, $v[1], (($channel[$v[0]] == PERMS_SPECIFIC) ? '' : '1'), $v[4], $checkinherited);
- }
-
- $locstr = '';
-
- $locs = q("select hubloc_addr as location from hubloc left join site on hubloc_url = site_url where hubloc_hash = '%s'
- and hubloc_deleted = 0 and site_dead = 0",
- dbesc($contact['xchan_hash'])
- );
-
- if($locs) {
- foreach($locs as $l) {
- if(!($l['location']))
- continue;
- if(strpos($locstr,$l['location']) !== false)
- continue;
- if(strlen($locstr))
- $locstr .= ', ';
- $locstr .= $l['location'];
- }
- }
- else
- $locstr = t('none');
-
- $o .= replace_macros($tpl,array(
-
- '$header' => (($self) ? t('Connection Default Permissions') : sprintf( t('Connection: %s'),$contact['xchan_name'])),
- '$autoperms' => array('autoperms',t('Apply these permissions automatically'), ((get_pconfig(local_channel(),'system','autoperms')) ? 1 : 0), t('Connection requests will be approved without your interaction'), $yes_no),
- '$addr' => $contact['xchan_addr'],
- '$addr_text' => t('This connection\'s primary address is'),
- '$loc_text' => t('Available locations:'),
- '$locstr' => $locstr,
- '$notself' => (($self) ? '' : '1'),
- '$self' => (($self) ? '1' : ''),
- '$autolbl' => t('The permissions indicated on this page will be applied to all new connections.'),
- '$buttons' => (($self) ? '' : $buttons),
- '$lbl_slider' => t('Slide to adjust your degree of friendship'),
- '$lbl_rating' => t('Rating'),
- '$lbl_rating_label' => t('Slide to adjust your rating'),
- '$lbl_rating_txt' => t('Optionally explain your rating'),
- '$connfilter' => feature_enabled(local_channel(),'connfilter'),
- '$connfilter_label' => t('Custom Filter'),
- '$incl' => array('abook_incl',t('Only import posts with this text'), $contact['abook_incl'],t('words one per line or #tags or /patterns/ or lang=xx, leave blank to import all posts')),
- '$excl' => array('abook_excl',t('Do not import posts with this text'), $contact['abook_excl'],t('words one per line or #tags or /patterns/ or lang=xx, leave blank to import all posts')),
- '$rating_text' => array('rating_text', t('Optionally explain your rating'),$rating_text,''),
- '$rating_info' => t('This information is public!'),
- '$rating' => $rating,
- '$rating_val' => $rating_val,
- '$slide' => $slide,
- '$affinity' => $affinity,
- '$pending_label' => t('Connection Pending Approval'),
- '$is_pending' => (intval($contact['abook_pending']) ? 1 : ''),
- '$unapproved' => $unapproved,
- '$inherited' => t('inherited'),
- '$submit' => t('Submit'),
- '$lbl_vis2' => sprintf( t('Please choose the profile you would like to display to %s when viewing your profile securely.'), $contact['xchan_name']),
- '$close' => $contact['abook_closeness'],
- '$them' => t('Their Settings'),
- '$me' => t('My Settings'),
- '$perms' => $perms,
- '$permlbl' => t('Individual Permissions'),
- '$permnote' => t('Some permissions may be inherited from your channel\'s <a href="settings"><strong>privacy settings</strong></a>, which have higher priority than individual settings. You can <strong>not</strong> change those settings here.'),
- '$permnote_self' => t('Some permissions may be inherited from your channel\'s <a href="settings"><strong>privacy settings</strong></a>, which have higher priority than individual settings. You can change those settings here but they wont have any impact unless the inherited setting changes.'),
- '$lastupdtext' => t('Last update:'),
- '$last_update' => relative_date($contact['abook_connected']),
- '$profile_select' => contact_profile_assign($contact['abook_profile']),
- '$multiprofs' => $multiprofs,
- '$contact_id' => $contact['abook_id'],
- '$name' => $contact['xchan_name'],
-
- ));
-
- $arr = array('contact' => $contact,'output' => $o);
-
- call_hooks('contact_edit', $arr);
-
- return $arr['output'];
-
- }
-
-
-}
diff --git a/mod/contactgroup.php b/mod/contactgroup.php
deleted file mode 100644
index 61ca37054..000000000
--- a/mod/contactgroup.php
+++ /dev/null
@@ -1,49 +0,0 @@
-<?php
-
-require_once('include/group.php');
-
-function contactgroup_content(&$a) {
-
- if(! local_channel()) {
- killme();
- }
-
- if((argc() > 2) && (intval(argv(1))) && (argv(2))) {
- $r = q("SELECT abook_xchan from abook where abook_xchan = '%s' and abook_channel = %d and abook_self = 0 limit 1",
- dbesc(base64url_decode(argv(2))),
- intval(local_channel())
- );
- if($r)
- $change = $r[0]['abook_xchan'];
- }
-
- if((argc() > 1) && (intval(argv(1)))) {
-
- $r = q("SELECT * FROM `groups` WHERE `id` = %d AND `uid` = %d AND `deleted` = 0 LIMIT 1",
- intval(argv(1)),
- intval(local_channel())
- );
- if(! $r) {
- killme();
- }
-
- $group = $r[0];
- $members = group_get_members($group['id']);
- $preselected = array();
- if(count($members)) {
- foreach($members as $member)
- $preselected[] = $member['xchan_hash'];
- }
-
- if($change) {
- if(in_array($change,$preselected)) {
- group_rmv_member(local_channel(),$group['name'],$change);
- }
- else {
- group_add_member(local_channel(),$group['name'],$change);
- }
- }
- }
-
- killme();
-} \ No newline at end of file
diff --git a/mod/cover_photo.php b/mod/cover_photo.php
deleted file mode 100644
index c99fdf7de..000000000
--- a/mod/cover_photo.php
+++ /dev/null
@@ -1,417 +0,0 @@
-<?php
-
-/*
- @file cover_photo.php
- @brief Module-file with functions for handling of cover-photos
-
-*/
-
-require_once('include/photo/photo_driver.php');
-require_once('include/identity.php');
-
-
-
-/* @brief Initalize the cover-photo edit view
- *
- * @param $a Current application
- * @return void
- *
- */
-
-function cover_photo_init(&$a) {
-
- if(! local_channel()) {
- return;
- }
-
- $channel = App::get_channel();
- profile_load($a,$channel['channel_address']);
-
-}
-
-/* @brief Evaluate posted values
- *
- * @param $a Current application
- * @return void
- *
- */
-
-function cover_photo_post(&$a) {
-
- if(! local_channel()) {
- return;
- }
-
- $channel = App::get_channel();
-
- check_form_security_token_redirectOnErr('/cover_photo', 'cover_photo');
-
- if((x($_POST,'cropfinal')) && ($_POST['cropfinal'] == 1)) {
-
- // phase 2 - we have finished cropping
-
- if(argc() != 2) {
- notice( t('Image uploaded but image cropping failed.') . EOL );
- return;
- }
-
- $image_id = argv(1);
-
- if(substr($image_id,-2,1) == '-') {
- $scale = substr($image_id,-1,1);
- $image_id = substr($image_id,0,-2);
- }
-
-
- $srcX = $_POST['xstart'];
- $srcY = $_POST['ystart'];
- $srcW = $_POST['xfinal'] - $srcX;
- $srcH = $_POST['yfinal'] - $srcY;
-
-
- $r = q("select gender from profile where uid = %d and is_default = 1 limit 1",
- intval(local_channel())
- );
- if($r) {
- $profile = $r[0];
- }
-
- $r = q("SELECT * FROM photo WHERE resource_id = '%s' AND uid = %d AND scale = 0 LIMIT 1",
- dbesc($image_id),
- intval(local_channel())
- );
-
- if($r) {
-
- $base_image = $r[0];
- $base_image['data'] = (($r[0]['os_storage']) ? @file_get_contents($base_image['data']) : dbunescbin($base_image['data']));
-
- $im = photo_factory($base_image['data'], $base_image['type']);
- if($im->is_valid()) {
-
- // We are scaling and cropping the relative pixel locations to the original photo instead of the
- // scaled photo we operated on.
-
- // First load the scaled photo to check its size. (Should probably pass this in the post form and save
- // a query.)
-
- $g = q("select width, height from photo where resource_id = '%s' and uid = %d and scale = 3",
- dbesc($image_id),
- intval(local_channel())
- );
-
-
- $scaled_width = $g[0]['width'];
- $scaled_height = $g[0]['height'];
-
- if((! $scaled_width) || (! $scaled_height)) {
- logger('potential divide by zero scaling cover photo');
- return;
- }
-
- // unset all other cover photos
-
- q("update photo set photo_usage = %d where photo_usage = %d and uid = %d",
- intval(PHOTO_NORMAL),
- intval(PHOTO_COVER),
- intval(local_channel())
- );
-
- $orig_srcx = ( $r[0]['width'] / $scaled_width ) * $srcX;
- $orig_srcy = ( $r[0]['height'] / $scaled_height ) * $srcY;
- $orig_srcw = ( $srcW / $scaled_width ) * $r[0]['width'];
- $orig_srch = ( $srcH / $scaled_height ) * $r[0]['height'];
-
- $im->cropImageRect(1200,435,$orig_srcx, $orig_srcy, $orig_srcw, $orig_srch);
-
- $aid = get_account_id();
-
- $p = array('aid' => $aid, 'uid' => local_channel(), 'resource_id' => $base_image['resource_id'],
- 'filename' => $base_image['filename'], 'album' => t('Cover Photos'));
-
- $p['scale'] = 7;
- $p['photo_usage'] = PHOTO_COVER;
-
- $r1 = $im->save($p);
-
- $im->doScaleImage(850,310);
- $p['scale'] = 8;
-
- $r2 = $im->save($p);
-
-
- $im->doScaleImage(425,160);
- $p['scale'] = 9;
-
- $r3 = $im->save($p);
-
- if($r1 === false || $r2 === false || $r3 === false) {
- // if one failed, delete them all so we can start over.
- notice( t('Image resize failed.') . EOL );
- $x = q("delete from photo where resource_id = '%s' and uid = %d and scale >= 7 ",
- dbesc($base_image['resource_id']),
- local_channel()
- );
- return;
- }
-
- $channel = App::get_channel();
- send_cover_photo_activity($channel,$base_image,$profile);
-
-
- }
- else
- notice( t('Unable to process image') . EOL);
- }
-
- goaway(z_root() . '/channel/' . $channel['channel_address']);
-
- }
-
-
- $hash = photo_new_resource();
- $smallest = 0;
-
- require_once('include/attach.php');
-
- $res = attach_store(App::get_channel(), get_observer_hash(), '', array('album' => t('Cover Photos'), 'hash' => $hash));
-
- logger('attach_store: ' . print_r($res,true));
-
- if($res && intval($res['data']['is_photo'])) {
- $i = q("select * from photo where resource_id = '%s' and uid = %d and scale = 0",
- dbesc($hash),
- intval(local_channel())
- );
-
- if(! $i) {
- notice( t('Image upload failed.') . EOL );
- return;
- }
- $os_storage = false;
-
- foreach($i as $ii) {
- $smallest = intval($ii['scale']);
- $os_storage = intval($ii['os_storage']);
- $imagedata = $ii['data'];
- $filetype = $ii['type'];
-
- }
- }
-
- $imagedata = (($os_storage) ? @file_get_contents($imagedata) : $imagedata);
- $ph = photo_factory($imagedata, $filetype);
-
- if(! $ph->is_valid()) {
- notice( t('Unable to process image.') . EOL );
- return;
- }
-
- return cover_photo_crop_ui_head($a, $ph, $hash, $smallest);
-
-}
-
-function send_cover_photo_activity($channel,$photo,$profile) {
-
- $arr = array();
- $arr['item_thread_top'] = 1;
- $arr['item_origin'] = 1;
- $arr['item_wall'] = 1;
- $arr['obj_type'] = ACTIVITY_OBJ_PHOTO;
- $arr['verb'] = ACTIVITY_UPDATE;
-
- $arr['object'] = json_encode(array(
- 'type' => $arr['obj_type'],
- 'id' => z_root() . '/photo/' . $photo['resource_id'] . '-7',
- 'link' => array('rel' => 'photo', 'type' => $photo['type'], 'href' => z_root() . '/photo/' . $photo['resource_id'] . '-7')
- ));
-
- if($profile && stripos($profile['gender'],t('female')) !== false)
- $t = t('%1$s updated her %2$s');
- elseif($profile && stripos($profile['gender'],t('male')) !== false)
- $t = t('%1$s updated his %2$s');
- else
- $t = t('%1$s updated their %2$s');
-
- $ptext = '[zrl=' . z_root() . '/photos/' . $channel['channel_address'] . '/image/' . $photo['resource_id'] . ']' . t('cover photo') . '[/zrl]';
-
- $ltext = '[zrl=' . z_root() . '/profile/' . $channel['channel_address'] . ']' . '[zmg]' . z_root() . '/photo/' . $photo['resource_id'] . '-8[/zmg][/zrl]';
-
- $arr['body'] = sprintf($t,$channel['channel_name'],$ptext) . "\n\n" . $ltext;
-
- $acl = new Zotlabs\Access\AccessList($channel);
- $x = $acl->get();
- $arr['allow_cid'] = $x['allow_cid'];
-
- $arr['allow_gid'] = $x['allow_gid'];
- $arr['deny_cid'] = $x['deny_cid'];
- $arr['deny_gid'] = $x['deny_gid'];
-
- $arr['uid'] = $channel['channel_id'];
- $arr['aid'] = $channel['channel_account_id'];
-
- $arr['owner_xchan'] = $channel['channel_hash'];
- $arr['author_xchan'] = $channel['channel_hash'];
-
- post_activity_item($arr);
-
-
-}
-
-
-/* @brief Generate content of profile-photo view
- *
- * @param $a Current application
- * @return void
- *
- */
-
-
-function cover_photo_content(&$a) {
-
- if(! local_channel()) {
- notice( t('Permission denied.') . EOL );
- return;
- }
-
- $channel = App::get_channel();
-
- $newuser = false;
-
- if(argc() == 2 && argv(1) === 'new')
- $newuser = true;
-
- if(argv(1) === 'use') {
- if (argc() < 3) {
- notice( t('Permission denied.') . EOL );
- return;
- };
-
-// check_form_security_token_redirectOnErr('/cover_photo', 'cover_photo');
-
- $resource_id = argv(2);
-
- $r = q("SELECT id, album, scale FROM photo WHERE uid = %d AND resource_id = '%s' ORDER BY scale ASC",
- intval(local_channel()),
- dbesc($resource_id)
- );
- if(! $r) {
- notice( t('Photo not available.') . EOL );
- return;
- }
- $havescale = false;
- foreach($r as $rr) {
- if($rr['scale'] == 7)
- $havescale = true;
- }
-
- $r = q("SELECT `data`, `type`, resource_id, os_storage FROM photo WHERE id = %d and uid = %d limit 1",
- intval($r[0]['id']),
- intval(local_channel())
-
- );
- if(! $r) {
- notice( t('Photo not available.') . EOL );
- return;
- }
-
- if(intval($r[0]['os_storage']))
- $data = @file_get_contents($r[0]['data']);
- else
- $data = dbunescbin($r[0]['data']);
-
- $ph = photo_factory($data, $r[0]['type']);
- $smallest = 0;
- if($ph->is_valid()) {
- // go ahead as if we have just uploaded a new photo to crop
- $i = q("select resource_id, scale from photo where resource_id = '%s' and uid = %d and scale = 0",
- dbesc($r[0]['resource_id']),
- intval(local_channel())
- );
-
- if($i) {
- $hash = $i[0]['resource_id'];
- foreach($i as $ii) {
- $smallest = intval($ii['scale']);
- }
- }
- }
-
- cover_photo_crop_ui_head($a, $ph, $hash, $smallest);
- }
-
-
- if(! x(App::$data,'imagecrop')) {
-
- $tpl = get_markup_template('cover_photo.tpl');
-
- $o .= replace_macros($tpl,array(
- '$user' => App::$channel['channel_address'],
- '$lbl_upfile' => t('Upload File:'),
- '$lbl_profiles' => t('Select a profile:'),
- '$title' => t('Upload Cover Photo'),
- '$submit' => t('Upload'),
- '$profiles' => $profiles,
- '$form_security_token' => get_form_security_token("cover_photo"),
-// FIXME - yuk
- '$select' => sprintf('%s %s', t('or'), ($newuser) ? '<a href="' . z_root() . '">' . t('skip this step') . '</a>' : '<a href="'. z_root() . '/photos/' . App::$channel['channel_address'] . '">' . t('select a photo from your photo albums') . '</a>')
- ));
-
- call_hooks('cover_photo_content_end', $o);
-
- return $o;
- }
- else {
- $filename = App::$data['imagecrop'] . '-3';
- $resolution = 3;
- $tpl = get_markup_template("cropcover.tpl");
- $o .= replace_macros($tpl,array(
- '$filename' => $filename,
- '$profile' => intval($_REQUEST['profile']),
- '$resource' => App::$data['imagecrop'] . '-3',
- '$image_url' => z_root() . '/photo/' . $filename,
- '$title' => t('Crop Image'),
- '$desc' => t('Please adjust the image cropping for optimum viewing.'),
- '$form_security_token' => get_form_security_token("cover_photo"),
- '$done' => t('Done Editing')
- ));
- return $o;
- }
-
- return; // NOTREACHED
-}
-
-/* @brief Generate the UI for photo-cropping
- *
- * @param $a Current application
- * @param $ph Photo-Factory
- * @return void
- *
- */
-
-
-
-function cover_photo_crop_ui_head(&$a, $ph, $hash, $smallest){
-
- $max_length = get_config('system','max_image_length');
- if(! $max_length)
- $max_length = MAX_IMAGE_LENGTH;
- if($max_length > 0)
- $ph->scaleImage($max_length);
-
- $width = $ph->getWidth();
- $height = $ph->getHeight();
-
- if($width < 300 || $height < 300) {
- $ph->scaleImageUp(240);
- $width = $ph->getWidth();
- $height = $ph->getHeight();
- }
-
-
- App::$data['imagecrop'] = $hash;
- App::$data['imagecrop_resolution'] = $smallest;
- App::$page['htmlhead'] .= replace_macros(get_markup_template("crophead.tpl"), array());
- return;
-}
-
diff --git a/mod/dav.php b/mod/dav.php
deleted file mode 100644
index e2a857dca..000000000
--- a/mod/dav.php
+++ /dev/null
@@ -1,142 +0,0 @@
-<?php
-/**
- * @file mod/dav.php
- * @brief Initialize Hubzilla's cloud (SabreDAV).
- *
- * Module for accessing the DAV storage area from a DAV client.
- */
-
-use Sabre\DAV;
-use Zotlabs\Storage;
-
-// composer autoloader for SabreDAV
-require_once('vendor/autoload.php');
-
-// workaround for HTTP-auth in CGI mode
-if (x($_SERVER, 'REDIRECT_REMOTE_USER')) {
- $userpass = base64_decode(substr($_SERVER["REDIRECT_REMOTE_USER"], 6)) ;
- if(strlen($userpass)) {
- list($name, $password) = explode(':', $userpass);
- $_SERVER['PHP_AUTH_USER'] = $name;
- $_SERVER['PHP_AUTH_PW'] = $password;
- }
-}
-
-if (x($_SERVER, 'HTTP_AUTHORIZATION')) {
- $userpass = base64_decode(substr($_SERVER["HTTP_AUTHORIZATION"], 6)) ;
- if(strlen($userpass)) {
- list($name, $password) = explode(':', $userpass);
- $_SERVER['PHP_AUTH_USER'] = $name;
- $_SERVER['PHP_AUTH_PW'] = $password;
- }
-}
-
-/**
- * @brief Fires up the SabreDAV server.
- *
- * @param App &$a
- */
-function dav_init(&$a) {
-
- require_once('include/reddav.php');
-
- if (! is_dir('store'))
- os_mkdir('store', STORAGE_DEFAULT_PERMISSIONS, false);
-
- $which = null;
- if (argc() > 1)
- $which = argv(1);
-
- $profile = 0;
-
- App::$page['htmlhead'] .= '<link rel="alternate" type="application/atom+xml" href="' . z_root() . '/feed/' . $which . '" />' . "\r\n";
-
- if ($which)
- profile_load($a, $which, $profile);
-
- $auth = new Zotlabs\Storage\BasicAuth();
-
- $ob_hash = get_observer_hash();
-
- if ($ob_hash) {
- if (local_channel()) {
- $channel = App::get_channel();
- $auth->setCurrentUser($channel['channel_address']);
- $auth->channel_id = $channel['channel_id'];
- $auth->channel_hash = $channel['channel_hash'];
- $auth->channel_account_id = $channel['channel_account_id'];
- if($channel['channel_timezone'])
- $auth->setTimezone($channel['channel_timezone']);
- }
- $auth->observer = $ob_hash;
- }
-
- if ($_GET['davguest'])
- $_SESSION['davguest'] = true;
-
- $_SERVER['QUERY_STRING'] = str_replace(array('?f=', '&f='), array('', ''), $_SERVER['QUERY_STRING']);
- $_SERVER['QUERY_STRING'] = strip_zids($_SERVER['QUERY_STRING']);
- $_SERVER['QUERY_STRING'] = preg_replace('/[\?&]davguest=(.*?)([\?&]|$)/ism', '', $_SERVER['QUERY_STRING']);
-
- $_SERVER['REQUEST_URI'] = str_replace(array('?f=', '&f='), array('', ''), $_SERVER['REQUEST_URI']);
- $_SERVER['REQUEST_URI'] = strip_zids($_SERVER['REQUEST_URI']);
- $_SERVER['REQUEST_URI'] = preg_replace('/[\?&]davguest=(.*?)([\?&]|$)/ism', '', $_SERVER['REQUEST_URI']);
-
- $rootDirectory = new Zotlabs\Storage\Directory('/', $auth);
-
- // A SabreDAV server-object
- $server = new DAV\Server($rootDirectory);
- // prevent overwriting changes each other with a lock backend
- $lockBackend = new DAV\Locks\Backend\File('store/[data]/locks');
- $lockPlugin = new DAV\Locks\Plugin($lockBackend);
-
- $server->addPlugin($lockPlugin);
-
- // The next section of code allows us to bypass prompting for http-auth if a
- // FILE is being accessed anonymously and permissions allow this. This way
- // one can create hotlinks to public media files in their cloud and anonymous
- // viewers won't get asked to login.
- // If a DIRECTORY is accessed or there are permission issues accessing the
- // file and we aren't previously authenticated via zot, prompt for HTTP-auth.
- // This will be the default case for mounting a DAV directory.
- // In order to avoid prompting for passwords for viewing a DIRECTORY, add
- // the URL query parameter 'davguest=1'.
-
- $isapublic_file = false;
- $davguest = ((x($_SESSION, 'davguest')) ? true : false);
-
- if ((! $auth->observer) && ($_SERVER['REQUEST_METHOD'] === 'GET')) {
- try {
- $x = RedFileData('/' . App::$cmd, $auth);
- if($x instanceof Zotlabs\Storage\File)
- $isapublic_file = true;
- }
- catch (Exception $e) {
- $isapublic_file = false;
- }
- }
-
- if ((! $auth->observer) && (! $isapublic_file) && (! $davguest)) {
- try {
- $auth->Authenticate($server, t('$Projectname channel'));
- }
- catch (Exception $e) {
- logger('mod_cloud: auth exception' . $e->getMessage());
- http_status_exit($e->getHTTPCode(), $e->getMessage());
- }
- }
-
-// require_once('Zotlabs/Storage/Browser.php');
- // provide a directory view for the cloud in Hubzilla
- $browser = new Zotlabs\Storage\Browser($auth);
- $auth->setBrowserPlugin($browser);
-
- // Experimental QuotaPlugin
-// require_once('Zotlabs/Storage/QuotaPlugin.php');
-// $server->addPlugin(new Zotlabs\Storage\QuotaPlugin($auth));
-
- // All we need to do now, is to fire up the server
- $server->exec();
-
- killme();
-}
diff --git a/mod/directory.php b/mod/directory.php
deleted file mode 100644
index 79c03777e..000000000
--- a/mod/directory.php
+++ /dev/null
@@ -1,419 +0,0 @@
-<?php
-
-require_once('include/socgraph.php');
-require_once('include/dir_fns.php');
-require_once('include/widgets.php');
-require_once('include/bbcode.php');
-
-function directory_init(&$a) {
- App::set_pager_itemspage(60);
-
- if(x($_GET,'ignore')) {
- q("insert into xign ( uid, xchan ) values ( %d, '%s' ) ",
- intval(local_channel()),
- dbesc($_GET['ignore'])
- );
- goaway(z_root() . '/directory?suggest=1');
- }
-
- $observer = get_observer_hash();
- $global_changed = false;
- $safe_changed = false;
- $pubforums_changed = false;
-
- if(array_key_exists('global',$_REQUEST)) {
- $globaldir = intval($_REQUEST['global']);
- $global_changed = true;
- }
- if($global_changed) {
- $_SESSION['globaldir'] = $globaldir;
- if($observer)
- set_xconfig($observer,'directory','globaldir',$globaldir);
- }
-
- if(array_key_exists('safe',$_REQUEST)) {
- $safemode = intval($_REQUEST['safe']);
- $safe_changed = true;
- }
- if($safe_changed) {
- $_SESSION['safemode'] = $safemode;
- if($observer)
- set_xconfig($observer,'directory','safemode',$safemode);
- }
-
-
- if(array_key_exists('pubforums',$_REQUEST)) {
- $pubforums = intval($_REQUEST['pubforums']);
- $pubforums_changed = true;
- }
- if($pubforums_changed) {
- $_SESSION['pubforums'] = $pubforums;
- if($observer)
- set_xconfig($observer,'directory','pubforums',$pubforums);
- }
-}
-
-function directory_content(&$a) {
-
- if((get_config('system','block_public')) && (! local_channel()) && (! remote_channel())) {
- notice( t('Public access denied.') . EOL);
- return;
- }
-
- $observer = get_observer_hash();
-
- $globaldir = get_directory_setting($observer, 'globaldir');
- // override your personal global search pref if we're doing a navbar search of the directory
- if(intval($_REQUEST['navsearch']))
- $globaldir = 1;
-
- $safe_mode = get_directory_setting($observer, 'safemode');
-
- $pubforums = get_directory_setting($observer, 'pubforums');
-
- $o = '';
- nav_set_selected('directory');
-
- if(x($_POST,'search'))
- $search = notags(trim($_POST['search']));
- else
- $search = ((x($_GET,'search')) ? notags(trim(rawurldecode($_GET['search']))) : '');
-
-
- if(strpos($search,'=') && local_channel() && get_pconfig(local_channel(),'feature','expert'))
- $advanced = $search;
-
-
- $keywords = (($_GET['keywords']) ? $_GET['keywords'] : '');
-
- // Suggest channels if no search terms or keywords are given
- $suggest = (local_channel() && x($_REQUEST,'suggest')) ? $_REQUEST['suggest'] : '';
-
- if($suggest) {
-
- $r = suggestion_query(local_channel(),get_observer_hash());
-
- // Remember in which order the suggestions were
- $addresses = array();
- $common = array();
- $index = 0;
- foreach($r as $rr) {
- $common[$rr['xchan_addr']] = $rr['total'];
- $addresses[$rr['xchan_addr']] = $index++;
- }
-
- // Build query to get info about suggested people
- $advanced = '';
- foreach(array_keys($addresses) as $address) {
- $advanced .= "address=\"$address\" ";
- }
- // Remove last space in the advanced query
- $advanced = rtrim($advanced);
-
- }
-
- $tpl = get_markup_template('directory_header.tpl');
-
- $dirmode = intval(get_config('system','directory_mode'));
-
- if(($dirmode == DIRECTORY_MODE_PRIMARY) || ($dirmode == DIRECTORY_MODE_STANDALONE)) {
- $url = z_root() . '/dirsearch';
- }
- if(! $url) {
- $directory = find_upstream_directory($dirmode);
- if((! $directory) || (! array_key_exists('url',$directory)) || (! $directory['url']))
- logger('CRITICAL: No directory server URL');
- $url = $directory['url'] . '/dirsearch';
- }
-
- $token = get_config('system','realm_token');
-
-
- logger('mod_directory: URL = ' . $url, LOGGER_DEBUG);
-
- $contacts = array();
-
- if(local_channel()) {
- $x = q("select abook_xchan from abook where abook_channel = %d",
- intval(local_channel())
- );
- if($x) {
- foreach($x as $xx)
- $contacts[] = $xx['abook_xchan'];
- }
- }
-
- if($url) {
-
- $numtags = get_config('system','directorytags');
-
- $kw = ((intval($numtags) > 0) ? intval($numtags) : 50);
-
- if(get_config('system','disable_directory_keywords'))
- $kw = 0;
-
- $query = $url . '?f=&kw=' . $kw . (($safe_mode != 1) ? '&safe=' . $safe_mode : '');
-
- if($token)
- $query .= '&t=' . $token;
-
- if(! $globaldir)
- $query .= '&hub=' . App::get_hostname();
-
- if($search)
- $query .= '&name=' . urlencode($search) . '&keywords=' . urlencode($search);
- if(strpos($search,'@'))
- $query .= '&address=' . urlencode($search);
- if($keywords)
- $query .= '&keywords=' . urlencode($keywords);
- if($advanced)
- $query .= '&query=' . urlencode($advanced);
- if(! is_null($pubforums))
- $query .= '&pubforums=' . intval($pubforums);
-
- $directory_sort_order = get_config('system','directory_sort_order');
- if(! $directory_sort_order)
- $directory_sort_order = 'date';
-
- $sort_order = ((x($_REQUEST,'order')) ? $_REQUEST['order'] : $directory_sort_order);
-
- if($sort_order)
- $query .= '&order=' . urlencode($sort_order);
-
- if(App::$pager['page'] != 1)
- $query .= '&p=' . App::$pager['page'];
-
- logger('mod_directory: query: ' . $query);
-
- $x = z_fetch_url($query);
- logger('directory: return from upstream: ' . print_r($x,true), LOGGER_DATA);
-
- if($x['success']) {
- $t = 0;
- $j = json_decode($x['body'],true);
- if($j) {
-
- if($j['results']) {
-
- $entries = array();
-
- $photo = 'thumb';
-
- foreach($j['results'] as $rr) {
-
- $profile_link = chanlink_url($rr['url']);
-
- $pdesc = (($rr['description']) ? $rr['description'] . '<br />' : '');
- $connect_link = ((local_channel()) ? z_root() . '/follow?f=&url=' . urlencode($rr['address']) : '');
-
- // Checking status is disabled ATM until someone checks the performance impact more carefully
- //$online = remote_online_status($rr['address']);
- $online = '';
-
- if(in_array($rr['hash'],$contacts))
- $connect_link = '';
-
- $location = '';
- if(strlen($rr['locale']))
- $location .= $rr['locale'];
- if(strlen($rr['region'])) {
- if(strlen($rr['locale']))
- $location .= ', ';
- $location .= $rr['region'];
- }
- if(strlen($rr['country'])) {
- if(strlen($location))
- $location .= ', ';
- $location .= $rr['country'];
- }
-
- $age = '';
- if(strlen($rr['birthday'])) {
- if(($years = age($rr['birthday'],'UTC','')) != 0)
- $age = $years;
- }
-
- $page_type = '';
-
- if($rr['total_ratings'])
- $total_ratings = sprintf( tt("%d rating", "%d ratings", $rr['total_ratings']), $rr['total_ratings']);
- else
- $total_ratings = '';
-
- $profile = $rr;
-
- if ((x($profile,'locale') == 1)
- || (x($profile,'region') == 1)
- || (x($profile,'postcode') == 1)
- || (x($profile,'country') == 1))
-
- $gender = ((x($profile,'gender') == 1) ? t('Gender: ') . $profile['gender']: False);
-
- $marital = ((x($profile,'marital') == 1) ? t('Status: ') . $profile['marital']: False);
-
- $homepage = ((x($profile,'homepage') == 1) ? t('Homepage: ') : False);
- $homepageurl = ((x($profile,'homepage') == 1) ? $profile['homepage'] : '');
-
- $hometown = ((x($profile,'hometown') == 1) ? $profile['hometown'] : False);
-
- $about = ((x($profile,'about') == 1) ? bbcode($profile['about']) : False);
-
- $keywords = ((x($profile,'keywords')) ? $profile['keywords'] : '');
-
- $out = '';
-
- if($keywords) {
- $keywords = str_replace(',',' ', $keywords);
- $keywords = str_replace(' ',' ', $keywords);
- $karr = explode(' ', $keywords);
-
- if($karr) {
- if(local_channel()) {
- $r = q("select keywords from profile where uid = %d and is_default = 1 limit 1",
- intval(local_channel())
- );
- if($r) {
- $keywords = str_replace(',',' ', $r[0]['keywords']);
- $keywords = str_replace(' ',' ', $keywords);
- $marr = explode(' ', $keywords);
- }
- }
- foreach($karr as $k) {
- if(strlen($out))
- $out .= ', ';
- if($marr && in_arrayi($k,$marr))
- $out .= '<strong>' . $k . '</strong>';
- else
- $out .= $k;
- }
- }
-
- }
-
- $entry = array(
- 'id' => ++$t,
- 'profile_link' => $profile_link,
- 'public_forum' => $rr['public_forum'],
- 'photo' => $rr['photo'],
- 'hash' => $rr['hash'],
- 'alttext' => $rr['name'] . ((local_channel() || remote_channel()) ? ' ' . $rr['address'] : ''),
- 'name' => $rr['name'],
- 'age' => $age,
- 'age_label' => t('Age:'),
- 'profile' => $profile,
- 'address' => $rr['address'],
- 'nickname' => substr($rr['address'],0,strpos($rr['address'],'@')),
- 'location' => $location,
- 'location_label' => t('Location:'),
- 'gender' => $gender,
- 'total_ratings' => $total_ratings,
- 'viewrate' => true,
- 'canrate' => ((local_channel()) ? true : false),
- 'pdesc' => $pdesc,
- 'pdesc_label' => t('Description:'),
- 'marital' => $marital,
- 'homepage' => $homepage,
- 'homepageurl' => linkify($homepageurl),
- 'hometown' => $hometown,
- 'hometown_label' => t('Hometown:'),
- 'about' => $about,
- 'about_label' => t('About:'),
- 'conn_label' => t('Connect'),
- 'forum_label' => t('Public Forum:'),
- 'connect' => $connect_link,
- 'online' => $online,
- 'kw' => (($out) ? t('Keywords: ') : ''),
- 'keywords' => $out,
- 'ignlink' => $suggest ? z_root() . '/directory?ignore=' . $rr['hash'] : '',
- 'ignore_label' => t('Don\'t suggest'),
- 'common_friends' => (($common[$rr['address']]) ? intval($common[$rr['address']]) : ''),
- 'common_label' => t('Common connections:'),
- 'common_count' => intval($common[$rr['address']]),
- 'safe' => $safe_mode
- );
-
- $arr = array('contact' => $rr, 'entry' => $entry);
-
- call_hooks('directory_item', $arr);
-
- unset($profile);
- unset($location);
-
- if(! $arr['entry']) {
- continue;
- }
-
- if($sort_order == '' && $suggest) {
- $entries[$addresses[$rr['address']]] = $arr['entry']; // Use the same indexes as originally to get the best suggestion first
- }
-
- else {
- $entries[] = $arr['entry'];
- }
- }
-
- ksort($entries); // Sort array by key so that foreach-constructs work as expected
-
- if($j['keywords']) {
- App::$data['directory_keywords'] = $j['keywords'];
- }
-
- logger('mod_directory: entries: ' . print_r($entries,true), LOGGER_DATA);
-
-
- if($_REQUEST['aj']) {
- if($entries) {
- $o = replace_macros(get_markup_template('directajax.tpl'),array(
- '$entries' => $entries
- ));
- }
- else {
- $o = '<div id="content-complete"></div>';
- }
- echo $o;
- killme();
- }
- else {
- $maxheight = 94;
-
- $dirtitle = (($globaldir) ? t('Global Directory') : t('Local Directory'));
-
- $o .= "<script> var page_query = '" . $_GET['q'] . "'; var extra_args = '" . extra_query_args() . "' ; divmore_height = " . intval($maxheight) . "; </script>";
- $o .= replace_macros($tpl, array(
- '$search' => $search,
- '$desc' => t('Find'),
- '$finddsc' => t('Finding:'),
- '$safetxt' => htmlspecialchars($search,ENT_QUOTES,'UTF-8'),
- '$entries' => $entries,
- '$dirlbl' => $suggest ? t('Channel Suggestions') : $dirtitle,
- '$submit' => t('Find'),
- '$next' => alt_pager($a,$j['records'], t('next page'), t('previous page')),
- '$sort' => t('Sort options'),
- '$normal' => t('Alphabetic'),
- '$reverse' => t('Reverse Alphabetic'),
- '$date' => t('Newest to Oldest'),
- '$reversedate' => t('Oldest to Newest'),
- '$suggest' => $suggest ? '&suggest=1' : ''
- ));
-
-
- }
-
- }
- else {
- if($_REQUEST['aj']) {
- $o = '<div id="content-complete"></div>';
- echo $o;
- killme();
- }
- if(App::$pager['page'] == 1 && $j['records'] == 0 && strpos($search,'@')) {
- goaway(z_root() . '/chanview/?f=&address=' . $search);
- }
- info( t("No entries (some entries may be hidden).") . EOL);
- }
- }
- }
- }
- return $o;
-}
-
diff --git a/mod/dirsearch.php b/mod/dirsearch.php
deleted file mode 100644
index 1273c5ccd..000000000
--- a/mod/dirsearch.php
+++ /dev/null
@@ -1,456 +0,0 @@
-<?php
-
-require_once('include/dir_fns.php');
-
-
-function dirsearch_init(&$a) {
- App::set_pager_itemspage(60);
-
-}
-
-function dirsearch_content(&$a) {
-
- $ret = array('success' => false);
-
-// logger('request: ' . print_r($_REQUEST,true));
-
-
- $dirmode = intval(get_config('system','directory_mode'));
-
- if($dirmode == DIRECTORY_MODE_NORMAL) {
- $ret['message'] = t('This site is not a directory server');
- json_return_and_die($ret);
- }
-
- $access_token = $_REQUEST['t'];
-
- $token = get_config('system','realm_token');
- if($token && $access_token != $token) {
- $ret['message'] = t('This directory server requires an access token');
- json_return_and_die($ret);
- }
-
-
- if(argc() > 1 && argv(1) === 'sites') {
- $ret = list_public_sites();
- json_return_and_die($ret);
- }
-
- $sql_extra = '';
-
-
- $tables = array('name','address','locale','region','postcode','country','gender','marital','sexual','keywords');
-
- if($_REQUEST['query']) {
- $advanced = dir_parse_query($_REQUEST['query']);
- if($advanced) {
- foreach($advanced as $adv) {
- if(in_array($adv['field'],$tables)) {
- if($adv['field'] === 'name')
- $sql_extra .= dir_query_build($adv['logic'],'xchan_name',$adv['value']);
- elseif($adv['field'] === 'address')
- $sql_extra .= dir_query_build($adv['logic'],'xchan_addr',$adv['value']);
- else
- $sql_extra .= dir_query_build($adv['logic'],'xprof_' . $adv['field'],$adv['value']);
- }
- }
- }
- }
-
- $hash = ((x($_REQUEST['hash'])) ? $_REQUEST['hash'] : '');
-
- $name = ((x($_REQUEST,'name')) ? $_REQUEST['name'] : '');
- $hub = ((x($_REQUEST,'hub')) ? $_REQUEST['hub'] : '');
- $address = ((x($_REQUEST,'address')) ? $_REQUEST['address'] : '');
- $locale = ((x($_REQUEST,'locale')) ? $_REQUEST['locale'] : '');
- $region = ((x($_REQUEST,'region')) ? $_REQUEST['region'] : '');
- $postcode = ((x($_REQUEST,'postcode')) ? $_REQUEST['postcode'] : '');
- $country = ((x($_REQUEST,'country')) ? $_REQUEST['country'] : '');
- $gender = ((x($_REQUEST,'gender')) ? $_REQUEST['gender'] : '');
- $marital = ((x($_REQUEST,'marital')) ? $_REQUEST['marital'] : '');
- $sexual = ((x($_REQUEST,'sexual')) ? $_REQUEST['sexual'] : '');
- $keywords = ((x($_REQUEST,'keywords')) ? $_REQUEST['keywords'] : '');
- $agege = ((x($_REQUEST,'agege')) ? intval($_REQUEST['agege']) : 0 );
- $agele = ((x($_REQUEST,'agele')) ? intval($_REQUEST['agele']) : 0 );
- $kw = ((x($_REQUEST,'kw')) ? intval($_REQUEST['kw']) : 0 );
- $forums = ((array_key_exists('pubforums',$_REQUEST)) ? intval($_REQUEST['pubforums']) : 0);
-
- if(get_config('system','disable_directory_keywords'))
- $kw = 0;
-
-
- // by default use a safe search
- $safe = ((x($_REQUEST,'safe'))); // ? intval($_REQUEST['safe']) : 1 );
- if ($safe === false)
- $safe = 1;
-
- if(array_key_exists('sync',$_REQUEST)) {
- if($_REQUEST['sync'])
- $sync = datetime_convert('UTC','UTC',$_REQUEST['sync']);
- else
- $sync = datetime_convert('UTC','UTC','2010-01-01 01:01:00');
- }
- else
- $sync = false;
-
-
- if($hub)
- $hub_query = " and xchan_hash in (select hubloc_hash from hubloc where hubloc_host = '" . protect_sprintf(dbesc($hub)) . "') ";
- else
- $hub_query = '';
-
- $sort_order = ((x($_REQUEST,'order')) ? $_REQUEST['order'] : '');
-
- $joiner = ' OR ';
- if($_REQUEST['and'])
- $joiner = ' AND ';
-
- if($name)
- $sql_extra .= dir_query_build($joiner,'xchan_name',$name);
- if($address)
- $sql_extra .= dir_query_build($joiner,'xchan_addr',$address);
- if($city)
- $sql_extra .= dir_query_build($joiner,'xprof_locale',$city);
- if($region)
- $sql_extra .= dir_query_build($joiner,'xprof_region',$region);
- if($post)
- $sql_extra .= dir_query_build($joiner,'xprof_postcode',$post);
- if($country)
- $sql_extra .= dir_query_build($joiner,'xprof_country',$country);
- if($gender)
- $sql_extra .= dir_query_build($joiner,'xprof_gender',$gender);
- if($marital)
- $sql_extra .= dir_query_build($joiner,'xprof_marital',$marital);
- if($sexual)
- $sql_extra .= dir_query_build($joiner,'xprof_sexual',$sexual);
- if($keywords)
- $sql_extra .= dir_query_build($joiner,'xprof_keywords',$keywords);
-
-
- // we only support an age range currently. You must set both agege
- // (greater than or equal) and agele (less than or equal)
-
- if($agele && $agege) {
- $sql_extra .= " $joiner ( xprof_age <= " . intval($agele) . " ";
- $sql_extra .= " AND xprof_age >= " . intval($agege) . ") ";
- }
-
-
- if($hash) {
- $sql_extra = " AND xchan_hash like '" . dbesc($hash) . protect_sprintf('%') . "' ";
- }
-
-
- $perpage = (($_REQUEST['n']) ? $_REQUEST['n'] : 60);
- $page = (($_REQUEST['p']) ? intval($_REQUEST['p'] - 1) : 0);
- $startrec = (($page+1) * $perpage) - $perpage;
- $limit = (($_REQUEST['limit']) ? intval($_REQUEST['limit']) : 0);
- $return_total = ((x($_REQUEST,'return_total')) ? intval($_REQUEST['return_total']) : 0);
-
- // mtime is not currently working
-
- $mtime = ((x($_REQUEST,'mtime')) ? datetime_convert('UTC','UTC',$_REQUEST['mtime']) : '');
-
- // ok a separate tag table won't work.
- // merge them into xprof
-
- $ret['success'] = true;
-
- // If &limit=n, return at most n entries
- // If &return_total=1, we count matching entries and return that as 'total_items' for use in pagination.
- // By default we return one page (default 80 items maximum) and do not count total entries
-
- $logic = ((strlen($sql_extra)) ? 'false' : 'true');
-
- if($hash)
- $logic = 'true';
-
- if($dirmode == DIRECTORY_MODE_STANDALONE) {
- $sql_extra .= " and xchan_addr like '%%" . App::get_hostname() . "' ";
- }
-
- $safesql = (($safe > 0) ? " and xchan_censored = 0 and xchan_selfcensored = 0 " : '');
- if($safe < 0)
- $safesql = " and ( xchan_censored = 1 OR xchan_selfcensored = 1 ) ";
-
- if($forums)
- $safesql .= " and xchan_pubforum = " . ((intval($forums)) ? '1 ' : '0 ');
-
- if($limit)
- $qlimit = " LIMIT $limit ";
- else {
- $qlimit = " LIMIT " . intval($perpage) . " OFFSET " . intval($startrec);
- if($return_total) {
- $r = q("SELECT COUNT(xchan_hash) AS `total` FROM xchan left join xprof on xchan_hash = xprof_hash where $logic $sql_extra and xchan_network = 'zot' and xchan_hidden = 0 and xchan_orphan = 0 and xchan_deleted = 0 $safesql ");
- if($r) {
- $ret['total_items'] = $r[0]['total'];
- }
- }
- }
-
- if($sort_order == 'normal') {
- $order = " order by xchan_name asc ";
-
- // Start the alphabetic search at 'A'
- // This will make a handful of channels whose names begin with
- // punctuation un-searchable in this mode
-
- $safesql .= " and ascii(substring(xchan_name FROM 1 FOR 1)) > 64 ";
- }
- elseif($sort_order == 'reverse')
- $order = " order by xchan_name desc ";
- elseif($sort_order == 'reversedate')
- $order = " order by xchan_name_date asc ";
- else
- $order = " order by xchan_name_date desc ";
-
-
- if($sync) {
- $spkt = array('transactions' => array());
- $r = q("select * from updates where ud_date >= '%s' and ud_guid != '' order by ud_date desc",
- dbesc($sync)
- );
- if($r) {
- foreach($r as $rr) {
- $flags = array();
- if($rr['ud_flags'] & UPDATE_FLAGS_DELETED)
- $flags[] = 'deleted';
- if($rr['ud_flags'] & UPDATE_FLAGS_FORCED)
- $flags[] = 'forced';
-
- $spkt['transactions'][] = array(
- 'hash' => $rr['ud_hash'],
- 'address' => $rr['ud_addr'],
- 'transaction_id' => $rr['ud_guid'],
- 'timestamp' => $rr['ud_date'],
- 'flags' => $flags
- );
- }
- }
- $r = q("select * from xlink where xlink_static = 1 and xlink_updated >= '%s' ",
- dbesc($sync)
- );
- if($r) {
- $spkt['ratings'] = array();
- foreach($r as $rr) {
- $spkt['ratings'][] = array(
- 'type' => 'rating',
- 'encoding' => 'zot',
- 'channel' => $rr['xlink_xchan'],
- 'target' => $rr['xlink_link'],
- 'rating' => intval($rr['xlink_rating']),
- 'rating_text' => $rr['xlink_rating_text'],
- 'signature' => $rr['xlink_sig'],
- 'edited' => $rr['xlink_updated']
- );
- }
- }
- json_return_and_die($spkt);
- }
- else {
-
- $r = q("SELECT xchan.*, xprof.* from xchan left join xprof on xchan_hash = xprof_hash
- where ( $logic $sql_extra ) $hub_query and xchan_network = 'zot' and xchan_hidden = 0 and xchan_orphan = 0 and xchan_deleted = 0
- $safesql $order $qlimit "
- );
-
-
-
- $ret['page'] = $page + 1;
- $ret['records'] = count($r);
- }
-
-
-
- if($r) {
-
- $entries = array();
-
- foreach($r as $rr) {
-
- $entry = array();
-
- $pc = q("select count(xlink_rating) as total_ratings from xlink where xlink_link = '%s' and xlink_rating != 0 and xlink_static = 1 group by xlink_rating",
- dbesc($rr['xchan_hash'])
- );
-
- if($pc)
- $entry['total_ratings'] = intval($pc[0]['total_ratings']);
- else
- $entry['total_ratings'] = 0;
-
- $entry['name'] = $rr['xchan_name'];
- $entry['hash'] = $rr['xchan_hash'];
-
- $entry['public_forum'] = (intval($rr['xchan_pubforum']) ? true : false);
-
- $entry['url'] = $rr['xchan_url'];
- $entry['photo_l'] = $rr['xchan_photo_l'];
- $entry['photo'] = $rr['xchan_photo_m'];
- $entry['address'] = $rr['xchan_addr'];
- $entry['description'] = $rr['xprof_desc'];
- $entry['locale'] = $rr['xprof_locale'];
- $entry['region'] = $rr['xprof_region'];
- $entry['postcode'] = $rr['xprof_postcode'];
- $entry['country'] = $rr['xprof_country'];
- $entry['birthday'] = $rr['xprof_dob'];
- $entry['age'] = $rr['xprof_age'];
- $entry['gender'] = $rr['xprof_gender'];
- $entry['marital'] = $rr['xprof_marital'];
- $entry['sexual'] = $rr['xprof_sexual'];
- $entry['about'] = $rr['xprof_about'];
- $entry['homepage'] = $rr['xprof_homepage'];
- $entry['hometown'] = $rr['xprof_hometown'];
- $entry['keywords'] = $rr['xprof_keywords'];
-
- $entries[] = $entry;
-
- }
-
- $ret['results'] = $entries;
- if($kw) {
- $k = dir_tagadelic($kw);
- if($k) {
- $ret['keywords'] = array();
- foreach($k as $kv) {
- $ret['keywords'][] = array('term' => $kv[0],'weight' => $kv[1], 'normalise' => $kv[2]);
- }
- }
- }
- }
-
- json_return_and_die($ret);
-}
-
-function dir_query_build($joiner,$field,$s) {
- $ret = '';
- if(trim($s))
- $ret .= dbesc($joiner) . " " . dbesc($field) . " like '" . protect_sprintf( '%' . dbesc($s) . '%' ) . "' ";
- return $ret;
-}
-
-function dir_flag_build($joiner,$field,$bit,$s) {
- return dbesc($joiner) . " ( " . dbesc($field) . " & " . intval($bit) . " ) " . ((intval($s)) ? '>' : '=' ) . " 0 ";
-}
-
-
-function dir_parse_query($s) {
-
- $ret = array();
- $curr = array();
- $all = explode(' ',$s);
- $quoted_string = false;
-
- if($all) {
- foreach($all as $q) {
- if($quoted_string === false) {
- if($q === 'and') {
- $curr['logic'] = 'and';
- continue;
- }
- if($q === 'or') {
- $curr['logic'] = 'or';
- continue;
- }
- if($q === 'not') {
- $curr['logic'] .= ' not';
- continue;
- }
- if(strpos($q,'=')) {
- if(! isset($curr['logic']))
- $curr['logic'] = 'or';
- $curr['field'] = trim(substr($q,0,strpos($q,'=')));
- $curr['value'] = trim(substr($q,strpos($q,'=')+1));
- if($curr['value'][0] == '"' && $curr['value'][strlen($curr['value'])-1] != '"') {
- $quoted_string = true;
- $curr['value'] = substr($curr['value'],1);
- continue;
- }
- elseif($curr['value'][0] == '"' && $curr['value'][strlen($curr['value'])-1] == '"') {
- $curr['value'] = substr($curr['value'],1,strlen($curr['value'])-2);
- $ret[] = $curr;
- $curr = array();
- continue;
- }
- else {
- $ret[] = $curr;
- $curr = array();
- continue;
- }
- }
- }
- else {
- if($q[strlen($q)-1] == '"') {
- $curr['value'] .= ' ' . str_replace('"','',trim($q));
- $ret[] = $curr;
- $curr = array();
- $quoted_string = false;
- }
- else
- $curr['value'] .= ' ' . trim(q);
- }
- }
- }
- logger('dir_parse_query:' . print_r($ret,true),LOGGER_DATA);
- return $ret;
-}
-
-
-
-
-
-
-
-function list_public_sites() {
-
- $rand = db_getfunc('rand');
- $realm = get_directory_realm();
- if($realm == DIRECTORY_REALM) {
- $r = q("select * from site where site_access != 0 and site_register !=0 and ( site_realm = '%s' or site_realm = '') and site_type = %d order by $rand",
- dbesc($realm),
- intval(SITE_TYPE_ZOT)
- );
- }
- else {
- $r = q("select * from site where site_access != 0 and site_register !=0 and site_realm = '%s' and site_type = %d order by $rand",
- dbesc($realm),
- intval(SITE_TYPE_ZOT)
- );
- }
-
- $ret = array('success' => false);
-
- if($r) {
- $ret['success'] = true;
- $ret['sites'] = array();
- $insecure = array();
-
- foreach($r as $rr) {
-
- if($rr['site_access'] == ACCESS_FREE)
- $access = 'free';
- elseif($rr['site_access'] == ACCESS_PAID)
- $access = 'paid';
- elseif($rr['site_access'] == ACCESS_TIERED)
- $access = 'tiered';
- else
- $access = 'private';
-
- if($rr['site_register'] == REGISTER_OPEN)
- $register = 'open';
- elseif($rr['site_register'] == REGISTER_APPROVE)
- $register = 'approve';
- else
- $register = 'closed';
-
- if(strpos($rr['site_url'],'https://') !== false)
- $ret['sites'][] = array('url' => $rr['site_url'], 'access' => $access, 'register' => $register, 'sellpage' => $rr['site_sellpage'], 'location' => $rr['site_location'], 'project' => $rr['site_project']);
- else
- $insecure[] = array('url' => $rr['site_url'], 'access' => $access, 'register' => $register, 'sellpage' => $rr['site_sellpage'], 'location' => $rr['site_location'], 'project' => $rr['site_project']);
- }
- if($insecure) {
- $ret['sites'] = array_merge($ret['sites'],$insecure);
- }
- }
- return $ret;
-}
diff --git a/mod/display.php b/mod/display.php
deleted file mode 100644
index 2844a1205..000000000
--- a/mod/display.php
+++ /dev/null
@@ -1,340 +0,0 @@
-<?php
-
-
-function display_content(&$a, $update = 0, $load = false) {
-
-// logger("mod-display: update = $update load = $load");
-
-
- $checkjs = new Zotlabs\Web\CheckJS();
-
-
- if($load)
- $_SESSION['loadtime'] = datetime_convert();
-
-
- if(intval(get_config('system','block_public')) && (! local_channel()) && (! remote_channel())) {
- notice( t('Public access denied.') . EOL);
- return;
- }
-
- require_once("include/bbcode.php");
- require_once('include/security.php');
- require_once('include/conversation.php');
- require_once('include/acl_selectors.php');
- require_once('include/items.php');
-
-
- App::$page['htmlhead'] .= replace_macros(get_markup_template('display-head.tpl'), array());
-
- if(argc() > 1 && argv(1) !== 'load')
- $item_hash = argv(1);
-
-
- if($_REQUEST['mid'])
- $item_hash = $_REQUEST['mid'];
-
-
- if(! $item_hash) {
- App::$error = 404;
- notice( t('Item not found.') . EOL);
- return;
- }
-
- $observer_is_owner = false;
-
-
- if(local_channel() && (! $update)) {
-
- $channel = App::get_channel();
-
-
- $channel_acl = array(
- 'allow_cid' => $channel['channel_allow_cid'],
- 'allow_gid' => $channel['channel_allow_gid'],
- 'deny_cid' => $channel['channel_deny_cid'],
- 'deny_gid' => $channel['channel_deny_gid']
- );
-
-
- $x = array(
- 'is_owner' => true,
- 'allow_location' => ((intval(get_pconfig($channel['channel_id'],'system','use_browser_location'))) ? '1' : ''),
- 'default_location' => $channel['channel_location'],
- 'nickname' => $channel['channel_address'],
- 'lockstate' => (($group || $cid || $channel['channel_allow_cid'] || $channel['channel_allow_gid'] || $channel['channel_deny_cid'] || $channel['channel_deny_gid']) ? 'lock' : 'unlock'),
-
- 'acl' => populate_acl($channel_acl),
- 'bang' => '',
- 'visitor' => true,
- 'profile_uid' => local_channel(),
- 'return_path' => 'channel/' . $channel['channel_address'],
- 'expanded' => true,
- 'editor_autocomplete' => true,
- 'bbco_autocomplete' => 'bbcode',
- 'bbcode' => true
- );
-
- $o = '<div id="jot-popup">';
- $o .= status_editor($a,$x);
- $o .= '</div>';
-
- }
-
- // This page can be viewed by anybody so the query could be complicated
- // First we'll see if there is a copy of the item which is owned by us - if we're logged in locally.
- // If that fails (or we aren't logged in locally),
- // query an item in which the observer (if logged in remotely) has cid or gid rights
- // and if that fails, look for a copy of the post that has no privacy restrictions.
- // If we find the post, but we don't find a copy that we're allowed to look at, this fact needs to be reported.
-
- // find a copy of the item somewhere
-
- $target_item = null;
-
- $r = q("select id, uid, mid, parent_mid, item_type, item_deleted from item where mid like '%s' limit 1",
- dbesc($item_hash . '%')
- );
-
- if($r) {
- $target_item = $r[0];
- }
-
- $r = null;
-
- if($target_item['item_type'] == ITEM_TYPE_WEBPAGE) {
- $x = q("select * from channel where channel_id = %d limit 1",
- intval($target_item['uid'])
- );
- $y = q("select * from item_id where uid = %d and service = 'WEBPAGE' and iid = %d limit 1",
- intval($target_item['uid']),
- intval($target_item['id'])
- );
- if($x && $y) {
- goaway(z_root() . '/page/' . $x[0]['channel_address'] . '/' . $y[0]['sid']);
- }
- else {
- notice( t('Page not found.') . EOL);
- return '';
- }
- }
-
-
- $simple_update = (($update) ? " AND item_unseen = 1 " : '');
-
- if($update && $_SESSION['loadtime'])
- $simple_update = " AND (( item_unseen = 1 AND item.changed > '" . datetime_convert('UTC','UTC',$_SESSION['loadtime']) . "' ) OR item.changed > '" . datetime_convert('UTC','UTC',$_SESSION['loadtime']) . "' ) ";
- if($load)
- $simple_update = '';
-
-
-
- if((! $update) && (! $load)) {
-
-
- $o .= '<div id="live-display"></div>' . "\r\n";
- $o .= "<script> var profile_uid = " . ((intval(local_channel())) ? local_channel() : (-1))
- . "; var netargs = '?f='; var profile_page = " . App::$pager['page'] . "; </script>\r\n";
-
- App::$page['htmlhead'] .= replace_macros(get_markup_template("build_query.tpl"),array(
- '$baseurl' => z_root(),
- '$pgtype' => 'display',
- '$uid' => '0',
- '$gid' => '0',
- '$cid' => '0',
- '$cmin' => '0',
- '$cmax' => '99',
- '$star' => '0',
- '$liked' => '0',
- '$conv' => '0',
- '$spam' => '0',
- '$fh' => '0',
- '$nouveau' => '0',
- '$wall' => '0',
- '$page' => ((App::$pager['page'] != 1) ? App::$pager['page'] : 1),
- '$list' => ((x($_REQUEST,'list')) ? intval($_REQUEST['list']) : 0),
- '$search' => '',
- '$order' => '',
- '$file' => '',
- '$cats' => '',
- '$tags' => '',
- '$dend' => '',
- '$dbegin' => '',
- '$verb' => '',
- '$mid' => $item_hash
- ));
-
-
- }
-
- $observer_hash = get_observer_hash();
- $item_normal = item_normal();
-
- $sql_extra = public_permissions_sql($observer_hash);
-
- if(($update && $load) || ($checkjs->disabled())) {
-
- $updateable = false;
-
- $pager_sql = sprintf(" LIMIT %d OFFSET %d ", intval(App::$pager['itemspage']),intval(App::$pager['start']));
-
- if($load || ($checkjs->disabled())) {
- $r = null;
-
- require_once('include/identity.php');
- $sys = get_sys_channel();
- $sysid = $sys['channel_id'];
-
- if(local_channel()) {
- $r = q("SELECT * from item
- WHERE uid = %d
- and mid = '%s'
- $item_normal
- limit 1",
- intval(local_channel()),
- dbesc($target_item['parent_mid'])
- );
- if($r) {
- $updateable = true;
-
- }
-
- }
- if($r === null) {
-
- // in case somebody turned off public access to sys channel content using permissions
- // make that content unsearchable by ensuring the owner_xchan can't match
-
- if(! perm_is_allowed($sysid,$observer_hash,'view_stream'))
- $sysid = 0;
-
-
- $r = q("SELECT * from item
- WHERE mid = '%s'
- AND (((( `item`.`allow_cid` = '' AND `item`.`allow_gid` = '' AND `item`.`deny_cid` = ''
- AND `item`.`deny_gid` = '' AND item_private = 0 )
- and owner_xchan in ( " . stream_perms_xchans(($observer_hash) ? (PERMS_NETWORK|PERMS_PUBLIC) : PERMS_PUBLIC) . " ))
- OR uid = %d )
- $sql_extra )
- $item_normal
- limit 1",
- dbesc($target_item['parent_mid']),
- intval($sysid)
- );
-
- }
- }
- }
-
- elseif($update && !$load) {
- $r = null;
-
- require_once('include/identity.php');
- $sys = get_sys_channel();
- $sysid = $sys['channel_id'];
-
- if(local_channel()) {
- $r = q("SELECT * from item
- WHERE uid = %d
- and mid = '%s'
- $item_normal
- $simple_update
- limit 1",
- intval(local_channel()),
- dbesc($target_item['parent_mid'])
- );
- if($r) {
- $updateable = true;
- }
- }
- if($r === null) {
- // in case somebody turned off public access to sys channel content using permissions
- // make that content unsearchable by ensuring the owner_xchan can't match
- if(! perm_is_allowed($sysid,$observer_hash,'view_stream'))
- $sysid = 0;
-
- $r = q("SELECT * from item
- WHERE mid = '%s'
- AND (((( `item`.`allow_cid` = '' AND `item`.`allow_gid` = '' AND `item`.`deny_cid` = ''
- AND `item`.`deny_gid` = '' AND item_private = 0 )
- and owner_xchan in ( " . stream_perms_xchans(($observer_hash) ? (PERMS_NETWORK|PERMS_PUBLIC) : PERMS_PUBLIC) . " ))
- OR uid = %d )
- $sql_extra )
- $item_normal
- $simple_update
- limit 1",
- dbesc($target_item['parent_mid']),
- intval($sysid)
- );
- }
- $_SESSION['loadtime'] = datetime_convert();
- }
-
- else {
- $r = array();
- }
-
- if($r) {
-
- $parents_str = ids_to_querystr($r,'id');
- if($parents_str) {
-
- $items = q("SELECT `item`.*, `item`.`id` AS `item_id`
- FROM `item`
- WHERE parent in ( %s ) $item_normal ",
- dbesc($parents_str)
- );
-
- xchan_query($items);
- $items = fetch_post_tags($items,true);
- $items = conv_sort($items,'created');
- }
- } else {
- $items = array();
- }
-
-
- if ($checkjs->disabled()) {
- $o .= conversation($a, $items, 'display', $update, 'traditional');
- if ($items[0]['title'])
- App::$page['title'] = $items[0]['title'] . " - " . App::$page['title'];
- }
- else {
- $o .= conversation($a, $items, 'display', $update, 'client');
- }
-
- if($updateable) {
- $x = q("UPDATE item SET item_unseen = 0 where item_unseen = 1 AND uid = %d and parent = %d ",
- intval(local_channel()),
- intval($r[0]['parent'])
- );
- }
-
- $o .= '<div id="content-complete"></div>';
-
- return $o;
-
-
-/*
- elseif((! $update) && (! {
-
- $r = q("SELECT `id`, item_flags FROM `item` WHERE `id` = '%s' OR `mid` = '%s' LIMIT 1",
- dbesc($item_hash),
- dbesc($item_hash)
- );
- if($r) {
- if(intval($r[0]['item_deleted'])) {
- notice( t('Item has been removed.') . EOL );
- }
- else {
- notice( t('Permission denied.') . EOL );
- }
- }
- else {
- notice( t('Item not found.') . EOL );
- }
-
- }
-*/
-}
-
diff --git a/mod/dreport.php b/mod/dreport.php
deleted file mode 100644
index 4edec2e2b..000000000
--- a/mod/dreport.php
+++ /dev/null
@@ -1,139 +0,0 @@
-<?php
-
-function dreport_content(&$a) {
-
- if(! local_channel()) {
- notice( t('Permission denied') . EOL);
- return;
- }
-
- $table = 'item';
-
- $channel = App::get_channel();
-
- $mid = ((argc() > 1) ? argv(1) : '');
-
- if($mid === 'mail') {
- $table = 'mail';
- $mid = ((argc() > 2) ? argv(2) : '');
- }
-
-
- if(! $mid) {
- notice( t('Invalid message') . EOL);
- return;
- }
-
- switch($table) {
- case 'item':
- $i = q("select id from item where mid = '%s' and author_xchan = '%s' ",
- dbesc($mid),
- dbesc($channel['channel_hash'])
- );
- break;
- case 'mail':
- $i = q("select id from mail where mid = '%s' and from_xchan = '%s'",
- dbesc($mid),
- dbesc($channel['channel_hash'])
- );
- break;
- default:
- break;
- }
-
- if(! $i) {
- notice( t('Permission denied') . EOL);
- return;
- }
-
- $r = q("select * from dreport where dreport_xchan = '%s' and dreport_mid = '%s'",
- dbesc($channel['channel_hash']),
- dbesc($mid)
- );
-
- if(! $r) {
- notice( t('no results') . EOL);
- return;
- }
-
- $o .= '<div class="generic-content-wrapper-styled">';
- $o .= '<h2>' . sprintf( t('Delivery report for %1$s'),substr($mid,0,32)) . '...' . '</h2>';
- $o .= '<table>';
-
- for($x = 0; $x < count($r); $x++ ) {
- $r[$x]['name'] = escape_tags(substr($r[$x]['dreport_recip'],strpos($r[$x]['dreport_recip'],' ')));
-
- // This has two purposes: 1. make the delivery report strings translateable, and
- // 2. assign an ordering to item delivery results so we can group them and provide
- // a readable report with more interesting events listed toward the top and lesser
- // interesting items towards the bottom
-
- switch($r[$x]['dreport_result']) {
- case 'channel sync processed':
- $r[$x]['gravity'] = 0;
- $r[$x]['dreport_result'] = t('channel sync processed');
- break;
- case 'queued':
- $r[$x]['gravity'] = 2;
- $r[$x]['dreport_result'] = t('queued');
- break;
- case 'posted':
- $r[$x]['gravity'] = 3;
- $r[$x]['dreport_result'] = t('posted');
- break;
- case 'accepted for delivery':
- $r[$x]['gravity'] = 4;
- $r[$x]['dreport_result'] = t('accepted for delivery');
- break;
- case 'updated':
- $r[$x]['gravity'] = 5;
- $r[$x]['dreport_result'] = t('updated');
- case 'update ignored':
- $r[$x]['gravity'] = 6;
- $r[$x]['dreport_result'] = t('update ignored');
- break;
- case 'permission denied':
- $r[$x]['dreport_result'] = t('permission denied');
- $r[$x]['gravity'] = 6;
- break;
- case 'recipient not found':
- $r[$x]['dreport_result'] = t('recipient not found');
- break;
- case 'mail recalled':
- $r[$x]['dreport_result'] = t('mail recalled');
- break;
- case 'duplicate mail received':
- $r[$x]['dreport_result'] = t('duplicate mail received');
- break;
- case 'mail delivered':
- $r[$x]['dreport_result'] = t('mail delivered');
- break;
- default:
- $r[$x]['gravity'] = 1;
- break;
- }
- }
-
- usort($r,'dreport_gravity_sort');
-
-
- foreach($r as $rr) {
- $o .= '<tr><td width="40%">' . $rr['name'] . '</td><td width="20%">' . escape_tags($rr['dreport_result']) . '</td><td width="20%">' . escape_tags($rr['dreport_time']) . '</td></tr>';
- }
- $o .= '</table>';
- $o .= '</div>';
-
- return $o;
-
-
-
-}
-
-function dreport_gravity_sort($a,$b) {
- if($a['gravity'] == $b['gravity']) {
- if($a['name'] === $b['name'])
- return strcmp($a['dreport_time'],$b['dreport_time']);
- return strcmp($a['name'],$b['name']);
- }
- return (($a['gravity'] > $b['gravity']) ? 1 : (-1));
-}
diff --git a/mod/editblock.php b/mod/editblock.php
deleted file mode 100644
index 214c495dd..000000000
--- a/mod/editblock.php
+++ /dev/null
@@ -1,192 +0,0 @@
-<?php
-
-require_once('include/identity.php');
-require_once('include/acl_selectors.php');
-
-function editblock_init(&$a) {
-
- if(argc() > 1 && argv(1) === 'sys' && is_site_admin()) {
- $sys = get_sys_channel();
- if($sys && intval($sys['channel_id'])) {
- App::$is_sys = true;
- }
- }
-
- if(argc() > 1)
- $which = argv(1);
- else
- return;
-
- profile_load($a,$which);
-
-}
-
-
-
-function editblock_content(&$a) {
-
- if(! App::$profile) {
- notice( t('Requested profile is not available.') . EOL );
- App::$error = 404;
- return;
- }
-
- $which = argv(1);
-
- $uid = local_channel();
- $owner = 0;
- $channel = null;
- $observer = App::get_observer();
-
- $channel = App::get_channel();
-
- if(App::$is_sys && is_site_admin()) {
- $sys = get_sys_channel();
- if($sys && intval($sys['channel_id'])) {
- $uid = $owner = intval($sys['channel_id']);
- $channel = $sys;
- $observer = $sys;
- }
- }
-
- if(! $owner) {
- // Figure out who the page owner is.
- $r = q("select channel_id from channel where channel_address = '%s'",
- dbesc($which)
- );
- if($r) {
- $owner = intval($r[0]['channel_id']);
- }
- }
-
- $ob_hash = (($observer) ? $observer['xchan_hash'] : '');
-
- if(! perm_is_allowed($owner,$ob_hash,'write_pages')) {
- notice( t('Permission denied.') . EOL);
- return;
- }
-
- $is_owner = (($uid && $uid == $owner) ? true : false);
-
- $o = '';
-
- // Figure out which post we're editing
- $post_id = ((argc() > 2) ? intval(argv(2)) : 0);
-
-
- if(! ($post_id && $owner)) {
- notice( t('Item not found') . EOL);
- return;
- }
-
- $itm = q("SELECT * FROM `item` WHERE `id` = %d and uid = %s LIMIT 1",
- intval($post_id),
- intval($owner)
- );
- if($itm) {
- $item_id = q("select * from item_id where service = 'BUILDBLOCK' and iid = %d limit 1",
- intval($itm[0]['id'])
- );
- if($item_id)
- $block_title = $item_id[0]['sid'];
- }
- else {
- notice( t('Item not found') . EOL);
- return;
- }
-
- $plaintext = true;
-
- $mimeselect = '';
- $mimetype = $itm[0]['mimetype'];
-
- if($mimetype != 'text/bbcode')
- $plaintext = true;
-
- if(get_config('system','page_mimetype'))
- $mimeselect = '<input type="hidden" name="mimetype" value="' . $mimetype . '" />';
- else
- $mimeselect = mimetype_select($itm[0]['uid'],$mimetype);
-
- App::$page['htmlhead'] .= replace_macros(get_markup_template('jot-header.tpl'), array(
- '$baseurl' => z_root(),
- '$editselect' => (($plaintext) ? 'none' : '/(profile-jot-text|prvmail-text)/'),
- '$pretext' => '',
- '$ispublic' => '&nbsp;', // t('Visible to <strong>everybody</strong>'),
- '$geotag' => '',
- '$nickname' => $channel['channel_address'],
- '$confirmdelete' => t('Delete block?'),
- '$bbco_autocomplete'=> (($mimetype == 'text/bbcode') ? 'bbcode' : 'comanche-block')
- ));
-
- $tpl = get_markup_template("jot.tpl");
-
- $jotplugins = '';
- $jotnets = '';
-
- call_hooks('jot_tool', $jotplugins);
- call_hooks('jot_networks', $jotnets);
-
- $rp = 'blocks/' . $channel['channel_address'];
-
- $editor = replace_macros($tpl,array(
- '$return_path' => $rp,
- '$action' => 'item',
- '$webpage' => ITEM_TYPE_BLOCK,
- '$share' => t('Edit'),
- '$bold' => t('Bold'),
- '$italic' => t('Italic'),
- '$underline' => t('Underline'),
- '$quote' => t('Quote'),
- '$code' => t('Code'),
- '$writefiles' => perm_is_allowed($owner, get_observer_hash(), 'write_storage'),
- '$upload' => t('Upload photo'),
- '$attach' => t('Attach file'),
- '$weblink' => t('Insert web link'),
- '$youtube' => t('Insert YouTube video'),
- '$video' => t('Insert Vorbis [.ogg] video'),
- '$audio' => t('Insert Vorbis [.ogg] audio'),
- '$setloc' => t('Set your location'),
- '$noloc' => t('Clear browser location'),
- '$wait' => t('Please wait'),
- '$permset' => t('Permission settings'),
- '$ptyp' => $itm[0]['type'],
- '$mimeselect' => $mimeselect,
- '$content' => undo_post_tagging($itm[0]['body']),
- '$post_id' => $post_id,
- '$baseurl' => z_root(),
- '$defloc' => $channel['channel_location'],
- '$visitor' => false,
- '$public' => t('Public post'),
- '$jotnets' => $jotnets,
- '$title' => htmlspecialchars($itm[0]['title'],ENT_COMPAT,'UTF-8'),
- '$placeholdertitle' => t('Title (optional)'),
- '$pagetitle' => $block_title,
- '$category' => '',
- '$placeholdercategory' => t('Categories (optional, comma-separated list)'),
- '$emtitle' => t('Example: bob@example.com, mary@example.com'),
- '$lockstate' => $lockstate,
- '$acl' => '',
- '$bang' => '',
- '$profile_uid' => (intval($channel['channel_id'])),
- '$preview' => t('Preview'),
- '$jotplugins' => $jotplugins,
- '$sourceapp' => $itm[0]['app'],
- '$defexpire' => '',
- '$feature_expire' => false,
- '$expires' => t('Set expiration date'),
- '$bbcode' => (($mimetype == 'text/bbcode') ? true : false)
- ));
-
- $o .= replace_macros(get_markup_template('edpost_head.tpl'), array(
- '$title' => t('Edit Block'),
- '$delete' => ((($itm[0]['author_xchan'] === $ob_hash) || ($itm[0]['owner_xchan'] === $ob_hash)) ? t('Delete') : false),
- '$id' => $itm[0]['id'],
- '$editor' => $editor
- ));
-
- return $o;
-
-}
-
-
diff --git a/mod/editlayout.php b/mod/editlayout.php
deleted file mode 100644
index 0b58fe5fe..000000000
--- a/mod/editlayout.php
+++ /dev/null
@@ -1,189 +0,0 @@
-<?php
-
-require_once('include/identity.php');
-require_once('include/acl_selectors.php');
-
-function editlayout_init(&$a) {
-
- if(argc() > 1 && argv(1) === 'sys' && is_site_admin()) {
- $sys = get_sys_channel();
- if($sys && intval($sys['channel_id'])) {
- App::$is_sys = true;
- }
- }
-
- if(argc() > 1)
- $which = argv(1);
- else
- return;
-
- profile_load($a,$which);
-
-}
-
-function editlayout_content(&$a) {
-
- if(! App::$profile) {
- notice( t('Requested profile is not available.') . EOL );
- App::$error = 404;
- return;
- }
-
- $which = argv(1);
-
- $uid = local_channel();
- $owner = 0;
- $channel = null;
- $observer = App::get_observer();
-
- $channel = App::get_channel();
-
- if(App::$is_sys && is_site_admin()) {
- $sys = get_sys_channel();
- if($sys && intval($sys['channel_id'])) {
- $uid = $owner = intval($sys['channel_id']);
- $channel = $sys;
- $observer = $sys;
- }
- }
-
- if(! $owner) {
- // Figure out who the page owner is.
- $r = q("select channel_id from channel where channel_address = '%s'",
- dbesc($which)
- );
- if($r) {
- $owner = intval($r[0]['channel_id']);
- }
- }
-
- $ob_hash = (($observer) ? $observer['xchan_hash'] : '');
-
- if(! perm_is_allowed($owner,$ob_hash,'write_pages')) {
- notice( t('Permission denied.') . EOL);
- return;
- }
-
- $is_owner = (($uid && $uid == $owner) ? true : false);
-
- $o = '';
-
- // Figure out which post we're editing
- $post_id = ((argc() > 2) ? intval(argv(2)) : 0);
-
-
- if(! $post_id) {
- notice( t('Item not found') . EOL);
- return;
- }
-
- // Now we've got a post and an owner, let's find out if we're allowed to edit it
-
- $ob_hash = (($observer) ? $observer['xchan_hash'] : '');
-
- $perms = get_all_perms($owner,$ob_hash);
-
- if(! $perms['write_pages']) {
- notice( t('Permission denied.') . EOL);
- return;
- }
-
-
- $itm = q("SELECT * FROM `item` WHERE `id` = %d and uid = %s LIMIT 1",
- intval($post_id),
- intval($owner)
- );
-
- $item_id = q("select * from item_id where service = 'PDL' and iid = %d limit 1",
- intval($itm[0]['id'])
- );
- if($item_id)
- $layout_title = $item_id[0]['sid'];
-
- $plaintext = true;
-
- App::$page['htmlhead'] .= replace_macros(get_markup_template('jot-header.tpl'), array(
- '$baseurl' => z_root(),
- '$editselect' => (($plaintext) ? 'none' : '/(profile-jot-text|prvmail-text)/'),
- '$pretext' => '',
- '$ispublic' => '&nbsp;', // t('Visible to <strong>everybody</strong>'),
- '$geotag' => $geotag,
- '$nickname' => $channel['channel_address'],
- '$confirmdelete' => t('Delete layout?'),
- '$bbco_autocomplete'=> 'comanche'
- ));
-
-
- $tpl = get_markup_template("jot.tpl");
-
- $jotplugins = '';
- $jotnets = '';
-
- call_hooks('jot_tool', $jotplugins);
- call_hooks('jot_networks', $jotnets);
-
-
- // FIXME A return path with $_SESSION doesn't always work for observer - it may WSoD
- // instead of loading a sensible page. So, send folk to the webpage list.
-
- $rp = 'layouts/' . $which;
-
- $editor = replace_macros($tpl,array(
- '$return_path' => $rp,
- '$action' => 'item',
- '$webpage' => ITEM_TYPE_PDL,
- '$share' => t('Edit'),
- '$bold' => t('Bold'),
- '$italic' => t('Italic'),
- '$underline' => t('Underline'),
- '$quote' => t('Quote'),
- '$code' => t('Code'),
- '$upload' => t('Upload photo'),
- '$attach' => t('Attach file'),
- '$weblink' => t('Insert web link'),
- '$youtube' => t('Insert YouTube video'),
- '$video' => t('Insert Vorbis [.ogg] video'),
- '$audio' => t('Insert Vorbis [.ogg] audio'),
- '$setloc' => t('Set your location'),
- '$noloc' => t('Clear browser location'),
- '$wait' => t('Please wait'),
- '$permset' => t('Permission settings'),
- '$ptyp' => $itm[0]['type'],
- '$content' => undo_post_tagging($itm[0]['body']),
- '$post_id' => $post_id,
- '$baseurl' => z_root(),
- '$defloc' => $channel['channel_location'],
- '$visitor' => false,
- '$public' => t('Public post'),
- '$jotnets' => $jotnets,
- '$title' => htmlspecialchars($itm[0]['title'],ENT_COMPAT,'UTF-8'),
- '$placeholdertitle' => t('Layout Description (Optional)'),
- '$pagetitle' => $layout_title,
- '$placeholdpagetitle' => t('Layout Name'),
- '$category' => '',
- '$placeholdercategory' => t('Categories (optional, comma-separated list)'),
- '$emtitle' => t('Example: bob@example.com, mary@example.com'),
- '$lockstate' => $lockstate,
- '$acl' => '',
- '$bang' => '',
- '$profile_uid' => (intval($owner)),
- '$jotplugins' => $jotplugins,
- '$sourceapp' => t(App::$sourcename),
- '$defexpire' => '',
- '$feature_expire' => false,
- '$expires' => t('Set expiration date'),
- ));
-
-
- $o .= replace_macros(get_markup_template('edpost_head.tpl'), array(
- '$title' => t('Edit Layout'),
- '$delete' => ((($itm[0]['author_xchan'] === $ob_hash) || ($itm[0]['owner_xchan'] === $ob_hash)) ? t('Delete') : false),
- '$id' => $itm[0]['id'],
- '$editor' => $editor
- ));
-
- return $o;
-
-}
-
-
diff --git a/mod/editpost.php b/mod/editpost.php
deleted file mode 100644
index ae77e5973..000000000
--- a/mod/editpost.php
+++ /dev/null
@@ -1,175 +0,0 @@
-<?php /** @file */
-
-require_once('include/acl_selectors.php');
-require_once('include/crypto.php');
-require_once('include/items.php');
-require_once('include/taxonomy.php');
-
-function editpost_content(&$a) {
-
- $o = '';
-
- if(! local_channel()) {
- notice( t('Permission denied.') . EOL);
- return;
- }
-
- $post_id = ((argc() > 1) ? intval(argv(1)) : 0);
-
- if(! $post_id) {
- notice( t('Item not found') . EOL);
- return;
- }
-
- $itm = q("SELECT * FROM `item` WHERE `id` = %d AND ( owner_xchan = '%s' OR author_xchan = '%s' ) LIMIT 1",
- intval($post_id),
- dbesc(get_observer_hash()),
- dbesc(get_observer_hash())
- );
-
- if(! count($itm)) {
- notice( t('Item is not editable') . EOL);
- return;
- }
-
- if($itm[0]['resource_type'] === 'event' && $itm[0]['resource_id']) {
- goaway(z_root() . '/events/' . $itm[0]['resource_id'] . '?expandform=1');
- }
-
-
- $owner_uid = $itm[0]['uid'];
-
-
- $plaintext = true;
-// if(feature_enabled(local_channel(),'richtext'))
-// $plaintext = false;
-
- $channel = App::get_channel();
-
- App::$page['htmlhead'] .= replace_macros(get_markup_template('jot-header.tpl'), array(
- '$baseurl' => z_root(),
- '$editselect' => (($plaintext) ? 'none' : '/(profile-jot-text|prvmail-text)/'),
- '$pretext' => '',
- '$ispublic' => '&nbsp;', // t('Visible to <strong>everybody</strong>'),
- '$geotag' => $geotag,
- '$nickname' => $channel['channel_address'],
- '$expireswhen' => t('Expires YYYY-MM-DD HH:MM'),
- '$confirmdelete' => t('Delete item?'),
- '$editor_autocomplete'=> true,
- '$bbco_autocomplete'=> 'bbcode'
- ));
-
- if(intval($itm[0]['item_obscured'])) {
- $key = get_config('system','prvkey');
- if($itm[0]['title'])
- $itm[0]['title'] = crypto_unencapsulate(json_decode_plus($itm[0]['title']),$key);
- if($itm[0]['body'])
- $itm[0]['body'] = crypto_unencapsulate(json_decode_plus($itm[0]['body']),$key);
- }
-
- $tpl = get_markup_template("jot.tpl");
-
- $jotplugins = '';
- $jotnets = '';
-
- call_hooks('jot_tool', $jotplugins);
- call_hooks('jot_networks', $jotnets);
-
- //$tpl = replace_macros($tpl,array('$jotplugins' => $jotplugins));
-
- $voting = feature_enabled($owner_uid,'consensus_tools');
-
- $category = '';
- $catsenabled = ((feature_enabled($owner_uid,'categories')) ? 'categories' : '');
-
- if ($catsenabled){
- $itm = fetch_post_tags($itm);
-
- $cats = get_terms_oftype($itm[0]['term'], TERM_CATEGORY);
-
- foreach ($cats as $cat) {
- if (strlen($category))
- $category .= ', ';
- $category .= $cat['term'];
- }
- }
-
- if($itm[0]['attach']) {
- $j = json_decode($itm[0]['attach'],true);
- if($j) {
- foreach($j as $jj) {
- $itm[0]['body'] .= "\n" . '[attachment]' . basename($jj['href']) . ',' . $jj['revision'] . '[/attachment]' . "\n";
- }
- }
- }
-
- $cipher = get_pconfig(App::$profile['profile_uid'],'system','default_cipher');
- if(! $cipher)
- $cipher = 'aes256';
-
-
- $editor = replace_macros($tpl,array(
- '$return_path' => $_SESSION['return_url'],
- '$action' => 'item',
- '$share' => t('Edit'),
- '$bold' => t('Bold'),
- '$italic' => t('Italic'),
- '$underline' => t('Underline'),
- '$quote' => t('Quote'),
- '$code' => t('Code'),
- '$upload' => t('Upload photo'),
- '$attach' => t('Attach file'),
- '$weblink' => t('Insert web link'),
- '$youtube' => t('Insert YouTube video'),
- '$video' => t('Insert Vorbis [.ogg] video'),
- '$audio' => t('Insert Vorbis [.ogg] audio'),
- '$setloc' => t('Set your location'),
- '$noloc' => t('Clear browser location'),
- '$voting' => t('Toggle voting'),
- '$feature_voting' => $voting,
- '$consensus' => intval($itm[0]['item_consensus']),
- '$wait' => t('Please wait'),
- '$permset' => t('Permission settings'),
- '$ptyp' => $itm[0]['obj_type'],
- '$content' => undo_post_tagging($itm[0]['body']),
- '$post_id' => $post_id,
- '$parent' => (($itm[0]['parent'] != $itm[0]['id']) ? $itm[0]['parent'] : ''),
- '$baseurl' => z_root(),
- '$defloc' => $channel['channel_location'],
- '$visitor' => false,
- '$public' => t('Public post'),
- '$jotnets' => $jotnets,
- '$title' => htmlspecialchars($itm[0]['title'],ENT_COMPAT,'UTF-8'),
- '$placeholdertitle' => t('Title (optional)'),
- '$category' => $category,
- '$placeholdercategory' => t('Categories (optional, comma-separated list)'),
- '$emtitle' => t('Example: bob@example.com, mary@example.com'),
- '$lockstate' => $lockstate,
- '$acl' => '',
- '$bang' => '',
- '$profile_uid' => $owner_uid,
- '$preview' => t('Preview'),
- '$jotplugins' => $jotplugins,
- '$sourceapp' => t(App::$sourcename),
- '$catsenabled' => $catsenabled,
- '$defexpire' => datetime_convert('UTC', date_default_timezone_get(),$itm[0]['expires']),
- '$feature_expire' => ((feature_enabled(App::$profile['profile_uid'],'content_expire') && (! $webpage)) ? true : false),
- '$expires' => t('Set expiration date'),
- '$feature_encrypt' => ((feature_enabled(App::$profile['profile_uid'],'content_encrypt') && (! $webpage)) ? true : false),
- '$encrypt' => t('Encrypt text'),
- '$cipher' => $cipher,
- '$expiryModalOK' => t('OK'),
- '$expiryModalCANCEL' => t('Cancel'),
- '$bbcode' => true
- ));
-
- $o .= replace_macros(get_markup_template('edpost_head.tpl'), array(
- '$title' => t('Edit post'),
- '$editor' => $editor
- ));
-
- return $o;
-
-}
-
-
diff --git a/mod/editwebpage.php b/mod/editwebpage.php
deleted file mode 100644
index 7cf738989..000000000
--- a/mod/editwebpage.php
+++ /dev/null
@@ -1,233 +0,0 @@
-<?php
-
-require_once('include/identity.php');
-require_once('include/acl_selectors.php');
-
-function editwebpage_init(&$a) {
-
- if(argc() > 1 && argv(1) === 'sys' && is_site_admin()) {
- $sys = get_sys_channel();
- if($sys && intval($sys['channel_id'])) {
- App::$is_sys = true;
- }
- }
-
- if(argc() > 1)
- $which = argv(1);
- else
- return;
-
- profile_load($a,$which);
-
-}
-
-
-function editwebpage_content(&$a) {
-
- if(! App::$profile) {
- notice( t('Requested profile is not available.') . EOL );
- App::$error = 404;
- return;
- }
-
- $which = argv(1);
-
- $uid = local_channel();
- $owner = 0;
- $channel = null;
- $observer = App::get_observer();
-
- $channel = App::get_channel();
-
- if(App::$is_sys && is_site_admin()) {
- $sys = get_sys_channel();
- if($sys && intval($sys['channel_id'])) {
- $uid = $owner = intval($sys['channel_id']);
- $channel = $sys;
- $observer = $sys;
- }
- }
-
- if(! $owner) {
- // Figure out who the page owner is.
- $r = q("select channel_id from channel where channel_address = '%s'",
- dbesc($which)
- );
- if($r) {
- $owner = intval($r[0]['channel_id']);
- }
- }
-
- $ob_hash = (($observer) ? $observer['xchan_hash'] : '');
-
- if(! perm_is_allowed($owner,$ob_hash,'write_pages')) {
- notice( t('Permission denied.') . EOL);
- return;
- }
-
- $is_owner = (($uid && $uid == $owner) ? true : false);
-
- $o = '';
-
- // Figure out which post we're editing
- $post_id = ((argc() > 2) ? intval(argv(2)) : 0);
-
-
- if(! $post_id) {
- notice( t('Item not found') . EOL);
- return;
- }
-
- $ob_hash = (($observer) ? $observer['xchan_hash'] : '');
-
- $perms = get_all_perms($owner,$ob_hash);
-
- if(! $perms['write_pages']) {
- notice( t('Permission denied.') . EOL);
- return;
- }
-
- // We've already figured out which item we want and whose copy we need,
- // so we don't need anything fancy here
-
- $sql_extra = item_permissions_sql($owner);
-
- $itm = q("SELECT * FROM `item` WHERE `id` = %d and uid = %s $sql_extra LIMIT 1",
- intval($post_id),
- intval($owner)
- );
-
- if(! $itm) {
- notice( t('Permission denied.') . EOL);
- return;
- }
-
- if(intval($itm[0]['item_obscured'])) {
- $key = get_config('system','prvkey');
- if($itm[0]['title'])
- $itm[0]['title'] = crypto_unencapsulate(json_decode_plus($itm[0]['title']),$key);
- if($itm[0]['body'])
- $itm[0]['body'] = crypto_unencapsulate(json_decode_plus($itm[0]['body']),$key);
- }
-
- $item_id = q("select * from item_id where service = 'WEBPAGE' and iid = %d limit 1",
- intval($itm[0]['id'])
- );
- if($item_id)
- $page_title = $item_id[0]['sid'];
-
- $plaintext = true;
-
- $mimetype = $itm[0]['mimetype'];
-
- if($mimetype === 'application/x-php') {
- if((! $uid) || ($uid != $itm[0]['uid'])) {
- notice( t('Permission denied.') . EOL);
- return;
- }
- }
-
- $mimeselect = '';
-
- if($mimetype != 'text/bbcode')
- $plaintext = true;
-
- if(get_config('system','page_mimetype'))
- $mimeselect = '<input type="hidden" name="mimetype" value="' . $mimetype . '" />';
- else
- $mimeselect = mimetype_select($itm[0]['uid'],$mimetype);
-
- $layout = get_config('system','page_layout');
- if($layout)
- $layoutselect = '<input type="hidden" name="layout_mid" value="' . $layout . '" />';
- else
- $layoutselect = layout_select($itm[0]['uid'],$itm[0]['layout_mid']);
-
- App::$page['htmlhead'] .= replace_macros(get_markup_template('jot-header.tpl'), array(
- '$baseurl' => z_root(),
- '$editselect' => (($plaintext) ? 'none' : '/(profile-jot-text|prvmail-text)/'),
- '$pretext' => '',
- '$ispublic' => '&nbsp;', // t('Visible to <strong>everybody</strong>'),
- '$geotag' => $geotag,
- '$nickname' => $channel['channel_address'],
- '$confirmdelete' => t('Delete webpage?'),
- '$bbco_autocomplete'=> (($mimetype == 'text/bbcode') ? 'bbcode' : '')
- ));
-
- $tpl = get_markup_template("jot.tpl");
-
- $jotplugins = '';
- $jotnets = '';
-
- call_hooks('jot_tool', $jotplugins);
- call_hooks('jot_networks', $jotnets);
-
- // FIXME A return path with $_SESSION doesn't always work for observer - it may WSoD
- // instead of loading a sensible page. So, send folk to the webpage list.
-
- $rp = 'webpages/' . $which;
-
- $editor = replace_macros($tpl,array(
- '$return_path' => $rp,
- '$webpage' => ITEM_TYPE_WEBPAGE,
- '$placeholdpagetitle' => t('Page link title'),
- '$pagetitle' => $page_title,
- '$writefiles' => perm_is_allowed($owner, get_observer_hash(), 'write_storage'),
- '$action' => 'item',
- '$share' => t('Edit'),
- '$bold' => t('Bold'),
- '$italic' => t('Italic'),
- '$underline' => t('Underline'),
- '$quote' => t('Quote'),
- '$code' => t('Code'),
- '$upload' => t('Upload photo'),
- '$attach' => t('Attach file'),
- '$weblink' => t('Insert web link'),
- '$youtube' => t('Insert YouTube video'),
- '$video' => t('Insert Vorbis [.ogg] video'),
- '$audio' => t('Insert Vorbis [.ogg] audio'),
- '$setloc' => t('Set your location'),
- '$noloc' => ((get_pconfig($uid, 'system', 'use_browser_location')) ? t('Clear browser location') : ''),
- '$wait' => t('Please wait'),
- '$permset' => t('Permission settings'),
- '$ptyp' => $itm[0]['type'],
- '$content' => undo_post_tagging($itm[0]['body']),
- '$post_id' => $post_id,
- '$baseurl' => z_root(),
- '$defloc' => $itm[0]['location'],
- '$visitor' => ($is_owner) ? true : false,
- '$acl' => populate_acl($itm[0],false),
- '$showacl' => ($is_owner) ? true : false,
- '$public' => t('Public post'),
- '$jotnets' => $jotnets,
- '$mimeselect' => $mimeselect,
- '$layoutselect' => $layoutselect,
- '$title' => htmlspecialchars($itm[0]['title'],ENT_COMPAT,'UTF-8'),
- '$placeholdertitle' => t('Title (optional)'),
- '$category' => '',
- '$placeholdercategory' => t('Categories (optional, comma-separated list)'),
- '$emtitle' => t('Example: bob@example.com, mary@example.com'),
- 'lockstate' => (((strlen($itm[0]['allow_cid'])) || (strlen($itm[0]['allow_gid'])) || (strlen($itm[0]['deny_cid'])) || (strlen($itm[0]['deny_gid']))) ? 'lock' : 'unlock'),
- '$bang' => '',
- '$profile_uid' => (intval($owner)),
- '$preview' => t('Preview'),
- '$jotplugins' => $jotplugins,
- '$sourceapp' => App::$sourcename,
- '$defexpire' => '',
- '$feature_expire' => false,
- '$expires' => t('Set expiration date'),
- '$bbcode' => (($mimetype == 'text/bbcode') ? true : false)
- ));
-
- $o .= replace_macros(get_markup_template('edpost_head.tpl'), array(
- '$title' => t('Edit Webpage'),
- '$delete' => ((($itm[0]['author_xchan'] === $ob_hash) || ($itm[0]['owner_xchan'] === $ob_hash)) ? t('Delete') : false),
- '$editor' => $editor,
- '$id' => $itm[0]['id']
- ));
-
- return $o;
-
-}
-
-
diff --git a/mod/events.php b/mod/events.php
deleted file mode 100755
index 30cf5f303..000000000
--- a/mod/events.php
+++ /dev/null
@@ -1,708 +0,0 @@
-<?php
-
-require_once('include/conversation.php');
-require_once('include/bbcode.php');
-require_once('include/datetime.php');
-require_once('include/event.php');
-require_once('include/items.php');
-
-function events_post(&$a) {
-
- logger('post: ' . print_r($_REQUEST,true), LOGGER_DATA);
-
- if(! local_channel())
- return;
-
- if(($_FILES) && array_key_exists('userfile',$_FILES) && intval($_FILES['userfile']['size'])) {
- $src = $_FILES['userfile']['tmp_name'];
- if($src) {
- $result = parse_ical_file($src,local_channel());
- if($result)
- info( t('Calendar entries imported.') . EOL);
- else
- notice( t('No calendar entries found.') . EOL);
- @unlink($src);
- }
- goaway(z_root() . '/events');
- }
-
-
- $event_id = ((x($_POST,'event_id')) ? intval($_POST['event_id']) : 0);
- $event_hash = ((x($_POST,'event_hash')) ? $_POST['event_hash'] : '');
-
- $xchan = ((x($_POST,'xchan')) ? dbesc($_POST['xchan']) : '');
- $uid = local_channel();
-
- $start_text = escape_tags($_REQUEST['start_text']);
- $finish_text = escape_tags($_REQUEST['finish_text']);
-
- $adjust = intval($_POST['adjust']);
- $nofinish = intval($_POST['nofinish']);
-
- $categories = escape_tags(trim($_POST['category']));
-
- // only allow editing your own events.
-
- if(($xchan) && ($xchan !== get_observer_hash()))
- return;
-
- if($start_text) {
- $start = $start_text;
- }
- else {
- $start = sprintf('%d-%d-%d %d:%d:0',$startyear,$startmonth,$startday,$starthour,$startminute);
- }
-
- if($nofinish) {
- $finish = NULL_DATE;
- }
-
- if($finish_text) {
- $finish = $finish_text;
- }
- else {
- $finish = sprintf('%d-%d-%d %d:%d:0',$finishyear,$finishmonth,$finishday,$finishhour,$finishminute);
- }
-
- if($adjust) {
- $start = datetime_convert(date_default_timezone_get(),'UTC',$start);
- if(! $nofinish)
- $finish = datetime_convert(date_default_timezone_get(),'UTC',$finish);
- }
- else {
- $start = datetime_convert('UTC','UTC',$start);
- if(! $nofinish)
- $finish = datetime_convert('UTC','UTC',$finish);
- }
-
- // Don't allow the event to finish before it begins.
- // It won't hurt anything, but somebody will file a bug report
- // and we'll waste a bunch of time responding to it. Time that
- // could've been spent doing something else.
-
-
- $summary = escape_tags(trim($_POST['summary']));
- $desc = escape_tags(trim($_POST['desc']));
- $location = escape_tags(trim($_POST['location']));
- $type = escape_tags(trim($_POST['type']));
-
- require_once('include/text.php');
- linkify_tags($a, $desc, local_channel());
- linkify_tags($a, $location, local_channel());
-
- //$action = ($event_hash == '') ? 'new' : "event/" . $event_hash;
-
- //fixme: this url gives a wsod if there is a linebreak detected in one of the variables ($desc or $location)
- //$onerror_url = z_root() . "/events/" . $action . "?summary=$summary&description=$desc&location=$location&start=$start_text&finish=$finish_text&adjust=$adjust&nofinish=$nofinish&type=$type";
- $onerror_url = z_root() . "/events";
-
- if(strcmp($finish,$start) < 0 && !$nofinish) {
- notice( t('Event can not end before it has started.') . EOL);
- if(intval($_REQUEST['preview'])) {
- echo( t('Unable to generate preview.'));
- killme();
- }
- goaway($onerror_url);
- }
-
- if((! $summary) || (! $start)) {
- notice( t('Event title and start time are required.') . EOL);
- if(intval($_REQUEST['preview'])) {
- echo( t('Unable to generate preview.'));
- killme();
- }
- goaway($onerror_url);
- }
-
- $share = ((intval($_POST['share'])) ? intval($_POST['share']) : 0);
-
- $channel = App::get_channel();
-
- $acl = new Zotlabs\Access\AccessList(false);
-
- if($event_id) {
- $x = q("select * from event where id = %d and uid = %d limit 1",
- intval($event_id),
- intval(local_channel())
- );
- if(! $x) {
- notice( t('Event not found.') . EOL);
- if(intval($_REQUEST['preview'])) {
- echo( t('Unable to generate preview.'));
- killme();
- }
- return;
- }
-
- $acl->set($x[0]);
-
- $created = $x[0]['created'];
- $edited = datetime_convert();
-
- if($x[0]['allow_cid'] === '<' . $channel['channel_hash'] . '>'
- && $x[0]['allow_gid'] === '' && $x[0]['deny_cid'] === '' && $x[0]['deny_gid'] === '') {
- $share = false;
- }
- else {
- $share = true;
- }
- }
- else {
- $created = $edited = datetime_convert();
- if($share) {
- $acl->set_from_array($_POST);
- }
- else {
- $acl->set(array('allow_cid' => '<' . $channel['channel_hash'] . '>', 'allow_gid' => '', 'deny_cid' => '', 'deny_gid' => ''));
- }
- }
-
- $post_tags = array();
- $channel = App::get_channel();
- $ac = $acl->get();
-
- if(strlen($categories)) {
- $cats = explode(',',$categories);
- foreach($cats as $cat) {
- $post_tags[] = array(
- 'uid' => $profile_uid,
- 'type' => TERM_CATEGORY,
- 'otype' => TERM_OBJ_POST,
- 'term' => trim($cat),
- 'url' => $channel['xchan_url'] . '?f=&cat=' . urlencode(trim($cat))
- );
- }
- }
-
- $datarray = array();
- $datarray['start'] = $start;
- $datarray['finish'] = $finish;
- $datarray['summary'] = $summary;
- $datarray['description'] = $desc;
- $datarray['location'] = $location;
- $datarray['type'] = $type;
- $datarray['adjust'] = $adjust;
- $datarray['nofinish'] = $nofinish;
- $datarray['uid'] = local_channel();
- $datarray['account'] = get_account_id();
- $datarray['event_xchan'] = $channel['channel_hash'];
- $datarray['allow_cid'] = $ac['allow_cid'];
- $datarray['allow_gid'] = $ac['allow_gid'];
- $datarray['deny_cid'] = $ac['deny_cid'];
- $datarray['deny_gid'] = $ac['deny_gid'];
- $datarray['private'] = (($acl->is_private()) ? 1 : 0);
- $datarray['id'] = $event_id;
- $datarray['created'] = $created;
- $datarray['edited'] = $edited;
-
- if(intval($_REQUEST['preview'])) {
- $html = format_event_html($datarray);
- echo $html;
- killme();
- }
-
- $event = event_store_event($datarray);
-
-
- if($post_tags)
- $datarray['term'] = $post_tags;
-
- $item_id = event_store_item($datarray,$event);
-
- if($item_id) {
- $r = q("select * from item where id = %d",
- intval($item_id)
- );
- if($r) {
- xchan_query($r);
- $sync_item = fetch_post_tags($r);
- $z = q("select * from event where event_hash = '%s' and uid = %d limit 1",
- dbesc($r[0]['resource_id']),
- intval($channel['channel_id'])
- );
- if($z) {
- build_sync_packet($channel['channel_id'],array('event_item' => array(encode_item($sync_item[0],true)),'event' => $z));
- }
- }
- }
-
- if($share)
- proc_run('php',"include/notifier.php","event","$item_id");
-
-}
-
-
-
-function events_content(&$a) {
-
- if(argc() > 2 && argv(1) == 'ical') {
- $event_id = argv(2);
-
- require_once('include/security.php');
- $sql_extra = permissions_sql(local_channel());
-
- $r = q("select * from event where event_hash = '%s' $sql_extra limit 1",
- dbesc($event_id)
- );
- if($r) {
- header('Content-type: text/calendar');
- header('content-disposition: attachment; filename="' . t('event') . '-' . $event_id . '.ics"' );
- echo ical_wrapper($r);
- killme();
- }
- else {
- notice( t('Event not found.') . EOL );
- return;
- }
- }
-
- if(! local_channel()) {
- notice( t('Permission denied.') . EOL);
- return;
- }
-
- nav_set_selected('all_events');
-
- if((argc() > 2) && (argv(1) === 'ignore') && intval(argv(2))) {
- $r = q("update event set ignore = 1 where id = %d and uid = %d",
- intval(argv(2)),
- intval(local_channel())
- );
- }
-
- if((argc() > 2) && (argv(1) === 'unignore') && intval(argv(2))) {
- $r = q("update event set ignore = 0 where id = %d and uid = %d",
- intval(argv(2)),
- intval(local_channel())
- );
- }
-
- $first_day = get_pconfig(local_channel(),'system','cal_first_day');
- $first_day = (($first_day) ? $first_day : 0);
-
- $htpl = get_markup_template('event_head.tpl');
- App::$page['htmlhead'] .= replace_macros($htpl,array(
- '$baseurl' => z_root(),
- '$module_url' => '/events',
- '$modparams' => 1,
- '$lang' => App::$language,
- '$first_day' => $first_day
- ));
-
- $o = '';
-
- $channel = App::get_channel();
-
- $mode = 'view';
- $y = 0;
- $m = 0;
- $ignored = ((x($_REQUEST,'ignored')) ? " and ignored = " . intval($_REQUEST['ignored']) . " " : '');
-
-
- // logger('args: ' . print_r(App::$argv,true));
-
-
-
- if(argc() > 1) {
- if(argc() > 2 && argv(1) === 'add') {
- $mode = 'add';
- $item_id = intval(argv(2));
- }
- if(argc() > 2 && argv(1) === 'drop') {
- $mode = 'drop';
- $event_id = argv(2);
- }
- if(argc() > 2 && intval(argv(1)) && intval(argv(2))) {
- $mode = 'view';
- $y = intval(argv(1));
- $m = intval(argv(2));
- }
- if(argc() <= 2) {
- $mode = 'view';
- $event_id = argv(1);
- }
- }
-
- if($mode === 'add') {
- event_addtocal($item_id,local_channel());
- killme();
- }
-
- if($mode == 'view') {
-
- /* edit/create form */
- if($event_id) {
- $r = q("SELECT * FROM `event` WHERE event_hash = '%s' AND `uid` = %d LIMIT 1",
- dbesc($event_id),
- intval(local_channel())
- );
- if(count($r))
- $orig_event = $r[0];
- }
-
- $channel = App::get_channel();
-
- // Passed parameters overrides anything found in the DB
- if(!x($orig_event))
- $orig_event = array();
-
- // In case of an error the browser is redirected back here, with these parameters filled in with the previous values
- /*
- if(x($_REQUEST,'nofinish')) $orig_event['nofinish'] = $_REQUEST['nofinish'];
- if(x($_REQUEST,'adjust')) $orig_event['adjust'] = $_REQUEST['adjust'];
- if(x($_REQUEST,'summary')) $orig_event['summary'] = $_REQUEST['summary'];
- if(x($_REQUEST,'description')) $orig_event['description'] = $_REQUEST['description'];
- if(x($_REQUEST,'location')) $orig_event['location'] = $_REQUEST['location'];
- if(x($_REQUEST,'start')) $orig_event['start'] = $_REQUEST['start'];
- if(x($_REQUEST,'finish')) $orig_event['finish'] = $_REQUEST['finish'];
- if(x($_REQUEST,'type')) $orig_event['type'] = $_REQUEST['type'];
- */
-
- $n_checked = ((x($orig_event) && $orig_event['nofinish']) ? ' checked="checked" ' : '');
- $a_checked = ((x($orig_event) && $orig_event['adjust']) ? ' checked="checked" ' : '');
- $t_orig = ((x($orig_event)) ? $orig_event['summary'] : '');
- $d_orig = ((x($orig_event)) ? $orig_event['description'] : '');
- $l_orig = ((x($orig_event)) ? $orig_event['location'] : '');
- $eid = ((x($orig_event)) ? $orig_event['id'] : 0);
- $event_xchan = ((x($orig_event)) ? $orig_event['event_xchan'] : $channel['channel_hash']);
- $mid = ((x($orig_event)) ? $orig_event['mid'] : '');
-
- if(! x($orig_event))
- $sh_checked = '';
- else
- $sh_checked = ((($orig_event['allow_cid'] === '<' . $channel['channel_hash'] . '>' || (! $orig_event['allow_cid'])) && (! $orig_event['allow_gid']) && (! $orig_event['deny_cid']) && (! $orig_event['deny_gid'])) ? '' : ' checked="checked" ' );
-
- if($orig_event['event_xchan'])
- $sh_checked .= ' disabled="disabled" ';
-
- $sdt = ((x($orig_event)) ? $orig_event['start'] : 'now');
-
- $fdt = ((x($orig_event)) ? $orig_event['finish'] : '+1 hour');
-
- $tz = date_default_timezone_get();
- if(x($orig_event))
- $tz = (($orig_event['adjust']) ? date_default_timezone_get() : 'UTC');
-
- $syear = datetime_convert('UTC', $tz, $sdt, 'Y');
- $smonth = datetime_convert('UTC', $tz, $sdt, 'm');
- $sday = datetime_convert('UTC', $tz, $sdt, 'd');
- $shour = datetime_convert('UTC', $tz, $sdt, 'H');
- $sminute = datetime_convert('UTC', $tz, $sdt, 'i');
-
- $stext = datetime_convert('UTC',$tz,$sdt);
- $stext = substr($stext,0,14) . "00:00";
-
- $fyear = datetime_convert('UTC', $tz, $fdt, 'Y');
- $fmonth = datetime_convert('UTC', $tz, $fdt, 'm');
- $fday = datetime_convert('UTC', $tz, $fdt, 'd');
- $fhour = datetime_convert('UTC', $tz, $fdt, 'H');
- $fminute = datetime_convert('UTC', $tz, $fdt, 'i');
-
- $ftext = datetime_convert('UTC',$tz,$fdt);
- $ftext = substr($ftext,0,14) . "00:00";
-
- $type = ((x($orig_event)) ? $orig_event['type'] : 'event');
-
- $f = get_config('system','event_input_format');
- if(! $f)
- $f = 'ymd';
-
- $catsenabled = feature_enabled(local_channel(),'categories');
-
- $category = '';
-
- if($catsenabled && x($orig_event)){
- $itm = q("select * from item where resource_type = 'event' and resource_id = '%s' and uid = %d limit 1",
- dbesc($orig_event['event_hash']),
- intval(local_channel())
- );
- $itm = fetch_post_tags($itm);
- if($itm) {
- $cats = get_terms_oftype($itm[0]['term'], TERM_CATEGORY);
- foreach ($cats as $cat) {
- if(strlen($category))
- $category .= ', ';
- $category .= $cat['term'];
- }
- }
- }
-
- require_once('include/acl_selectors.php');
-
- $acl = new Zotlabs\Access\AccessList($channel);
- $perm_defaults = $acl->get();
-
- $tpl = get_markup_template('event_form.tpl');
-
- $form = replace_macros($tpl,array(
- '$post' => z_root() . '/events',
- '$eid' => $eid,
- '$type' => $type,
- '$xchan' => $event_xchan,
- '$mid' => $mid,
- '$event_hash' => $event_id,
- '$summary' => array('summary', (($event_id) ? t('Edit event title') : t('Event title')), $t_orig, t('Required'), '*'),
- '$catsenabled' => $catsenabled,
- '$placeholdercategory' => t('Categories (comma-separated list)'),
- '$c_text' => (($event_id) ? t('Edit Category') : t('Category')),
- '$category' => $category,
- '$required' => '<span class="required" title="' . t('Required') . '">*</span>',
- '$s_dsel' => datetimesel($f,new DateTime(),DateTime::createFromFormat('Y',$syear+5),DateTime::createFromFormat('Y-m-d H:i',"$syear-$smonth-$sday $shour:$sminute"), (($event_id) ? t('Edit start date and time') : t('Start date and time')), 'start_text',true,true,'','',true,$first_day),
- '$n_text' => t('Finish date and time are not known or not relevant'),
- '$n_checked' => $n_checked,
- '$f_dsel' => datetimesel($f,new DateTime(),DateTime::createFromFormat('Y',$fyear+5),DateTime::createFromFormat('Y-m-d H:i',"$fyear-$fmonth-$fday $fhour:$fminute"), (($event_id) ? t('Edit finish date and time') : t('Finish date and time')),'finish_text',true,true,'start_text','',false,$first_day),
- '$nofinish' => array('nofinish', t('Finish date and time are not known or not relevant'), $n_checked, '', array(t('No'),t('Yes')), 'onclick="enableDisableFinishDate();"'),
- '$adjust' => array('adjust', t('Adjust for viewer timezone'), $a_checked, t('Important for events that happen in a particular place. Not practical for global holidays.'), array(t('No'),t('Yes'))),
- '$a_text' => t('Adjust for viewer timezone'),
- '$d_text' => (($event_id) ? t('Edit Description') : t('Description')),
- '$d_orig' => $d_orig,
- '$l_text' => (($event_id) ? t('Edit Location') : t('Location')),
- '$l_orig' => $l_orig,
- '$t_orig' => $t_orig,
- '$sh_text' => t('Share this event'),
- '$sh_checked' => $sh_checked,
- '$share' => array('share', t('Share this event'), $sh_checked, '', array(t('No'),t('Yes'))),
- '$preview' => t('Preview'),
- '$permissions' => t('Permission settings'),
- '$acl' => (($orig_event['event_xchan']) ? '' : populate_acl(((x($orig_event)) ? $orig_event : $perm_defaults),false)),
- '$submit' => t('Submit'),
- '$advanced' => t('Advanced Options')
-
- ));
- /* end edit/create form */
-
- $thisyear = datetime_convert('UTC',date_default_timezone_get(),'now','Y');
- $thismonth = datetime_convert('UTC',date_default_timezone_get(),'now','m');
- if(! $y)
- $y = intval($thisyear);
- if(! $m)
- $m = intval($thismonth);
-
- $export = false;
- if(argc() === 4 && argv(3) === 'export')
- $export = true;
-
- // Put some limits on dates. The PHP date functions don't seem to do so well before 1900.
- // An upper limit was chosen to keep search engines from exploring links millions of years in the future.
-
- if($y < 1901)
- $y = 1900;
- if($y > 2099)
- $y = 2100;
-
- $nextyear = $y;
- $nextmonth = $m + 1;
- if($nextmonth > 12) {
- $nextmonth = 1;
- $nextyear ++;
- }
-
- $prevyear = $y;
- if($m > 1)
- $prevmonth = $m - 1;
- else {
- $prevmonth = 12;
- $prevyear --;
- }
-
- $dim = get_dim($y,$m);
- $start = sprintf('%d-%d-%d %d:%d:%d',$y,$m,1,0,0,0);
- $finish = sprintf('%d-%d-%d %d:%d:%d',$y,$m,$dim,23,59,59);
-
-
- if (argv(1) === 'json'){
- if (x($_GET,'start')) $start = $_GET['start'];
- if (x($_GET,'end')) $finish = $_GET['end'];
- }
-
- $start = datetime_convert('UTC','UTC',$start);
- $finish = datetime_convert('UTC','UTC',$finish);
-
- $adjust_start = datetime_convert('UTC', date_default_timezone_get(), $start);
- $adjust_finish = datetime_convert('UTC', date_default_timezone_get(), $finish);
-
- if (x($_GET,'id')){
- $r = q("SELECT event.*, item.plink, item.item_flags, item.author_xchan, item.owner_xchan
- from event left join item on resource_id = event_hash where resource_type = 'event' and event.uid = %d and event.id = %d limit 1",
- intval(local_channel()),
- intval($_GET['id'])
- );
- } elseif($export) {
- $r = q("SELECT * from event where uid = %d
- AND (( `adjust` = 0 AND ( `finish` >= '%s' or nofinish = 1 ) AND `start` <= '%s' )
- OR ( `adjust` = 1 AND ( `finish` >= '%s' or nofinish = 1 ) AND `start` <= '%s' )) ",
- intval(local_channel()),
- dbesc($start),
- dbesc($finish),
- dbesc($adjust_start),
- dbesc($adjust_finish)
- );
- }
- else {
- // fixed an issue with "nofinish" events not showing up in the calendar.
- // There's still an issue if the finish date crosses the end of month.
- // Noting this for now - it will need to be fixed here and in Friendica.
- // Ultimately the finish date shouldn't be involved in the query.
-
- $r = q("SELECT event.*, item.plink, item.item_flags, item.author_xchan, item.owner_xchan
- from event left join item on event_hash = resource_id
- where resource_type = 'event' and event.uid = %d $ignored
- AND (( adjust = 0 AND ( finish >= '%s' or nofinish = 1 ) AND start <= '%s' )
- OR ( adjust = 1 AND ( finish >= '%s' or nofinish = 1 ) AND start <= '%s' )) ",
- intval(local_channel()),
- dbesc($start),
- dbesc($finish),
- dbesc($adjust_start),
- dbesc($adjust_finish)
- );
-
- }
-
- $links = array();
-
- if($r && ! $export) {
- xchan_query($r);
- $r = fetch_post_tags($r,true);
-
- $r = sort_by_date($r);
- }
-
- if($r) {
- foreach($r as $rr) {
- $j = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['start'], 'j') : datetime_convert('UTC','UTC',$rr['start'],'j'));
- if(! x($links,$j))
- $links[$j] = z_root() . '/' . App::$cmd . '#link-' . $j;
- }
- }
-
- $events=array();
-
- $last_date = '';
- $fmt = t('l, F j');
-
- if($r) {
-
- foreach($r as $rr) {
-
- $j = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['start'], 'j') : datetime_convert('UTC','UTC',$rr['start'],'j'));
- $d = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['start'], $fmt) : datetime_convert('UTC','UTC',$rr['start'],$fmt));
- $d = day_translate($d);
-
- $start = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['start'], 'c') : datetime_convert('UTC','UTC',$rr['start'],'c'));
- if ($rr['nofinish']){
- $end = null;
- } else {
- $end = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['finish'], 'c') : datetime_convert('UTC','UTC',$rr['finish'],'c'));
- }
-
-
- $is_first = ($d !== $last_date);
-
- $last_date = $d;
-
- $edit = ((local_channel() && $rr['author_xchan'] == get_observer_hash()) ? array(z_root().'/events/'.$rr['event_hash'].'?expandform=1',t('Edit event'),'','') : false);
-
- $drop = array(z_root().'/events/drop/'.$rr['event_hash'],t('Delete event'),'','');
-
- $title = strip_tags(html_entity_decode(bbcode($rr['summary']),ENT_QUOTES,'UTF-8'));
- if(! $title) {
- list($title, $_trash) = explode("<br",bbcode($rr['desc']),2);
- $title = strip_tags(html_entity_decode($title,ENT_QUOTES,'UTF-8'));
- }
- $html = format_event_html($rr);
- $rr['desc'] = bbcode($rr['desc']);
- $rr['location'] = bbcode($rr['location']);
- $events[] = array(
- 'id'=>$rr['id'],
- 'hash' => $rr['event_hash'],
- 'start'=> $start,
- 'end' => $end,
- 'drop' => $drop,
- 'allDay' => false,
- 'title' => $title,
-
- 'j' => $j,
- 'd' => $d,
- 'edit' => $edit,
- 'is_first'=>$is_first,
- 'item'=>$rr,
- 'html'=>$html,
- 'plink' => array($rr['plink'],t('Link to Source'),'',''),
- );
-
-
- }
- }
-
- if($export) {
- header('Content-type: text/calendar');
- header('content-disposition: attachment; filename="' . t('calendar') . '-' . $channel['channel_address'] . '.ics"' );
- echo ical_wrapper($r);
- killme();
- }
-
- if (App::$argv[1] === 'json'){
- echo json_encode($events); killme();
- }
-
- // links: array('href', 'text', 'extra css classes', 'title')
- if (x($_GET,'id')){
- $tpl = get_markup_template("event.tpl");
- }
- else {
- $tpl = get_markup_template("events-js.tpl");
- }
-
- $o = replace_macros($tpl, array(
- '$baseurl' => z_root(),
- '$new_event' => array(z_root().'/events',(($event_id) ? t('Edit Event') : t('Create Event')),'',''),
- '$previus' => array(z_root()."/events/$prevyear/$prevmonth",t('Previous'),'',''),
- '$next' => array(z_root()."/events/$nextyear/$nextmonth",t('Next'),'',''),
- '$export' => array(z_root()."/events/$y/$m/export",t('Export'),'',''),
- '$calendar' => cal($y,$m,$links, ' eventcal'),
- '$events' => $events,
- '$upload' => t('Import'),
- '$submit' => t('Submit'),
- '$prev' => t('Previous'),
- '$next' => t('Next'),
- '$today' => t('Today'),
- '$form' => $form,
- '$expandform' => ((x($_GET,'expandform')) ? true : false),
- ));
-
- if (x($_GET,'id')){ echo $o; killme(); }
-
- return $o;
- }
-
- if($mode === 'drop' && $event_id) {
- $r = q("SELECT * FROM `event` WHERE event_hash = '%s' AND `uid` = %d LIMIT 1",
- dbesc($event_id),
- intval(local_channel())
- );
-
- $sync_event = $r[0];
-
- if($r) {
- $r = q("delete from event where event_hash = '%s' and uid = %d limit 1",
- dbesc($event_id),
- intval(local_channel())
- );
- if($r) {
- $r = q("update item set resource_type = '', resource_id = '' where resource_type = 'event' and resource_id = '%s' and uid = %d",
- dbesc($event_id),
- intval(local_channel())
- );
- $sync_event['event_deleted'] = 1;
- build_sync_packet(0,array('event' => array($sync_event)));
-
- info( t('Event removed') . EOL);
- }
- else {
- notice( t('Failed to remove event' ) . EOL);
- }
- goaway(z_root() . '/events');
- }
- }
-
-}
diff --git a/mod/fbrowser.php b/mod/fbrowser.php
deleted file mode 100644
index 96e0fe953..000000000
--- a/mod/fbrowser.php
+++ /dev/null
@@ -1,123 +0,0 @@
-<?php
-/**
- * @package Friendica\modules
- * @subpackage FileBrowser
- * @author Fabio Comuni <fabrixxm@kirgroup.com>
- */
-
-require_once('include/photo/photo_driver.php');
-
-/**
- * @param App $a
- */
-function fbrowser_content($a){
-
- if (!local_channel())
- killme();
-
- if (App::$argc==1)
- killme();
-
- //echo "<pre>"; var_dump(App::$argv); killme();
-
- switch(App::$argv[1]){
- case "image":
- $path = array( array(z_root()."/fbrowser/image/", t("Photos")));
- $albums = false;
- $sql_extra = "";
- $sql_extra2 = " ORDER BY created DESC LIMIT 0, 10";
-
- if (App::$argc==2){
- $albums = q("SELECT distinct(`album`) AS `album` FROM `photo` WHERE `uid` = %d ",
- intval(local_channel())
- );
- // anon functions only from 5.3.0... meglio tardi che mai..
- function folder1($el){return array(bin2hex($el['album']),$el['album']);}
- $albums = array_map( "folder1" , $albums);
-
- }
-
- $album = "";
- if (App::$argc==3){
- $album = hex2bin(App::$argv[2]);
- $sql_extra = sprintf("AND `album` = '%s' ",dbesc($album));
- $sql_extra2 = "";
- $path[]=array(z_root()."/fbrowser/image/".App::$argv[2]."/", $album);
- }
-
- $r = q("SELECT `resource_id`, `id`, `filename`, type, min(`scale`) AS `hiq`,max(`scale`) AS `loq`, `description`
- FROM `photo` WHERE `uid` = %d $sql_extra
- GROUP BY `resource_id` $sql_extra2",
- intval(local_channel())
- );
-
- function files1($rr){
- global $a;
- $ph = photo_factory('');
- $types = $ph->supportedTypes();
- $ext = $types[$rr['type']];
-
- $filename_e = $rr['filename'];
-
- return array(
- z_root() . '/photo/' . $rr['resource_id'] . '-' . $rr['hiq'] . '.' .$ext,
- $filename_e,
- z_root() . '/photo/' . $rr['resource_id'] . '-' . $rr['loq'] . '.'. $ext
- );
- }
- $files = array_map("files1", $r);
-
- $tpl = get_markup_template("filebrowser.tpl");
- echo replace_macros($tpl, array(
- '$type' => 'image',
- '$baseurl' => z_root(),
- '$path' => $path,
- '$folders' => $albums,
- '$files' =>$files,
- '$cancel' => t('Cancel'),
- ));
-
-
- break;
- case "file":
- if (App::$argc==2){
- $files = q("SELECT id, filename, filetype FROM `attach` WHERE `uid` = %d ",
- intval(local_channel())
- );
-
- function files2($rr){ global $a;
- list($m1,$m2) = explode("/",$rr['filetype']);
- $filetype = ( (file_exists("images/icons/$m1.png"))?$m1:"zip");
-
- if(App::get_template_engine() === 'internal') {
- $filename_e = template_escape($rr['filename']);
- }
- else {
- $filename_e = $rr['filename'];
- }
-
- return array( z_root() . '/attach/' . $rr['id'], $filename_e, z_root() . '/images/icons/16/' . $filetype . '.png');
- }
- $files = array_map("files2", $files);
- //echo "<pre>"; var_dump($files); killme();
-
-
- $tpl = get_markup_template("filebrowser.tpl");
- echo replace_macros($tpl, array(
- '$type' => 'file',
- '$baseurl' => z_root(),
- '$path' => array( array(z_root()."/fbrowser/image/", t("Files")) ),
- '$folders' => false,
- '$files' =>$files,
- '$cancel' => t('Cancel'),
- ));
-
- }
-
- break;
- }
-
-
- killme();
-
-}
diff --git a/mod/feed.php b/mod/feed.php
deleted file mode 100644
index 087d3f827..000000000
--- a/mod/feed.php
+++ /dev/null
@@ -1,42 +0,0 @@
-<?php
-
-
-require_once('include/items.php');
-
-function feed_init(&$a) {
-
- $params = array();
-
- $params['begin'] = ((x($_REQUEST,'date_begin')) ? $_REQUEST['date_begin'] : NULL_DATE);
- $params['end'] = ((x($_REQUEST,'date_end')) ? $_REQUEST['date_end'] : '');
- $params['type'] = ((stristr(argv(0),'json')) ? 'json' : 'xml');
- $params['pages'] = ((x($_REQUEST,'pages')) ? intval($_REQUEST['pages']) : 0);
- $params['top'] = ((x($_REQUEST,'top')) ? intval($_REQUEST['top']) : 0);
- $params['start'] = ((x($params,'start')) ? intval($params['start']) : 0);
- $params['records'] = ((x($params,'records')) ? intval($params['records']) : 40);
- $params['direction'] = ((x($params,'direction')) ? dbesc($params['direction']) : 'desc');
- $params['cat'] = ((x($_REQUEST,'cat')) ? escape_tags($_REQUEST['cat']) : '');
-
- $channel = '';
- if(argc() > 1) {
- $r = q("select * from channel left join xchan on channel_hash = xchan_hash where channel_address = '%s' limit 1",
- dbesc(argv(1))
- );
- if(!($r && count($r)))
- killme();
-
- $channel = $r[0];
-
- if((intval(get_config('system','block_public'))) && (! get_account_id()))
- killme();
-
- logger('mod_feed: public feed request from ' . $_SERVER['REMOTE_ADDR'] . ' for ' . $channel['channel_address']);
-
- echo get_public_feed($channel,$params);
-
- killme();
- }
-
-}
-
-
diff --git a/mod/ffsapi.php b/mod/ffsapi.php
deleted file mode 100644
index 1f68a87ba..000000000
--- a/mod/ffsapi.php
+++ /dev/null
@@ -1,65 +0,0 @@
-<?php
-
-
-function ffsapi_content(&$a) {
-
-$baseurl = z_root();
-$name = get_config('system','sitename');
-$description = t('Share content from Firefox to $Projectname');
-$author = 'Mike Macgirvin';
-$homepage = 'http://hubzilla.org';
-$activate = t('Activate the Firefox $Projectname provider');
-
-$s = <<< EOT
-
-<script>
-
-var baseurl = '$baseurl';
-
-var data = {
- "origin": baseurl,
- // currently required
- "name": '$name',
- "iconURL": baseurl+"/images/hz-16.png",
- "icon32URL": baseurl+"/images/hz-32.png",
- "icon64URL": baseurl+"/images/hz-64.png",
-
- // at least one of these must be defined
- // "workerURL": baseurl+"/worker.js",
- // "sidebarURL": baseurl+"/sidebar.htm",
- "shareURL": baseurl+"/rpost?f=&url=%{url}",
-
- // status buttons are scheduled for Firefox 26 or 27
- //"statusURL": baseurl+"/statusPanel.html",
-
- // social bookmarks are available in Firefox 26
- "markURL": baseurl+"/rbmark?f=&url=%{url}&title=%{title}",
- // icons should be 32x32 pixels
- // "markedIcon": baseurl+"/images/checkbox-checked-32.png",
- // "unmarkedIcon": baseurl+"/images/checkbox-unchecked-32.png",
- "unmarkedIcon": baseurl+"/images/hz-bookmark-32.png",
-
- // should be available for display purposes
- "description": "$description",
- "author": "$author",
- "homepageURL": "$homepage",
-
- // optional
- "version": "1.0"
-}
-
-function activate(node) {
- var event = new CustomEvent("ActivateSocialFeature");
- var jdata = JSON.stringify(data);
- node.setAttribute("data-service", JSON.stringify(data));
- node.dispatchEvent(event);
-}
-</script>
-
-<button onclick="activate(this)" title="$activate" class="btn btn-primary">$activate</button>
-
-EOT;
-
-return $s;
-
-}
diff --git a/mod/fhublocs.php b/mod/fhublocs.php
deleted file mode 100644
index 7eab2b811..000000000
--- a/mod/fhublocs.php
+++ /dev/null
@@ -1,80 +0,0 @@
-<?php
-
-require_once('include/zot.php');
-require_once('include/crypto.php');
-
-/* fix missing or damaged hublocs */
-
-function fhublocs_content(&$a) {
-
- if(! is_site_admin())
- return;
-
- $o = '';
-
- $r = q("select * from channel where channel_removed = 0");
- $sitekey = get_config('system','pubkey');
-
- if($r) {
- foreach($r as $rr) {
- $found = false;
- $primary_address = '';
- $x = zot_get_hublocs($rr['channel_hash']);
- if($x) {
- foreach($x as $xx) {
- if($xx['hubloc_url'] === z_root() && $xx['hubloc_sitekey'] === $sitekey) {
- $found = true;
- break;
- }
- }
- if($found) {
- $o .= 'Hubloc exists for ' . $rr['channel_name'] . EOL;
- continue;
- }
- }
- $y = q("select xchan_addr from xchan where xchan_hash = '%s' limit 1",
- dbesc($rr['channel_hash'])
- );
- if($y)
- $primary_address = $y[0]['xchan_addr'];
-
- $hub_address = $rr['channel']['channel_address'] . '@' . App::get_hostname();
-
-
- $primary = (($hub_address === $primary_address) ? 1 : 0);
- if(! $y)
- $primary = 1;
-
- $m = q("delete from hubloc where hubloc_hash = '%s' and hubloc_url = '%s' ",
- dbesc($rr['channel_hash']),
- dbesc(z_root())
- );
-
- // Create a verified hub location pointing to this site.
-
- $h = q("insert into hubloc ( hubloc_guid, hubloc_guid_sig, hubloc_hash, hubloc_addr, hubloc_primary, hubloc_url, hubloc_url_sig, hubloc_host, hubloc_callback, hubloc_sitekey, hubloc_network )
- values ( '%s', '%s', '%s', '%s', %d, '%s', '%s', '%s', '%s', '%s', '%s' )",
- dbesc($rr['channel_guid']),
- dbesc($rr['channel_guid_sig']),
- dbesc($rr['channel_hash']),
- dbesc($rr['channel_address'] . '@' . App::get_hostname()),
- intval($primary),
- dbesc(z_root()),
- dbesc(base64url_encode(rsa_sign(z_root(),$rr['channel_prvkey']))),
- dbesc(App::get_hostname()),
- dbesc(z_root() . '/post'),
- dbesc($sitekey),
- dbesc('zot')
- );
-
- if($h)
- $o . 'local hubloc created for ' . $rr['channel_name'] . EOL;
- else
- $o .= 'DB update failed for ' . $rr['channel_name'] . EOL;
-
- }
-
- return $o;
-
- }
-} \ No newline at end of file
diff --git a/mod/filer.php b/mod/filer.php
deleted file mode 100644
index b09c73f0a..000000000
--- a/mod/filer.php
+++ /dev/null
@@ -1,55 +0,0 @@
-<?php
-
-require_once('include/security.php');
-require_once('include/bbcode.php');
-require_once('include/items.php');
-
-
-function filer_content(&$a) {
-
- if(! local_channel()) {
- killme();
- }
-
- $term = unxmlify(trim($_GET['term']));
- $item_id = ((App::$argc > 1) ? intval(App::$argv[1]) : 0);
-
- logger('filer: tag ' . $term . ' item ' . $item_id);
-
- if($item_id && strlen($term)){
- // file item
- store_item_tag(local_channel(),$item_id,TERM_OBJ_POST,TERM_FILE,$term,'');
-
- // protect the entire conversation from periodic expiration
-
- $r = q("select parent from item where id = %d and uid = %d limit 1",
- intval($item_id),
- intval(local_channel())
- );
- if($r) {
- $x = q("update item set item_retained = 1 where id = %d and uid = %d",
- intval($r[0]['parent']),
- intval(local_channel())
- );
- }
- }
- else {
- $filetags = array();
- $r = q("select distinct(term) from term where uid = %d and type = %d order by term asc",
- intval(local_channel()),
- intval(TERM_FILE)
- );
- if(count($r)) {
- foreach($r as $rr)
- $filetags[] = $rr['term'];
- }
- $tpl = get_markup_template("filer_dialog.tpl");
- $o = replace_macros($tpl, array(
- '$field' => array('term', t("Save to Folder:"), '', '', $filetags, t('- select -')),
- '$submit' => t('Save'),
- ));
-
- echo $o;
- }
- killme();
-}
diff --git a/mod/filerm.php b/mod/filerm.php
deleted file mode 100644
index 82eed83f8..000000000
--- a/mod/filerm.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-
-function filerm_content(&$a) {
-
- if(! local_channel()) {
- killme();
- }
-
- $term = trim($_GET['term']);
- $cat = trim($_GET['cat']);
-
- $category = (($cat) ? true : false);
- if($category)
- $term = $cat;
-
- $item_id = ((App::$argc > 1) ? intval(App::$argv[1]) : 0);
-
- logger('filerm: tag ' . $term . ' item ' . $item_id);
-
- if($item_id && strlen($term)) {
- $r = q("delete from term where uid = %d and type = %d and oid = %d and term = '%s'",
- intval(local_channel()),
- intval(($category) ? TERM_CATEGORY : TERM_FILE),
- intval($item_id),
- dbesc($term)
- );
- }
-
- if(x($_SESSION,'return_url'))
- goaway(z_root() . '/' . $_SESSION['return_url']);
-
- killme();
-}
diff --git a/mod/filestorage.php b/mod/filestorage.php
deleted file mode 100644
index 1feffa9ee..000000000
--- a/mod/filestorage.php
+++ /dev/null
@@ -1,167 +0,0 @@
-<?php
-/**
- * @file mod/filestorage.php
- *
- */
-
-require_once('include/attach.php');
-
-/**
- *
- * @param object &$a
- */
-function filestorage_post(&$a) {
-
- $channel_id = ((x($_POST, 'uid')) ? intval($_POST['uid']) : 0);
-
- if((! $channel_id) || (! local_channel()) || ($channel_id != local_channel())) {
- notice( t('Permission denied.') . EOL);
- return;
- }
-
- $recurse = ((x($_POST, 'recurse')) ? intval($_POST['recurse']) : 0);
- $resource = ((x($_POST, 'filehash')) ? notags($_POST['filehash']) : '');
- $notify = ((x($_POST, 'notify')) ? intval($_POST['notify']) : 0);
-
- if(! $resource) {
- notice(t('Item not found.') . EOL);
- return;
- }
-
- $channel = App::get_channel();
-
- $acl = new Zotlabs\Access\AccessList($channel);
- $acl->set_from_array($_REQUEST);
- $x = $acl->get();
-
- $cloudPath = get_parent_cloudpath($channel_id, $channel['channel_address'], $resource);
-
- //get the object before permissions change so we can catch eventual former allowed members
- $object = get_file_activity_object($channel_id, $resource, $cloudPath);
-
- attach_change_permissions($channel_id, $resource, $x['allow_cid'], $x['allow_gid'], $x['deny_cid'], $x['deny_gid'], $recurse);
-
- file_activity($channel_id, $object, $x['allow_cid'], $x['allow_gid'], $x['deny_cid'], $x['deny_gid'], 'post', $notify);
-
- goaway($cloudPath);
-}
-
-function filestorage_content(&$a) {
-
- if(argc() > 1)
- $which = argv(1);
- else {
- notice( t('Requested profile is not available.') . EOL );
- App::$error = 404;
- return;
- }
-
- $r = q("select * from channel where channel_address = '%s'",
- dbesc($which)
- );
- if($r) {
- $channel = $r[0];
- $owner = intval($r[0]['channel_id']);
- }
-
- $observer = App::get_observer();
- $ob_hash = (($observer) ? $observer['xchan_hash'] : '');
-
- $perms = get_all_perms($owner, $ob_hash);
-
- if(! $perms['view_storage']) {
- notice( t('Permission denied.') . EOL);
- return;
- }
-
- // Since we have ACL'd files in the wild, but don't have ACL here yet, we
- // need to return for anyone other than the owner, despite the perms check for now.
-
- $is_owner = (((local_channel()) && ($owner == local_channel())) ? true : false);
- if(! $is_owner) {
- info( t('Permission Denied.') . EOL );
- return;
- }
-
- if(argc() > 3 && argv(3) === 'delete') {
- if(! $perms['write_storage']) {
- notice( t('Permission denied.') . EOL);
- return;
- }
-
- $file = intval(argv(2));
- $r = q("SELECT hash FROM attach WHERE id = %d AND uid = %d LIMIT 1",
- dbesc($file),
- intval($owner)
- );
- if(! $r) {
- notice( t('File not found.') . EOL);
- goaway(z_root() . '/cloud/' . $which);
- }
-
- $f = $r[0];
- $channel = App::get_channel();
-
- $parentpath = get_parent_cloudpath($channel['channel_id'], $channel['channel_address'], $f['hash']);
-
- attach_delete($owner, $f['hash']);
-
- goaway($parentpath);
- }
-
- if(argc() > 3 && argv(3) === 'edit') {
- require_once('include/acl_selectors.php');
- if(! $perms['write_storage']) {
- notice( t('Permission denied.') . EOL);
- return;
- }
- $file = intval(argv(2));
-
- $r = q("select id, uid, folder, filename, revision, flags, is_dir, os_storage, hash, allow_cid, allow_gid, deny_cid, deny_gid from attach where id = %d and uid = %d limit 1",
- intval($file),
- intval($owner)
- );
-
- $f = $r[0];
- $channel = App::get_channel();
-
- $cloudpath = get_cloudpath($f) . (intval($f['is_dir']) ? '?f=&davguest=1' : '');
- $parentpath = get_parent_cloudpath($channel['channel_id'], $channel['channel_address'], $f['hash']);
-
- $aclselect_e = populate_acl($f, false);
- $is_a_dir = (intval($f['is_dir']) ? true : false);
-
- $lockstate = (($f['allow_cid'] || $f['allow_gid'] || $f['deny_cid'] || $f['deny_gid']) ? 'lock' : 'unlock');
-
- // Encode path that is used for link so it's a valid URL
- // Keep slashes as slashes, otherwise mod_rewrite doesn't work correctly
- $encoded_path = str_replace('%2F', '/', rawurlencode($cloudpath));
-
- $o = replace_macros(get_markup_template('attach_edit.tpl'), array(
- '$header' => t('Edit file permissions'),
- '$file' => $f,
- '$cloudpath' => z_root() . '/' . $encoded_path,
- '$parentpath' => $parentpath,
- '$uid' => $channel['channel_id'],
- '$channelnick' => $channel['channel_address'],
- '$permissions' => t('Permissions'),
- '$aclselect' => $aclselect_e,
- '$lockstate' => $lockstate,
- '$permset' => t('Set/edit permissions'),
- '$recurse' => array('recurse', t('Include all files and sub folders'), 0, '', array(t('No'), t('Yes'))),
- '$backlink' => t('Return to file list'),
- '$isadir' => $is_a_dir,
- '$cpdesc' => t('Copy/paste this code to attach file to a post'),
- '$cpldesc' => t('Copy/paste this URL to link file from a web page'),
- '$submit' => t('Submit'),
- '$attach_btn_title' => t('Share this file'),
- '$link_btn_title' => t('Show URL to this file'),
- '$notify' => array('notify', t('Notify your contacts about this file'), 0, '', array(t('No'), t('Yes')))
- ));
-
- echo $o;
- killme();
- }
-
- goaway(z_root() . '/cloud/' . $which);
-}
diff --git a/mod/follow.php b/mod/follow.php
deleted file mode 100644
index 207a99dd7..000000000
--- a/mod/follow.php
+++ /dev/null
@@ -1,60 +0,0 @@
-<?php
-
-
-require_once('include/follow.php');
-
-function follow_init(&$a) {
-
- if(! local_channel()) {
- return;
- }
-
- $uid = local_channel();
- $url = notags(trim($_REQUEST['url']));
- $return_url = $_SESSION['return_url'];
- $confirm = intval($_REQUEST['confirm']);
-
- $channel = App::get_channel();
-
- $result = new_contact($uid,$url,$channel,true,$confirm);
-
- if($result['success'] == false) {
- if($result['message'])
- notice($result['message']);
- goaway($return_url);
- }
-
- info( t('Channel added.') . EOL);
-
- $clone = array();
- foreach($result['abook'] as $k => $v) {
- if(strpos($k,'abook_') === 0) {
- $clone[$k] = $v;
- }
- }
- unset($clone['abook_id']);
- unset($clone['abook_account']);
- unset($clone['abook_channel']);
-
- $abconfig = load_abconfig($channel['channel_hash'],$clone['abook_xchan']);
- if($abconfig)
- $clone['abconfig'] = $abconfig;
-
- build_sync_packet(0 /* use the current local_channel */, array('abook' => array($clone)));
-
-
- // If we can view their stream, pull in some posts
-
- if(($result['abook']['abook_their_perms'] & PERMS_R_STREAM) || ($result['abook']['xchan_network'] === 'rss'))
- proc_run('php','include/onepoll.php',$result['abook']['abook_id']);
-
- goaway(z_root() . '/connedit/' . $result['abook']['abook_id'] . '?f=&follow=1');
-
-}
-
-function follow_content(&$a) {
-
- if(! local_channel()) {
- return login();
- }
-} \ No newline at end of file
diff --git a/mod/fsuggest.php b/mod/fsuggest.php
deleted file mode 100644
index 261679e6b..000000000
--- a/mod/fsuggest.php
+++ /dev/null
@@ -1,112 +0,0 @@
-<?php
-
-
-function fsuggest_post(&$a) {
-
- if(! local_channel()) {
- return;
- }
-
- if(App::$argc != 2)
- return;
-
- $contact_id = intval(App::$argv[1]);
-
- $r = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
- intval($contact_id),
- intval(local_channel())
- );
- if(! count($r)) {
- notice( t('Contact not found.') . EOL);
- return;
- }
- $contact = $r[0];
-
- $new_contact = intval($_POST['suggest']);
-
- $hash = random_string();
-
- $note = escape_tags(trim($_POST['note']));
-
- if($new_contact) {
- $r = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
- intval($new_contact),
- intval(local_channel())
- );
- if(count($r)) {
-
- $x = q("INSERT INTO `fsuggest` ( `uid`,`cid`,`name`,`url`,`request`,`photo`,`note`,`created`)
- VALUES ( %d, %d, '%s','%s','%s','%s','%s','%s')",
- intval(local_channel()),
- intval($contact_id),
- dbesc($r[0]['name']),
- dbesc($r[0]['url']),
- dbesc($r[0]['request']),
- dbesc($r[0]['photo']),
- dbesc($hash),
- dbesc(datetime_convert())
- );
- $r = q("SELECT `id` FROM `fsuggest` WHERE `note` = '%s' AND `uid` = %d LIMIT 1",
- dbesc($hash),
- intval(local_channel())
- );
- if(count($r)) {
- $fsuggest_id = $r[0]['id'];
- q("UPDATE `fsuggest` SET `note` = '%s' WHERE `id` = %d AND `uid` = %d",
- dbesc($note),
- intval($fsuggest_id),
- intval(local_channel())
- );
- proc_run('php', 'include/notifier.php', 'suggest' , $fsuggest_id);
- }
-
- info( t('Friend suggestion sent.') . EOL);
- }
-
- }
-
-
-}
-
-
-
-function fsuggest_content(&$a) {
-
- require_once('include/acl_selectors.php');
-
- if(! local_channel()) {
- notice( t('Permission denied.') . EOL);
- return;
- }
-
- if(App::$argc != 2)
- return;
-
- $contact_id = intval(App::$argv[1]);
-
- $r = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
- intval($contact_id),
- intval(local_channel())
- );
- if(! count($r)) {
- notice( t('Contact not found.') . EOL);
- return;
- }
- $contact = $r[0];
-
- $o = '<h3>' . t('Suggest Friends') . '</h3>';
-
- $o .= '<div id="fsuggest-desc" >' . sprintf( t('Suggest a friend for %s'), $contact['name']) . '</div>';
-
- $o .= '<form id="fsuggest-form" action="fsuggest/' . $contact_id . '" method="post" >';
-
-// FIXME contact_selector deprecated, removed
-// $o .= contact_selector('suggest','suggest-select', false,
-// array('size' => 4, 'exclude' => $contact_id, 'networks' => 'DFRN_ONLY', 'single' => true));
-
-
- $o .= '<div id="fsuggest-submit-wrapper"><input id="fsuggest-submit" type="submit" name="submit" value="' . t('Submit') . '" /></div>';
- $o .= '</form>';
-
- return $o;
-} \ No newline at end of file
diff --git a/mod/getfile.php b/mod/getfile.php
deleted file mode 100644
index c0916de79..000000000
--- a/mod/getfile.php
+++ /dev/null
@@ -1,97 +0,0 @@
-<?php
-
-/**
- * module: getfile
- *
- * used for synchronising files and photos across clones
- *
- * The site initiating the file operation will send a sync packet to known clones.
- * They will respond by building the DB structures they require, then will provide a
- * post request to this site to grab the file data. This is sent as a stream direct to
- * disk at the other end, avoiding memory issues.
- *
- * Since magic-auth cannot easily be used by the CURL process at the other end,
- * we will require a signed request which includes a timestamp. This should not be
- * used without SSL and is potentially vulnerable to replay if an attacker decrypts
- * the SSL traffic fast enough. The amount of time slop is configurable but defaults
- * to 3 minutes.
- *
- */
-
-
-
-require_once('include/Contact.php');
-require_once('include/attach.php');
-
-function getfile_post(&$a) {
-
- $hash = $_POST['hash'];
- $time = $_POST['time'];
- $sig = $_POST['signature'];
- $resource = $_POST['resource'];
- $revision = intval($_POST['revision']);
-
- if(! $hash)
- killme();
-
- $channel = channelx_by_hash($hash);
-
- if((! $channel) || (! $time) || (! $sig))
- killme();
-
- $slop = intval(get_pconfig($channel['channel_id'],'system','getfile_time_slop'));
- if($slop < 1)
- $slop = 3;
-
- $d1 = datetime_convert('UTC','UTC',"now + $slop minutes");
- $d2 = datetime_convert('UTC','UTC',"now - $slop minutes");
-
- if(($time > $d1) || ($time < $d2)) {
- logger('time outside allowable range');
- killme();
- }
-
- if(! rsa_verify($hash . '.' . $time,base64url_decode($sig),$channel['channel_pubkey'])) {
- logger('verify failed.');
- killme();
- }
-
-
- $r = attach_by_hash($resource,$revision);
-
- if(! $r['success']) {
- notice( $r['message'] . EOL);
- return;
- }
-
-
- $unsafe_types = array('text/html','text/css','application/javascript');
-
- if(in_array($r['data']['filetype'],$unsafe_types)) {
- header('Content-type: text/plain');
- }
- else {
- header('Content-type: ' . $r['data']['filetype']);
- }
-
- header('Content-disposition: attachment; filename="' . $r['data']['filename'] . '"');
- if(intval($r['data']['os_storage'])) {
- $fname = dbunescbin($r['data']['data']);
- if(strpos($fname,'store') !== false)
- $istream = fopen($fname,'rb');
- else
- $istream = fopen('store/' . $channel['channel_address'] . '/' . $fname,'rb');
- $ostream = fopen('php://output','wb');
- if($istream && $ostream) {
- pipe_streams($istream,$ostream);
- fclose($istream);
- fclose($ostream);
- }
- }
- else
- echo dbunescbin($r['data']['data']);
- killme();
-
-
-
-} \ No newline at end of file
diff --git a/mod/group.php b/mod/group.php
deleted file mode 100644
index d5f2129bd..000000000
--- a/mod/group.php
+++ /dev/null
@@ -1,238 +0,0 @@
-<?php
-
-require_once('include/group.php');
-
-
-function group_post(&$a) {
-
- if(! local_channel()) {
- notice( t('Permission denied.') . EOL);
- return;
- }
-
- if((argc() == 2) && (argv(1) === 'new')) {
- check_form_security_token_redirectOnErr('/group/new', 'group_edit');
-
- $name = notags(trim($_POST['groupname']));
- $public = intval($_POST['public']);
- $r = group_add(local_channel(),$name,$public);
- if($r) {
- info( t('Privacy group created.') . EOL );
- $r = group_byname(local_channel(),$name);
- if($r)
- goaway(z_root() . '/group/' . $r);
- }
- else
- notice( t('Could not create privacy group.') . EOL );
- goaway(z_root() . '/group');
-
- }
- if((argc() == 2) && (intval(argv(1)))) {
- check_form_security_token_redirectOnErr('/group', 'group_edit');
-
- $r = q("SELECT * FROM `groups` WHERE `id` = %d AND `uid` = %d LIMIT 1",
- intval(argv(1)),
- intval(local_channel())
- );
- if(! $r) {
- notice( t('Privacy group not found.') . EOL );
- goaway(z_root() . '/connections');
-
- }
- $group = $r[0];
- $groupname = notags(trim($_POST['groupname']));
- $public = intval($_POST['public']);
-
- if((strlen($groupname)) && (($groupname != $group['name']) || ($public != $group['visible']))) {
- $r = q("UPDATE `groups` SET `name` = '%s', visible = %d WHERE `uid` = %d AND `id` = %d",
- dbesc($groupname),
- intval($public),
- intval(local_channel()),
- intval($group['id'])
- );
- if($r)
- info( t('Privacy group updated.') . EOL );
- }
-
- goaway(z_root() . '/group/' . argv(1) . '/' . argv(2));
- }
- return;
-}
-
-function group_content(&$a) {
- $change = false;
-
- logger('mod_group: ' . App::$cmd,LOGGER_DEBUG);
-
- if(! local_channel()) {
- notice( t('Permission denied') . EOL);
- return;
- }
-
- // Switch to text mode interface if we have more than 'n' contacts or group members
-
- $switchtotext = get_pconfig(local_channel(),'system','groupedit_image_limit');
- if($switchtotext === false)
- $switchtotext = get_config('system','groupedit_image_limit');
- if($switchtotext === false)
- $switchtotext = 400;
-
- $tpl = get_markup_template('group_edit.tpl');
- $context = array('$submit' => t('Submit'));
-
- if((argc() == 2) && (argv(1) === 'new')) {
-
- return replace_macros($tpl, $context + array(
- '$title' => t('Create a group of channels.'),
- '$gname' => array('groupname',t('Privacy group name: '), '', ''),
- '$gid' => 'new',
- '$public' => array('public',t('Members are visible to other channels'), false, ''),
- '$form_security_token' => get_form_security_token("group_edit"),
- ));
-
-
- }
-
- if((argc() == 3) && (argv(1) === 'drop')) {
- check_form_security_token_redirectOnErr('/group', 'group_drop', 't');
-
- if(intval(argv(2))) {
- $r = q("SELECT `name` FROM `groups` WHERE `id` = %d AND `uid` = %d LIMIT 1",
- intval(argv(2)),
- intval(local_channel())
- );
- if($r)
- $result = group_rmv(local_channel(),$r[0]['name']);
- if($result)
- info( t('Privacy group removed.') . EOL);
- else
- notice( t('Unable to remove privacy group.') . EOL);
- }
- goaway(z_root() . '/group');
- // NOTREACHED
- }
-
-
- if((argc() > 2) && intval(argv(1)) && argv(2)) {
-
- check_form_security_token_ForbiddenOnErr('group_member_change', 't');
-
- $r = q("SELECT abook_xchan from abook left join xchan on abook_xchan = xchan_hash where abook_xchan = '%s' and abook_channel = %d and xchan_deleted = 0 and abook_self = 0 and abook_blocked = 0 and abook_pending = 0 limit 1",
- dbesc(base64url_decode(argv(2))),
- intval(local_channel())
- );
- if(count($r))
- $change = base64url_decode(argv(2));
-
- }
-
- if((argc() > 1) && (intval(argv(1)))) {
-
- require_once('include/acl_selectors.php');
- $r = q("SELECT * FROM `groups` WHERE `id` = %d AND `uid` = %d AND `deleted` = 0 LIMIT 1",
- intval(argv(1)),
- intval(local_channel())
- );
- if(! $r) {
- notice( t('Privacy group not found.') . EOL );
- goaway(z_root() . '/connections');
- }
- $group = $r[0];
-
-
- $members = group_get_members($group['id']);
-
- $preselected = array();
- if(count($members)) {
- foreach($members as $member)
- if(! in_array($member['xchan_hash'],$preselected))
- $preselected[] = $member['xchan_hash'];
- }
-
- if($change) {
-
- if(in_array($change,$preselected)) {
- group_rmv_member(local_channel(),$group['name'],$change);
- }
- else {
- group_add_member(local_channel(),$group['name'],$change);
- }
-
- $members = group_get_members($group['id']);
-
- $preselected = array();
- if(count($members)) {
- foreach($members as $member)
- $preselected[] = $member['xchan_hash'];
- }
- }
-
- $drop_tpl = get_markup_template('group_drop.tpl');
- $drop_txt = replace_macros($drop_tpl, array(
- '$id' => $group['id'],
- '$delete' => t('Delete'),
- '$form_security_token' => get_form_security_token("group_drop"),
- ));
-
-
- $context = $context + array(
- '$title' => t('Privacy group editor'),
- '$gname' => array('groupname',t('Privacy group name: '),$group['name'], ''),
- '$gid' => $group['id'],
- '$drop' => $drop_txt,
- '$public' => array('public',t('Members are visible to other channels'), $group['visible'], ''),
- '$form_security_token' => get_form_security_token('group_edit'),
- );
-
- }
-
- if(! isset($group))
- return;
-
- $groupeditor = array(
- 'label_members' => t('Members'),
- 'members' => array(),
- 'label_contacts' => t('All Connected Channels'),
- 'contacts' => array(),
- );
-
- $sec_token = addslashes(get_form_security_token('group_member_change'));
- $textmode = (($switchtotext && (count($members) > $switchtotext)) ? true : false);
- foreach($members as $member) {
- if($member['xchan_url']) {
- $member['archived'] = (intval($member['abook_archived']) ? true : false);
- $member['click'] = 'groupChangeMember(' . $group['id'] . ',\'' . base64url_encode($member['xchan_hash']) . '\',\'' . $sec_token . '\'); return false;';
- $groupeditor['members'][] = micropro($member,true,'mpgroup', $textmode);
- }
- else
- group_rmv_member(local_channel(),$group['name'],$member['xchan_hash']);
- }
-
- $r = q("SELECT abook.*, xchan.* FROM `abook` left join xchan on abook_xchan = xchan_hash WHERE `abook_channel` = %d AND abook_self = 0 and abook_blocked = 0 and abook_pending = 0 and xchan_deleted = 0 order by xchan_name asc",
- intval(local_channel())
- );
-
- if(count($r)) {
- $textmode = (($switchtotext && (count($r) > $switchtotext)) ? true : false);
- foreach($r as $member) {
- if(! in_array($member['xchan_hash'],$preselected)) {
- $member['archived'] = (intval($member['abook_archived']) ? true : false);
- $member['click'] = 'groupChangeMember(' . $group['id'] . ',\'' . base64url_encode($member['xchan_hash']) . '\',\'' . $sec_token . '\'); return false;';
- $groupeditor['contacts'][] = micropro($member,true,'mpall', $textmode);
- }
- }
- }
-
- $context['$groupeditor'] = $groupeditor;
- $context['$desc'] = t('Click on a channel to add or remove.');
-
- if($change) {
- $tpl = get_markup_template('groupeditor.tpl');
- echo replace_macros($tpl, $context);
- killme();
- }
-
- return replace_macros($tpl, $context);
-
-}
-
diff --git a/mod/hcard.php b/mod/hcard.php
deleted file mode 100644
index 9954e0838..000000000
--- a/mod/hcard.php
+++ /dev/null
@@ -1,54 +0,0 @@
-<?php
-
-function hcard_init(&$a) {
-
- if(argc() > 1)
- $which = argv(1);
- else {
- notice( t('Requested profile is not available.') . EOL );
- App::$error = 404;
- return;
- }
-
- $profile = '';
- $channel = App::get_channel();
-
- if((local_channel()) && (argc() > 2) && (argv(2) === 'view')) {
- $which = $channel['channel_address'];
- $profile = argv(1);
- $r = q("select profile_guid from profile where id = %d and uid = %d limit 1",
- intval($profile),
- intval(local_channel())
- );
- if(! $r)
- $profile = '';
- $profile = $r[0]['profile_guid'];
- }
-
- App::$page['htmlhead'] .= '<link rel="alternate" type="application/atom+xml" href="' . z_root() . '/feed/' . $which .'" />' . "\r\n" ;
-
- if(! $profile) {
- $x = q("select channel_id as profile_uid from channel where channel_address = '%s' limit 1",
- dbesc(argv(1))
- );
- if($x) {
- App::$profile = $x[0];
- }
- }
-
- profile_load($a,$which,$profile);
-
-
-}
-
-
-function hcard_content(&$a) {
-
- require_once('include/widgets.php');
- return widget_profile(array());
-
-
-
-}
-
-
diff --git a/mod/help.php b/mod/help.php
deleted file mode 100644
index fb0339cd9..000000000
--- a/mod/help.php
+++ /dev/null
@@ -1,281 +0,0 @@
-<?php
-
-/**
- * You can create local site resources in doc/Site.md and either link to doc/Home.md for the standard resources
- * or use our include mechanism to include it on your local page.
- *
- * #include doc/Home.md;
- *
- * The syntax is somewhat strict.
- *
- */
-
-
-
-function load_doc_file($s) {
- $lang = App::$language;
- if(! isset($lang))
- $lang = 'en';
- $b = basename($s);
- $d = dirname($s);
-
- $c = find_doc_file("$d/$lang/$b");
- if($c)
- return $c;
- $c = find_doc_file($s);
- if($c)
- return $c;
- return '';
-}
-
-function find_doc_file($s) {
- if(file_exists($s))
- return file_get_contents($s);
- return '';
-}
-
-function search_doc_files($s) {
-
- $a = get_app();
-
- $itemspage = get_pconfig(local_channel(),'system','itemspage');
- App::set_pager_itemspage(((intval($itemspage)) ? $itemspage : 20));
- $pager_sql = sprintf(" LIMIT %d OFFSET %d ", intval(App::$pager['itemspage']), intval(App::$pager['start']));
-
- $regexop = db_getfunc('REGEXP');
-
- $r = q("select item_id.sid, item.* from item left join item_id on item.id = item_id.iid where service = 'docfile' and
- body $regexop '%s' and item_type = %d $pager_sql",
- dbesc($s),
- intval(ITEM_TYPE_DOC)
- );
-
- $r = fetch_post_tags($r,true);
-
- for($x = 0; $x < count($r); $x ++) {
-
- $r[$x]['text'] = $r[$x]['body'];
-
- $r[$x]['rank'] = 0;
- if($r[$x]['term']) {
- foreach($r[$x]['term'] as $t) {
- if(stristr($t['term'],$s)) {
- $r[$x]['rank'] ++;
- }
- }
- }
- if(stristr($r[$x]['sid'],$s))
- $r[$x]['rank'] ++;
- $r[$x]['rank'] += substr_count(strtolower($r[$x]['text']),strtolower($s));
- // bias the results to the observer's native language
- if($r[$x]['lang'] === App::$language)
- $r[$x]['rank'] = $r[$x]['rank'] + 10;
-
- }
- usort($r,'doc_rank_sort');
- return $r;
-}
-
-
-function doc_rank_sort($s1,$s2) {
- if($s1['rank'] == $s2['rank'])
- return 0;
- return (($s1['rank'] < $s2['rank']) ? 1 : (-1));
-}
-
-
-function load_context_help() {
-
- $path = App::$cmd;
- $args = App::$argv;
-
- while($path) {
- $context_help = load_doc_file('doc/context/' . $path . '/help.html');
- if($context_help)
- break;
- array_pop($args);
- $path = implode($args,'/');
- }
-
- return $context_help;
-}
-
-
-function store_doc_file($s) {
-
- if(is_dir($s))
- return;
-
- $item = array();
- $sys = get_sys_channel();
-
- $item['aid'] = 0;
- $item['uid'] = $sys['channel_id'];
-
-
- if(strpos($s,'.md'))
- $mimetype = 'text/markdown';
- elseif(strpos($s,'.html'))
- $mimetype = 'text/html';
- else
- $mimetype = 'text/bbcode';
-
- require_once('include/html2plain.php');
-
- $item['body'] = html2plain(prepare_text(file_get_contents($s),$mimetype, true));
- $item['mimetype'] = 'text/plain';
-
- $item['plink'] = z_root() . '/' . str_replace('doc','help',$s);
- $item['owner_xchan'] = $item['author_xchan'] = $sys['channel_hash'];
- $item['item_type'] = ITEM_TYPE_DOC;
-
- $r = q("select item.* from item left join item_id on item.id = item_id.iid where service = 'docfile' and
- sid = '%s' and item_type = %d limit 1",
- dbesc($s),
- intval(ITEM_TYPE_DOC)
- );
-
- if($r) {
- $item['id'] = $r[0]['id'];
- $item['mid'] = $item['parent_mid'] = $r[0]['mid'];
- $x = item_store_update($item);
- }
- else {
- $item['mid'] = $item['parent_mid'] = item_message_id();
- $x = item_store($item);
- }
-
- if($x['success']) {
- update_remote_id($sys,$x['item_id'],ITEM_TYPE_DOC,$s,'docfile',0,$item['mid']);
- }
-
-
-}
-
-
-function help_content(&$a) {
- nav_set_selected('help');
-
- if($_REQUEST['search']) {
-
- $o .= '<div id="help-content" class="generic-content-wrapper">';
- $o .= '<div class="section-title-wrapper">';
- $o .= '<h2>' . t('Documentation Search') . ' - ' . htmlspecialchars($_REQUEST['search']) . '</h2>';
- $o .= '</div>';
- $o .= '<div class="section-content-wrapper">';
-
- $r = search_doc_files($_REQUEST['search']);
- if($r) {
- $o .= '<ul class="help-searchlist">';
- foreach($r as $rr) {
- $dirname = dirname($rr['sid']);
- $fname = basename($rr['sid']);
- $fname = substr($fname,0,strrpos($fname,'.'));
- $path = trim(substr($dirname,4),'/');
-
- $o .= '<li><a href="help/' . (($path) ? $path . '/' : '') . $fname . '" >' . ucwords(str_replace('_',' ',notags($fname))) . '</a><br />' .
- str_replace('$Projectname',Zotlabs\Project\System::get_platform_name(),substr($rr['text'],0,200)) . '...<br /><br /></li>';
-
- }
- $o .= '</ul>';
- $o .= '</div>';
- $o .= '</div>';
- }
- return $o;
- }
-
-
- global $lang;
-
- $doctype = 'markdown';
-
- $text = '';
-
- if(argc() > 1) {
- $path = '';
- for($x = 1; $x < argc(); $x ++) {
- if(strlen($path))
- $path .= '/';
- $path .= argv($x);
- }
- $title = basename($path);
-
- $text = load_doc_file('doc/' . $path . '.md');
- App::$page['title'] = t('Help:') . ' ' . ucwords(str_replace('-',' ',notags($title)));
-
- if(! $text) {
- $text = load_doc_file('doc/' . $path . '.bb');
- if($text)
- $doctype = 'bbcode';
- App::$page['title'] = t('Help:') . ' ' . ucwords(str_replace('_',' ',notags($title)));
- }
- if(! $text) {
- $text = load_doc_file('doc/' . $path . '.html');
- if($text)
- $doctype = 'html';
- App::$page['title'] = t('Help:') . ' ' . ucwords(str_replace('-',' ',notags($title)));
- }
- }
-
- if(! $text) {
- $text = load_doc_file('doc/Site.md');
- App::$page['title'] = t('Help');
- }
- if(! $text) {
- $doctype = 'bbcode';
- $text = load_doc_file('doc/main.bb');
- App::$page['title'] = t('Help');
- }
-
- if(! strlen($text)) {
- header($_SERVER["SERVER_PROTOCOL"] . ' 404 ' . t('Not Found'));
- $tpl = get_markup_template("404.tpl");
- return replace_macros($tpl, array(
- '$message' => t('Page not found.' )
- ));
- }
-
- if($doctype === 'html')
- $content = $text;
- if($doctype === 'markdown') {
- require_once('library/markdown.php');
- # escape #include tags
- $text = preg_replace('/#include/ism', '%%include', $text);
- $content = Markdown($text);
- $content = preg_replace('/%%include/ism', '#include', $content);
- }
- if($doctype === 'bbcode') {
- require_once('include/bbcode.php');
- $content = bbcode($text);
- // bbcode retargets external content to new windows. This content is internal.
- $content = str_replace(' target="_blank"','',$content);
- }
-
- $content = preg_replace_callback("/#include (.*?)\;/ism", 'preg_callback_help_include', $content);
-
- return replace_macros(get_markup_template("help.tpl"), array(
- '$title' => t('$Projectname Documentation'),
- '$content' => translate_projectname($content)
- ));
-
-}
-
-
-function preg_callback_help_include($matches) {
-
- if($matches[1]) {
- $include = str_replace($matches[0],load_doc_file($matches[1]),$matches[0]);
- if(preg_match('/\.bb$/', $matches[1]) || preg_match('/\.txt$/', $matches[1])) {
- require_once('include/bbcode.php');
- $include = bbcode($include);
- $include = str_replace(' target="_blank"','',$include);
- }
- elseif(preg_match('/\.md$/', $matches[1])) {
- require_once('library/markdown.php');
- $include = Markdown($include);
- }
- return $include;
- }
-
-}
-
diff --git a/mod/home.php b/mod/home.php
deleted file mode 100644
index 478c764ea..000000000
--- a/mod/home.php
+++ /dev/null
@@ -1,83 +0,0 @@
-<?php
-
-require_once('include/items.php');
-require_once('include/conversation.php');
-
-
-function home_init(&$a) {
-
- $ret = array();
-
- call_hooks('home_init',$ret);
-
- $splash = ((argc() > 1 && argv(1) === 'splash') ? true : false);
-
- $channel = App::get_channel();
- if(local_channel() && $channel && $channel['xchan_url'] && ! $splash) {
- $dest = $channel['channel_startpage'];
- if(! $dest)
- $dest = get_pconfig(local_channel(),'system','startpage');
- if(! $dest)
- $dest = get_config('system','startpage');
- if(! $dest)
- $dest = z_root() . '/network';
-
- goaway($dest);
- }
-
- if(get_account_id() && ! $splash) {
- goaway(z_root() . '/new_channel');
- }
-
-}
-
-
-function home_content(&$a, $update = 0, $load = false) {
-
- $o = '';
-
-
- if(x($_SESSION,'theme'))
- unset($_SESSION['theme']);
- if(x($_SESSION,'mobile_theme'))
- unset($_SESSION['mobile_theme']);
-
- $splash = ((argc() > 1 && argv(1) === 'splash') ? true : false);
-
- call_hooks('home_content',$o);
- if($o)
- return $o;
-
- $frontpage = get_config('system','frontpage');
- if($frontpage) {
- if(strpos($frontpage,'include:') !== false) {
- $file = trim(str_replace('include:' , '', $frontpage));
- if(file_exists($file)) {
- App::$page['template'] = 'full';
- App::$page['title'] = t('$Projectname');
- $o .= file_get_contents($file);
- return $o;
- }
- }
- if(strpos($frontpage,'http') !== 0)
- $frontpage = z_root() . '/' . $frontpage;
- if(intval(get_config('system','mirror_frontpage'))) {
- $o = '<html><head><title>' . t('$Projectname') . '</title></head><body style="margin: 0; padding: 0; border: none;" ><iframe src="' . $frontpage . '" width="100%" height="100%" style="margin: 0; padding: 0; border: none;" ></iframe></body></html>';
- echo $o;
- killme();
- }
- goaway($frontpage);
- }
-
-
- $sitename = get_config('system','sitename');
- if($sitename)
- $o .= '<h1 class="home-welcome">' . sprintf( t("Welcome to %s") ,$sitename) . '</h1>';
-
- $loginbox = get_config('system','login_on_homepage');
- if(intval($loginbox) || $loginbox === false)
- $o .= login((App::$config['system']['register_policy'] == REGISTER_CLOSED) ? 0 : 1);
-
- return $o;
-
-}
diff --git a/mod/hostxrd.php b/mod/hostxrd.php
deleted file mode 100644
index 0e19d8af6..000000000
--- a/mod/hostxrd.php
+++ /dev/null
@@ -1,18 +0,0 @@
-<?php
-
-function hostxrd_init(&$a) {
- header('Access-Control-Allow-Origin: *');
- header("Content-type: application/xrd+xml");
- logger('hostxrd',LOGGER_DEBUG);
-
- $tpl = get_markup_template('xrd_host.tpl');
- $x = replace_macros(get_markup_template('xrd_host.tpl'), array(
- '$zhost' => App::get_hostname(),
- '$zroot' => z_root()
- ));
- $arr = array('xrd' => $x);
- call_hooks('hostxrd',$arr);
-
- echo $arr['xrd'];
- killme();
-}
diff --git a/mod/id.php b/mod/id.php
deleted file mode 100644
index 382df45d8..000000000
--- a/mod/id.php
+++ /dev/null
@@ -1,310 +0,0 @@
-<?php
-/**
- * @file mod/id.php
- * @brief OpenID implementation
- */
-
-require 'library/openid/provider/provider.php';
-
-
-$attrMap = array(
- 'namePerson/first' => t('First Name'),
- 'namePerson/last' => t('Last Name'),
- 'namePerson/friendly' => t('Nickname'),
- 'namePerson' => t('Full Name'),
- 'contact/internet/email' => t('Email'),
- 'contact/email' => t('Email'),
- 'media/image/aspect11' => t('Profile Photo'),
- 'media/image' => t('Profile Photo'),
- 'media/image/default' => t('Profile Photo'),
- 'media/image/16x16' => t('Profile Photo 16px'),
- 'media/image/32x32' => t('Profile Photo 32px'),
- 'media/image/48x48' => t('Profile Photo 48px'),
- 'media/image/64x64' => t('Profile Photo 64px'),
- 'media/image/80x80' => t('Profile Photo 80px'),
- 'media/image/128x128' => t('Profile Photo 128px'),
- 'timezone' => t('Timezone'),
- 'contact/web/default' => t('Homepage URL'),
- 'language/pref' => t('Language'),
- 'birthDate/birthYear' => t('Birth Year'),
- 'birthDate/birthMonth' => t('Birth Month'),
- 'birthDate/birthday' => t('Birth Day'),
- 'birthDate' => t('Birthdate'),
- 'gender' => t('Gender'),
-);
-
-
-/**
- * @brief Entrypoint for the OpenID implementation.
- *
- * @param App &$a
- */
-function id_init(&$a) {
-
- logger('id: ' . print_r($_REQUEST, true));
-
- if(argc() > 1) {
- $which = argv(1);
- } else {
- App::$error = 404;
- return;
- }
-
- $profile = '';
- $channel = App::get_channel();
- profile_load($a,$which,$profile);
-
- $op = new MysqlProvider;
- $op->server();
-}
-
-/**
- * @brief Returns user data needed for OpenID.
- *
- * If no $handle is provided we will use local_channel() by default.
- *
- * @param string $handle (default null)
- * @return boolean|array
- */
-function getUserData($handle = null) {
- if (! local_channel()) {
- notice( t('Permission denied.') . EOL);
- App::$page['content'] = login();
-
- return false;
- }
-
-// logger('handle: ' . $handle);
-
- if ($handle) {
- $r = q("select * from channel left join xchan on channel_hash = xchan_hash where channel_address = '%s' limit 1",
- dbesc($handle)
- );
- } else {
- $r = q("select * from channel left join xchan on channel_hash = xchan_hash where channel_id = %d",
- intval(local_channel())
- );
- }
-
- if (! r)
- return false;
-
- $x = q("select * from account where account_id = %d limit 1",
- intval($r[0]['channel_account_id'])
- );
- if ($x)
- $r[0]['email'] = $x[0]['account_email'];
-
- $p = q("select * from profile where is_default = 1 and uid = %d limit 1",
- intval($r[0]['channel_account_id'])
- );
-
- $gender = '';
- if ($p[0]['gender'] == t('Male'))
- $gender = 'M';
- if ($p[0]['gender'] == t('Female'))
- $gender = 'F';
-
- $r[0]['firstName'] = ((strpos($r[0]['channel_name'],' ')) ? substr($r[0]['channel_name'],0,strpos($r[0]['channel_name'],' ')) : $r[0]['channel_name']);
- $r[0]['lastName'] = ((strpos($r[0]['channel_name'],' ')) ? substr($r[0]['channel_name'],strpos($r[0]['channel_name'],' ')+1) : '');
- $r[0]['namePerson'] = $r[0]['channel_name'];
- $r[0]['pphoto'] = $r[0]['xchan_photo_l'];
- $r[0]['pphoto16'] = z_root() . '/photo/profile/16/' . $r[0]['channel_id'] . '.jpg';
- $r[0]['pphoto32'] = z_root() . '/photo/profile/32/' . $r[0]['channel_id'] . '.jpg';
- $r[0]['pphoto48'] = z_root() . '/photo/profile/48/' . $r[0]['channel_id'] . '.jpg';
- $r[0]['pphoto64'] = z_root() . '/photo/profile/64/' . $r[0]['channel_id'] . '.jpg';
- $r[0]['pphoto80'] = z_root() . '/photo/profile/80/' . $r[0]['channel_id'] . '.jpg';
- $r[0]['pphoto128'] = z_root() . '/photo/profile/128/' . $r[0]['channel_id'] . '.jpg';
- $r[0]['timezone'] = $r[0]['channel_timezone'];
- $r[0]['url'] = $r[0]['xchan_url'];
- $r[0]['language'] = (($x[0]['account_language']) ? $x[0]['account_language'] : 'en');
- $r[0]['birthyear'] = ((intval(substr($p[0]['dob'],0,4))) ? intval(substr($p[0]['dob'],0,4)) : '');
- $r[0]['birthmonth'] = ((intval(substr($p[0]['dob'],5,2))) ? intval(substr($p[0]['dob'],5,2)) : '');
- $r[0]['birthday'] = ((intval(substr($p[0]['dob'],8,2))) ? intval(substr($p[0]['dob'],8,2)) : '');
- $r[0]['birthdate'] = (($r[0]['birthyear'] && $r[0]['birthmonth'] && $r[0]['birthday']) ? $p[0]['dob'] : '');
- $r[0]['gender'] = $gender;
-
- return $r[0];
-
-/*
-* if(isset($_POST['login'],$_POST['password'])) {
-* $login = mysql_real_escape_string($_POST['login']);
-* $password = sha1($_POST['password']);
-* $q = mysql_query("SELECT * FROM Users WHERE login = '$login' AND password = '$password'");
-* if($data = mysql_fetch_assoc($q)) {
-* return $data;
-* }
-* if($handle) {
-* echo 'Wrong login/password.';
-* }
-* }
-* if($handle) {
-* ?>
-* <form action="" method="post">
-* <input type="hidden" name="openid.assoc_handle" value="<?php echo $handle?>">
-* Login: <input type="text" name="login"><br>
-* Password: <input type="password" name="password"><br>
-* <button>Submit</button>
-* </form>
-* <?php
-* die();
-* }
-*/
-
-}
-
-
-/**
- * @brief MySQL provider for OpenID implementation.
- *
- */
-class MysqlProvider extends LightOpenIDProvider {
-
- // See http://openid.net/specs/openid-attribute-properties-list-1_0-01.html
- // This list contains a few variations of these attributes to maintain
- // compatibility with legacy clients
-
- private $attrFieldMap = array(
- 'namePerson/first' => 'firstName',
- 'namePerson/last' => 'lastName',
- 'namePerson/friendly' => 'channel_address',
- 'namePerson' => 'namePerson',
- 'contact/internet/email' => 'email',
- 'contact/email' => 'email',
- 'media/image/aspect11' => 'pphoto',
- 'media/image' => 'pphoto',
- 'media/image/default' => 'pphoto',
- 'media/image/16x16' => 'pphoto16',
- 'media/image/32x32' => 'pphoto32',
- 'media/image/48x48' => 'pphoto48',
- 'media/image/64x64' => 'pphoto64',
- 'media/image/80x80' => 'pphoto80',
- 'media/image/128x128' => 'pphoto128',
- 'timezone' => 'timezone',
- 'contact/web/default' => 'url',
- 'language/pref' => 'language',
- 'birthDate/birthYear' => 'birthyear',
- 'birthDate/birthMonth' => 'birthmonth',
- 'birthDate/birthday' => 'birthday',
- 'birthDate' => 'birthdate',
- 'gender' => 'gender',
- );
-
- function setup($identity, $realm, $assoc_handle, $attributes) {
- global $attrMap;
-
-// logger('identity: ' . $identity);
-// logger('realm: ' . $realm);
-// logger('assoc_handle: ' . $assoc_handle);
-// logger('attributes: ' . print_r($attributes,true));
-
- $data = getUserData($assoc_handle);
-
-
-/** @FIXME this needs to be a template with localised strings */
-
- $o .= '<form action="" method="post">'
- . '<input type="hidden" name="openid.assoc_handle" value="' . $assoc_handle . '">'
- . '<input type="hidden" name="login" value="' . $_POST['login'] .'">'
- . '<input type="hidden" name="password" value="' . $_POST['password'] .'">'
- . "<b>$realm</b> wishes to authenticate you.";
- if($attributes['required'] || $attributes['optional']) {
- $o .= " It also requests following information (required fields marked with *):"
- . '<ul>';
-
- foreach($attributes['required'] as $attr) {
- if(isset($this->attrMap[$attr])) {
- $o .= '<li>'
- . '<input type="checkbox" name="attributes[' . $attr . ']"> '
- . $this->attrMap[$attr] . ' <span class="required">*</span></li>';
- }
- }
-
- foreach($attributes['optional'] as $attr) {
- if(isset($this->attrMap[$attr])) {
- $o .= '<li>'
- . '<input type="checkbox" name="attributes[' . $attr . ']"> '
- . $this->attrMap[$attr] . '</li>';
- }
- }
- $o .= '</ul>';
- }
- $o .= '<br>'
- . '<button name="once">Allow once</button> '
- . '<button name="always">Always allow</button> '
- . '<button name="cancel">cancel</button> '
- . '</form>';
-
- App::$page['content'] .= $o;
- }
-
- function checkid($realm, &$attributes) {
-
- logger('checkid: ' . $realm);
- logger('checkid attrs: ' . print_r($attributes,true));
-
- if(isset($_POST['cancel'])) {
- $this->cancel();
- }
-
- $data = getUserData();
- if(! $data) {
- return false;
- }
-
- $q = get_pconfig(local_channel(), 'openid', $realm);
-
- $attrs = array();
- if($q) {
- $attrs = $q;
- } elseif(isset($_POST['attributes'])) {
- $attrs = array_keys($_POST['attributes']);
- } elseif(!isset($_POST['once']) && !isset($_POST['always'])) {
- return false;
- }
-
- $attributes = array();
- foreach($attrs as $attr) {
- if(isset($this->attrFieldMap[$attr])) {
- $attributes[$attr] = $data[$this->attrFieldMap[$attr]];
- }
- }
-
- if(isset($_POST['always'])) {
- set_pconfig(local_channel(),'openid',$realm,array_keys($attributes));
- }
-
- return z_root() . '/id/' . $data['channel_address'];
- }
-
- function assoc_handle() {
- logger('assoc_handle');
- $channel = App::get_channel();
-
- return z_root() . '/channel/' . $channel['channel_address'];
- }
-
- function setAssoc($handle, $data) {
- logger('setAssoc');
- $channel = channelx_by_nick(basename($handle));
- if($channel)
- set_pconfig($channel['channel_id'],'openid','associate',$data);
- }
-
- function getAssoc($handle) {
- logger('getAssoc: ' . $handle);
-
- $channel = channelx_by_nick(basename($handle));
- if($channel)
- return get_pconfig($channel['channel_id'], 'openid', 'associate');
-
- return false;
- }
-
- function delAssoc($handle) {
- logger('delAssoc');
- $channel = channelx_by_nick(basename($handle));
- if($channel)
- return del_pconfig($channel['channel_id'], 'openid', 'associate');
- }
-}
diff --git a/mod/impel.php b/mod/impel.php
deleted file mode 100644
index a0cb1d949..000000000
--- a/mod/impel.php
+++ /dev/null
@@ -1,201 +0,0 @@
-<?php /** @file */
-
-// import page design element
-
-require_once('include/menu.php');
-
-function impel_init(&$a) {
-
- $ret = array('success' => false);
-
- if(! local_channel())
- json_return_and_die($ret);
-
- logger('impel: ' . print_r($_REQUEST,true), LOGGER_DATA);
-
- $elm = $_REQUEST['element'];
- $x = base64url_decode($elm);
- if(! $x)
- json_return_and_die($ret);
-
- $j = json_decode($x,true);
- if(! $j)
- json_return_and_die($ret);
-
- $channel = App::get_channel();
-
- $arr = array();
- $is_menu = false;
-
- // a portable menu has its links rewritten with the local baseurl
- $portable_menu = false;
-
- switch($j['type']) {
- case 'webpage':
- $arr['item_type'] = ITEM_TYPE_WEBPAGE;
- $namespace = 'WEBPAGE';
- $installed_type = t('webpage');
- break;
- case 'block':
- $arr['item_type'] = ITEM_TYPE_BLOCK;
- $namespace = 'BUILDBLOCK';
- $installed_type = t('block');
- break;
- case 'layout':
- $arr['item_type'] = ITEM_TYPE_PDL;
- $namespace = 'PDL';
- $installed_type = t('layout');
- break;
- case 'portable-menu':
- $portable_menu = true;
- // fall through
- case 'menu':
- $is_menu = true;
- $installed_type = t('menu');
- break;
- default:
- logger('mod_impel: unrecognised element type' . print_r($j,true));
- break;
- }
-
- if($is_menu) {
- $m = array();
- $m['menu_channel_id'] = local_channel();
- $m['menu_name'] = $j['pagetitle'];
- $m['menu_desc'] = $j['desc'];
- if($j['created'])
- $m['menu_created'] = datetime_convert($j['created']);
- if($j['edited'])
- $m['menu_edited'] = datetime_convert($j['edited']);
-
- $m['menu_flags'] = 0;
- if($j['flags']) {
- if(in_array('bookmark',$j['flags']))
- $m['menu_flags'] |= MENU_BOOKMARK;
- if(in_array('system',$j['flags']))
- $m['menu_flags'] |= MENU_SYSTEM;
-
- }
-
- $menu_id = menu_create($m);
-
- if($menu_id) {
- if(is_array($j['items'])) {
- foreach($j['items'] as $it) {
- $mitem = array();
-
- $mitem['mitem_link'] = str_replace('[baseurl]',z_root(),$it['link']);
- $mitem['mitem_desc'] = escape_tags($it['desc']);
- $mitem['mitem_order'] = intval($it['order']);
- if(is_array($it['flags'])) {
- $mitem['mitem_flags'] = 0;
- if(in_array('zid',$it['flags']))
- $mitem['mitem_flags'] |= MENU_ITEM_ZID;
- if(in_array('new-window',$it['flags']))
- $mitem['mitem_flags'] |= MENU_ITEM_NEWWIN;
- if(in_array('chatroom',$it['flags']))
- $mitem['mitem_flags'] |= MENU_ITEM_CHATROOM;
- }
- menu_add_item($menu_id,local_channel(),$mitem);
- }
- if($j['edited']) {
- $x = q("update menu set menu_edited = '%s' where menu_id = %d and menu_channel_id = %d",
- dbesc(datetime_convert('UTC','UTC',$j['edited'])),
- intval($menu_id),
- intval(local_channel())
- );
- }
- }
- $ret['success'] = true;
- }
- $x = $ret;
- }
- else {
- $arr['uid'] = local_channel();
- $arr['aid'] = $channel['channel_account_id'];
- $arr['title'] = $j['title'];
- $arr['body'] = $j['body'];
- $arr['term'] = $j['term'];
- $arr['layout_mid'] = $j['layout_mid'];
- $arr['created'] = datetime_convert('UTC','UTC', $j['created']);
- $arr['edited'] = datetime_convert('UTC','UTC',$j['edited']);
- $arr['owner_xchan'] = get_observer_hash();
- $arr['author_xchan'] = (($j['author_xchan']) ? $j['author_xchan'] : get_observer_hash());
- $arr['mimetype'] = (($j['mimetype']) ? $j['mimetype'] : 'text/bbcode');
-
- if(! $j['mid'])
- $j['mid'] = item_message_id();
-
- $arr['mid'] = $arr['parent_mid'] = $j['mid'];
-
-
- if($j['pagetitle']) {
- require_once('library/urlify/URLify.php');
- $pagetitle = strtolower(URLify::transliterate($j['pagetitle']));
- }
-
-
-
- // Verify ability to use html or php!!!
-
- $execflag = false;
-
- if($arr['mimetype'] === 'application/x-php') {
- $z = q("select account_id, account_roles, channel_pageflags from account left join channel on channel_account_id = account_id where channel_id = %d limit 1",
- intval(local_channel())
- );
-
- if($z && (($z[0]['account_roles'] & ACCOUNT_ROLE_ALLOWCODE) || ($z[0]['channel_pageflags'] & PAGE_ALLOWCODE))) {
- $execflag = true;
- }
- }
-
- $remote_id = 0;
-
- $z = q("select * from item_id where sid = '%s' and service = '%s' and uid = %d limit 1",
- dbesc($pagetitle),
- dbesc($namespace),
- intval(local_channel())
- );
-
- $i = q("select id, edited, item_deleted from item where mid = '%s' and uid = %d limit 1",
- dbesc($arr['mid']),
- intval(local_channel())
- );
-
- if($z && $i) {
- $remote_id = $z[0]['id'];
- $arr['id'] = $i[0]['id'];
- // don't update if it has the same timestamp as the original
- if($arr['edited'] > $i[0]['edited'])
- $x = item_store_update($arr,$execflag);
- }
- else {
- if(($i) && (intval($i[0]['item_deleted']))) {
- // was partially deleted already, finish it off
- q("delete from item where mid = '%s' and uid = %d",
- dbesc($arr['mid']),
- intval(local_channel())
- );
- }
- $x = item_store($arr,$execflag);
- }
-
- if($x['success']) {
- $item_id = $x['item_id'];
- update_remote_id($channel,$item_id,$arr['item_type'],$pagetitle,$namespace,$remote_id,$arr['mid']);
- }
- }
-
- if($x['success']) {
- $ret['success'] = true;
- info( sprintf( t('%s element installed'), $installed_type));
- }
- else {
- notice( sprintf( t('%s element installation failed'), $installed_type));
- }
-
-//??? should perhaps return ret?
- json_return_and_die(true);
-
-}
diff --git a/mod/import.php b/mod/import.php
deleted file mode 100644
index b14b97777..000000000
--- a/mod/import.php
+++ /dev/null
@@ -1,547 +0,0 @@
-<?php
-
-// Import a channel, either by direct file upload or via
-// connection to original server.
-
-require_once('include/Contact.php');
-require_once('include/zot.php');
-require_once('include/identity.php');
-require_once('include/import.php');
-
-
-function import_account(&$a, $account_id) {
-
- if(! $account_id){
- logger("import_account: No account ID supplied");
- return;
- }
-
- $max_identities = account_service_class_fetch($account_id,'total_identities');
- $max_friends = account_service_class_fetch($account_id,'total_channels');
- $max_feeds = account_service_class_fetch($account_id,'total_feeds');
-
- if($max_identities !== false) {
- $r = q("select channel_id from channel where channel_account_id = %d",
- intval($account_id)
- );
- if($r && count($r) > $max_identities) {
- notice( sprintf( t('Your service plan only allows %d channels.'), $max_identities) . EOL);
- return;
- }
- }
-
-
- $data = null;
- $seize = ((x($_REQUEST,'make_primary')) ? intval($_REQUEST['make_primary']) : 0);
- $import_posts = ((x($_REQUEST,'import_posts')) ? intval($_REQUEST['import_posts']) : 0);
- $src = $_FILES['filename']['tmp_name'];
- $filename = basename($_FILES['filename']['name']);
- $filesize = intval($_FILES['filename']['size']);
- $filetype = $_FILES['filename']['type'];
-
- $completed = ((array_key_exists('import_step',$_SESSION)) ? intval($_SESSION['import_step']) : 0);
- if($completed)
- logger('saved import step: ' . $_SESSION['import_step']);
-
- if($src) {
-
- // This is OS specific and could also fail if your tmpdir isn't very large
- // mostly used for Diaspora which exports gzipped files.
-
- if(strpos($filename,'.gz')){
- @rename($src,$src . '.gz');
- @system('gunzip ' . escapeshellarg($src . '.gz'));
- }
-
- if($filesize) {
- $data = @file_get_contents($src);
- }
- unlink($src);
- }
-
- if(! $src) {
- $old_address = ((x($_REQUEST,'old_address')) ? $_REQUEST['old_address'] : '');
- if(! $old_address) {
- logger('mod_import: nothing to import.');
- notice( t('Nothing to import.') . EOL);
- return;
- }
-
- $email = ((x($_REQUEST,'email')) ? $_REQUEST['email'] : '');
- $password = ((x($_REQUEST,'password')) ? $_REQUEST['password'] : '');
-
- $channelname = substr($old_address,0,strpos($old_address,'@'));
- $servername = substr($old_address,strpos($old_address,'@')+1);
-
- $scheme = 'https://';
- $api_path = '/api/red/channel/export/basic?f=&channel=' . $channelname;
- if($import_posts)
- $api_path .= '&posts=1';
- $binary = false;
- $redirects = 0;
- $opts = array('http_auth' => $email . ':' . $password);
- $url = $scheme . $servername . $api_path;
- $ret = z_fetch_url($url, $binary, $redirects, $opts);
- if(! $ret['success'])
- $ret = z_fetch_url('http://' . $servername . $api_path, $binary, $redirects, $opts);
- if($ret['success'])
- $data = $ret['body'];
- else
- notice( t('Unable to download data from old server') . EOL);
-
- }
-
- if(! $data) {
- logger('mod_import: empty file.');
- notice( t('Imported file is empty.') . EOL);
- return;
- }
-
- $data = json_decode($data,true);
-
-// logger('import: data: ' . print_r($data,true));
-// print_r($data);
-
-
- if(array_key_exists('user',$data) && array_key_exists('version',$data)) {
- require_once('include/Import/import_diaspora.php');
- import_diaspora($data);
- return;
- }
-
- $moving = false;
-
- if(array_key_exists('compatibility',$data) && array_key_exists('database',$data['compatibility'])) {
- $v1 = substr($data['compatibility']['database'],-4);
- $v2 = substr(DB_UPDATE_VERSION,-4);
- if($v2 > $v1) {
- $t = sprintf( t('Warning: Database versions differ by %1$d updates.'), $v2 - $v1 );
- notice($t);
- }
- if(array_key_exists('server_role',$data['compatibility']) && $data['compatibility']['server_role'] == 'basic')
- $moving = true;
- }
-
- if($moving)
- $seize = 1;
-
- // import channel
-
- if(array_key_exists('channel',$data)) {
-
- if($completed < 1) {
- $channel = import_channel($data['channel'], $account_id, $seize);
-
- }
- else {
- $r = q("select * from channel where channel_account_id = %d and channel_guid = '%s' limit 1",
- intval($account_id),
- dbesc($channel['channel_guid'])
- );
- if($r)
- $channel = $r[0];
- }
- if(! $channel) {
- logger('mod_import: channel not found. ', print_r($channel,true));
- notice( t('Cloned channel not found. Import failed.') . EOL);
- return;
- }
- }
-
- if(! $channel)
- $channel = App::get_channel();
-
- if(! $channel) {
- logger('mod_import: channel not found. ', print_r($channel,true));
- notice( t('No channel. Import failed.') . EOL);
- return;
- }
-
-
- if($completed < 2) {
- if(is_array($data['config'])) {
- import_config($channel,$data['config']);
- }
-
- logger('import step 2');
- $_SESSION['import_step'] = 2;
- }
-
-
- if($completed < 3) {
-
- if($data['photo']) {
- require_once('include/photo/photo_driver.php');
- import_channel_photo(base64url_decode($data['photo']['data']),$data['photo']['type'],$account_id,$channel['channel_id']);
- }
-
- if(is_array($data['profile']))
- import_profiles($channel,$data['profile']);
-
- logger('import step 3');
- $_SESSION['import_step'] = 3;
- }
-
-
- if($completed < 4) {
-
- if(is_array($data['hubloc']) && (! $moving)) {
- import_hublocs($channel,$data['hubloc'],$seize);
-
- }
- logger('import step 4');
- $_SESSION['import_step'] = 4;
- }
-
- if($completed < 5) {
- // create new hubloc for the new channel at this site
-
- $r = q("insert into hubloc ( hubloc_guid, hubloc_guid_sig, hubloc_hash, hubloc_addr, hubloc_network, hubloc_primary,
- hubloc_url, hubloc_url_sig, hubloc_host, hubloc_callback, hubloc_sitekey )
- values ( '%s', '%s', '%s', '%s', '%s', %d, '%s', '%s', '%s', '%s', '%s' )",
- dbesc($channel['channel_guid']),
- dbesc($channel['channel_guid_sig']),
- dbesc($channel['channel_hash']),
- dbesc($channel['channel_address'] . '@' . App::get_hostname()),
- dbesc('zot'),
- intval(($seize) ? 1 : 0),
- dbesc(z_root()),
- dbesc(base64url_encode(rsa_sign(z_root(),$channel['channel_prvkey']))),
- dbesc(App::get_hostname()),
- dbesc(z_root() . '/post'),
- dbesc(get_config('system','pubkey'))
- );
-
- // reset the original primary hubloc if it is being seized
-
- if($seize) {
- $r = q("update hubloc set hubloc_primary = 0 where hubloc_primary = 1 and hubloc_hash = '%s' and hubloc_url != '%s' ",
- dbesc($channel['channel_hash']),
- dbesc(z_root())
- );
- }
- logger('import step 5');
- $_SESSION['import_step'] = 5;
- }
-
-
- if($completed < 6) {
-
- // import xchans and contact photos
-
- if($seize) {
-
- // replace any existing xchan we may have on this site if we're seizing control
-
- $r = q("delete from xchan where xchan_hash = '%s'",
- dbesc($channel['channel_hash'])
- );
-
- $r = q("insert into xchan ( xchan_hash, xchan_guid, xchan_guid_sig, xchan_pubkey, xchan_photo_l, xchan_photo_m, xchan_photo_s, xchan_addr, xchan_url, xchan_follow, xchan_connurl, xchan_name, xchan_network, xchan_photo_date, xchan_name_date, xchan_hidden, xchan_orphan, xchan_censored, xchan_selfcensored, xchan_system, xchan_pubforum, xchan_deleted ) values ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, %d, %d, %d, %d, %d )",
- dbesc($channel['channel_hash']),
- dbesc($channel['channel_guid']),
- dbesc($channel['channel_guid_sig']),
- dbesc($channel['channel_pubkey']),
- dbesc(z_root() . "/photo/profile/l/" . $channel['channel_id']),
- dbesc(z_root() . "/photo/profile/m/" . $channel['channel_id']),
- dbesc(z_root() . "/photo/profile/s/" . $channel['channel_id']),
- dbesc($channel['channel_address'] . '@' . App::get_hostname()),
- dbesc(z_root() . '/channel/' . $channel['channel_address']),
- dbesc(z_root() . '/follow?f=&url=%s'),
- dbesc(z_root() . '/poco/' . $channel['channel_address']),
- dbesc($channel['channel_name']),
- dbesc('zot'),
- dbesc(datetime_convert()),
- dbesc(datetime_convert()),
- 0,0,0,0,0,0,0
- );
- }
- logger('import step 6');
- $_SESSION['import_step'] = 6;
- }
-
- if($completed < 7) {
-
- $xchans = $data['xchan'];
- if($xchans) {
- foreach($xchans as $xchan) {
-
- $hash = make_xchan_hash($xchan['xchan_guid'],$xchan['xchan_guid_sig']);
- if($xchan['xchan_network'] === 'zot' && $hash !== $xchan['xchan_hash']) {
- logger('forged xchan: ' . print_r($xchan,true));
- continue;
- }
-
- if(! array_key_exists('xchan_hidden',$xchan)) {
- $xchan['xchan_hidden'] = (($xchan['xchan_flags'] & 0x0001) ? 1 : 0);
- $xchan['xchan_orphan'] = (($xchan['xchan_flags'] & 0x0002) ? 1 : 0);
- $xchan['xchan_censored'] = (($xchan['xchan_flags'] & 0x0004) ? 1 : 0);
- $xchan['xchan_selfcensored'] = (($xchan['xchan_flags'] & 0x0008) ? 1 : 0);
- $xchan['xchan_system'] = (($xchan['xchan_flags'] & 0x0010) ? 1 : 0);
- $xchan['xchan_pubforum'] = (($xchan['xchan_flags'] & 0x0020) ? 1 : 0);
- $xchan['xchan_deleted'] = (($xchan['xchan_flags'] & 0x1000) ? 1 : 0);
- }
-
- $r = q("select xchan_hash from xchan where xchan_hash = '%s' limit 1",
- dbesc($xchan['xchan_hash'])
- );
- if($r)
- continue;
-
- dbesc_array($xchan);
-
- $r = dbq("INSERT INTO xchan (`"
- . implode("`, `", array_keys($xchan))
- . "`) VALUES ('"
- . implode("', '", array_values($xchan))
- . "')" );
-
-
- require_once('include/photo/photo_driver.php');
- $photos = import_xchan_photo($xchan['xchan_photo_l'],$xchan['xchan_hash']);
- if($photos[4])
- $photodate = NULL_DATE;
- else
- $photodate = $xchan['xchan_photo_date'];
-
- $r = q("update xchan set xchan_photo_l = '%s', xchan_photo_m = '%s', xchan_photo_s = '%s', xchan_photo_mimetype = '%s', xchan_photo_date = '%s'
- where xchan_hash = '%s'",
- dbesc($photos[0]),
- dbesc($photos[1]),
- dbesc($photos[2]),
- dbesc($photos[3]),
- dbesc($photodate),
- dbesc($xchan['xchan_hash'])
- );
-
- }
- }
- logger('import step 7');
- $_SESSION['import_step'] = 7;
-
- }
-
-
-
- // FIXME - ensure we have an xchan if somebody is trying to pull a fast one
-
- if($completed < 8) {
- $friends = 0;
- $feeds = 0;
-
- // import contacts
- $abooks = $data['abook'];
- if($abooks) {
- foreach($abooks as $abook) {
-
- $abconfig = null;
- if(array_key_exists('abconfig',$abook) && is_array($abook['abconfig']) && count($abook['abconfig']))
- $abconfig = $abook['abconfig'];
-
- unset($abook['abook_id']);
- unset($abook['abook_rating']);
- unset($abook['abook_rating_text']);
- $abook['abook_account'] = $account_id;
- $abook['abook_channel'] = $channel['channel_id'];
- if(! array_key_exists('abook_blocked',$abook)) {
- $abook['abook_blocked'] = (($abook['abook_flags'] & 0x0001 ) ? 1 : 0);
- $abook['abook_ignored'] = (($abook['abook_flags'] & 0x0002 ) ? 1 : 0);
- $abook['abook_hidden'] = (($abook['abook_flags'] & 0x0004 ) ? 1 : 0);
- $abook['abook_archived'] = (($abook['abook_flags'] & 0x0008 ) ? 1 : 0);
- $abook['abook_pending'] = (($abook['abook_flags'] & 0x0010 ) ? 1 : 0);
- $abook['abook_unconnected'] = (($abook['abook_flags'] & 0x0020 ) ? 1 : 0);
- $abook['abook_self'] = (($abook['abook_flags'] & 0x0080 ) ? 1 : 0);
- $abook['abook_feed'] = (($abook['abook_flags'] & 0x0100 ) ? 1 : 0);
- }
-
- if($abook['abook_self']) {
- $role = get_pconfig($channel['channel_id'],'system','permissions_role');
- if(($role === 'forum') || ($abook['abook_my_perms'] & PERMS_W_TAGWALL)) {
- q("update xchan set xchan_pubforum = 1 where xchan_hash = '%s' ",
- dbesc($abook['abook_xchan'])
- );
- }
- }
- else {
- if($max_friends !== false && $friends > $max_friends)
- continue;
- if($max_feeds !== false && intval($abook['abook_feed']) && ($feeds > $max_feeds))
- continue;
- }
-
- dbesc_array($abook);
- $r = dbq("INSERT INTO abook (`"
- . implode("`, `", array_keys($abook))
- . "`) VALUES ('"
- . implode("', '", array_values($abook))
- . "')" );
-
- $friends ++;
- if(intval($abook['abook_feed']))
- $feeds ++;
-
- if($abconfig) {
- // @fixme does not handle sync of del_abconfig
- foreach($abconfig as $abc) {
- if($abc['chan'] === $channel['channel_hash'])
- set_abconfig($abc['chan'],$abc['xchan'],$abc['cat'],$abc['k'],$abc['v']);
- }
- }
-
-
-
- }
- }
- logger('import step 8');
- $_SESSION['import_step'] = 8;
- }
-
-
-
- if($completed < 9) {
- $groups = $data['group'];
- if($groups) {
- $saved = array();
- foreach($groups as $group) {
- $saved[$group['hash']] = array('old' => $group['id']);
- unset($group['id']);
- $group['uid'] = $channel['channel_id'];
- dbesc_array($group);
- $r = dbq("INSERT INTO groups (`"
- . implode("`, `", array_keys($group))
- . "`) VALUES ('"
- . implode("', '", array_values($group))
- . "')" );
- }
- $r = q("select * from `groups` where uid = %d",
- intval($channel['channel_id'])
- );
- if($r) {
- foreach($r as $rr) {
- $saved[$rr['hash']]['new'] = $rr['id'];
- }
- }
- }
-
-
- $group_members = $data['group_member'];
- if($group_members) {
- foreach($group_members as $group_member) {
- unset($group_member['id']);
- $group_member['uid'] = $channel['channel_id'];
- foreach($saved as $x) {
- if($x['old'] == $group_member['gid'])
- $group_member['gid'] = $x['new'];
- }
- dbesc_array($group_member);
- $r = dbq("INSERT INTO group_member (`"
- . implode("`, `", array_keys($group_member))
- . "`) VALUES ('"
- . implode("', '", array_values($group_member))
- . "')" );
- }
- }
- logger('import step 9');
- $_SESSION['import_step'] = 9;
- }
-
- if(is_array($data['obj']))
- import_objs($channel,$data['obj']);
-
- if(is_array($data['likes']))
- import_likes($channel,$data['likes']);
-
- if(is_array($data['app']))
- import_apps($channel,$data['app']);
-
- if(is_array($data['chatroom']))
- import_chatrooms($channel,$data['chatroom']);
-
- if(is_array($data['conv']))
- import_conv($channel,$data['conv']);
-
- if(is_array($data['mail']))
- import_mail($channel,$data['mail']);
-
- if(is_array($data['event']))
- import_events($channel,$data['event']);
-
- if(is_array($data['event_item']))
- import_items($channel,$data['event_item']);
-
- if(is_array($data['menu']))
- import_menus($channel,$data['menu']);
-
- $addon = array('channel' => $channel,'data' => $data);
- call_hooks('import_channel',$addon);
-
- $saved_notification_flags = notifications_off($channel['channel_id']);
-
- if($import_posts && array_key_exists('item',$data) && $data['item'])
- import_items($channel,$data['item']);
-
- notifications_on($channel['channel_id'],$saved_notification_flags);
-
-
- if(array_key_exists('item_id',$data) && $data['item_id'])
- import_item_ids($channel,$data['item_id']);
-
-
- // FIXME - ensure we have a self entry if somebody is trying to pull a fast one
-
- // send out refresh requests
- // notify old server that it may no longer be primary.
-
- proc_run('php','include/notifier.php','location',$channel['channel_id']);
-
- // This will indirectly perform a refresh_all *and* update the directory
-
- proc_run('php', 'include/directory.php', $channel['channel_id']);
-
-
- notice( t('Import completed.') . EOL);
-
- change_channel($channel['channel_id']);
-
- unset($_SESSION['import_step']);
- goaway(z_root() . '/network' );
-
-}
-
-
-function import_post(&$a) {
-
- $account_id = get_account_id();
- if(! $account_id)
- return;
-
- import_account($a, $account_id);
-}
-
-function import_content(&$a) {
-
- if(! get_account_id()) {
- notice( t('You must be logged in to use this feature.'));
- return '';
- }
-
- $o = replace_macros(get_markup_template('channel_import.tpl'),array(
- '$title' => t('Import Channel'),
- '$desc' => t('Use this form to import an existing channel from a different server/hub. You may retrieve the channel identity from the old server/hub via the network or provide an export file.'),
- '$label_filename' => t('File to Upload'),
- '$choice' => t('Or provide the old server/hub details'),
- '$label_old_address' => t('Your old identity address (xyz@example.com)'),
- '$label_old_email' => t('Your old login email address'),
- '$label_old_pass' => t('Your old login password'),
- '$common' => t('For either option, please choose whether to make this hub your new primary address, or whether your old location should continue this role. You will be able to post from either location, but only one can be marked as the primary location for files, photos, and media.'),
- '$label_import_primary' => t('Make this hub my primary location'),
- '$label_import_posts' => t('Import existing posts if possible (experimental - limited by available memory'),
- '$pleasewait' => t('This process may take several minutes to complete. Please submit the form only once and leave this page open until finished.'),
- '$email' => '',
- '$pass' => '',
- '$submit' => t('Submit')
- ));
-
- return $o;
-
-}
diff --git a/mod/import_items.php b/mod/import_items.php
deleted file mode 100644
index df3afb3ea..000000000
--- a/mod/import_items.php
+++ /dev/null
@@ -1,123 +0,0 @@
-<?php
-
-require_once('include/import.php');
-
-function import_items_post(&$a) {
-
- if(! local_channel())
- return;
-
- $data = null;
-
- $src = $_FILES['filename']['tmp_name'];
- $filename = basename($_FILES['filename']['name']);
- $filesize = intval($_FILES['filename']['size']);
- $filetype = $_FILES['filename']['type'];
-
- if($src) {
- // This is OS specific and could also fail if your tmpdir isn't very large
- // mostly used for Diaspora which exports gzipped files.
-
- if(strpos($filename,'.gz')){
- @rename($src,$src . '.gz');
- @system('gunzip ' . escapeshellarg($src . '.gz'));
- }
-
- if($filesize) {
- $data = @file_get_contents($src);
- }
- unlink($src);
- }
-
- if(! $src) {
-
- $old_address = ((x($_REQUEST,'old_address')) ? $_REQUEST['old_address'] : '');
-
- if(! $old_address) {
- logger('mod_import: nothing to import.');
- notice( t('Nothing to import.') . EOL);
- return;
- }
-
- $email = ((x($_REQUEST,'email')) ? $_REQUEST['email'] : '');
- $password = ((x($_REQUEST,'password')) ? $_REQUEST['password'] : '');
-
- $year = ((x($_REQUEST,'year')) ? $_REQUEST['year'] : '');
-
- $channelname = substr($old_address,0,strpos($old_address,'@'));
- $servername = substr($old_address,strpos($old_address,'@')+1);
-
- $scheme = 'https://';
- $api_path = '/api/red/channel/export/items?f=&channel=' . $channelname . '&year=' . intval($year);
- $binary = false;
- $redirects = 0;
- $opts = array('http_auth' => $email . ':' . $password);
- $url = $scheme . $servername . $api_path;
- $ret = z_fetch_url($url, $binary, $redirects, $opts);
- if(! $ret['success'])
- $ret = z_fetch_url('http://' . $servername . $api_path, $binary, $redirects, $opts);
- if($ret['success'])
- $data = $ret['body'];
- else
- notice( t('Unable to download data from old server') . EOL);
-
- }
-
- if(! $data) {
- logger('mod_import: empty file.');
- notice( t('Imported file is empty.') . EOL);
- return;
- }
-
- $data = json_decode($data,true);
-
-// logger('import: data: ' . print_r($data,true));
-// print_r($data);
-
-
- if(array_key_exists('compatibility',$data) && array_key_exists('database',$data['compatibility'])) {
- $v1 = substr($data['compatibility']['database'],-4);
- $v2 = substr(DB_UPDATE_VERSION,-4);
- if($v2 > $v1) {
- $t = sprintf( t('Warning: Database versions differ by %1$d updates.'), $v2 - $v1 );
- notice($t);
- }
- }
-
- $channel = App::get_channel();
-
-
- if(array_key_exists('item',$data) && $data['item']) {
- import_items($channel,$data['item']);
- }
-
- if(array_key_exists('item_id',$data) && $data['item_id']) {
- import_item_ids($channel,$data['item_id']);
- }
-
- info( t('Import completed') . EOL);
- return;
-}
-
-
-
-
-function import_items_content(&$a) {
-
- if(! local_channel()) {
- notice( t('Permission denied') . EOL);
- return login();
- }
-
- $o = replace_macros(get_markup_template('item_import.tpl'),array(
- '$title' => t('Import Items'),
- '$desc' => t('Use this form to import existing posts and content from an export file.'),
- '$label_filename' => t('File to Upload'),
- '$submit' => t('Submit')
- ));
-
- return $o;
-
-}
-
-
diff --git a/mod/invite.php b/mod/invite.php
deleted file mode 100644
index 2adad8257..000000000
--- a/mod/invite.php
+++ /dev/null
@@ -1,146 +0,0 @@
-<?php
-
-/**
- * module: invite.php
- *
- * send email invitations to join social network
- *
- */
-
-function invite_post(&$a) {
-
- if(! local_channel()) {
- notice( t('Permission denied.') . EOL);
- return;
- }
-
- check_form_security_token_redirectOnErr('/', 'send_invite');
-
- $max_invites = intval(get_config('system','max_invites'));
- if(! $max_invites)
- $max_invites = 50;
-
- $current_invites = intval(get_pconfig(local_channel(),'system','sent_invites'));
- if($current_invites > $max_invites) {
- notice( t('Total invitation limit exceeded.') . EOL);
- return;
- };
-
-
- $recips = ((x($_POST,'recipients')) ? explode("\n",$_POST['recipients']) : array());
- $message = ((x($_POST,'message')) ? notags(trim($_POST['message'])) : '');
-
- $total = 0;
-
- if(get_config('system','invitation_only')) {
- $invonly = true;
- $x = get_pconfig(local_channel(),'system','invites_remaining');
- if((! $x) && (! is_site_admin()))
- return;
- }
-
- foreach($recips as $recip) {
-
- $recip = trim($recip);
- if(! $recip)
- continue;
-
- if(! valid_email($recip)) {
- notice( sprintf( t('%s : Not a valid email address.'), $recip) . EOL);
- continue;
- }
-
- else
- $nmessage = $message;
-
- $account = App::get_account();
-
-
- $res = mail($recip, sprintf( t('Please join us on $Projectname'), App::$config['sitename']),
- $nmessage,
- "From: " . $account['account_email'] . "\n"
- . 'Content-type: text/plain; charset=UTF-8' . "\n"
- . 'Content-transfer-encoding: 8bit' );
-
- if($res) {
- $total ++;
- $current_invites ++;
- set_pconfig(local_channel(),'system','sent_invites',$current_invites);
- if($current_invites > $max_invites) {
- notice( t('Invitation limit exceeded. Please contact your site administrator.') . EOL);
- return;
- }
- }
- else {
- notice( sprintf( t('%s : Message delivery failed.'), $recip) . EOL);
- }
-
- }
- notice( sprintf( tt("%d message sent.", "%d messages sent.", $total) , $total) . EOL);
- return;
-}
-
-
-function invite_content(&$a) {
-
- if(! local_channel()) {
- notice( t('Permission denied.') . EOL);
- return;
- }
-
- $tpl = get_markup_template('invite.tpl');
- $invonly = false;
-
- if(get_config('system','invitation_only')) {
- $invonly = true;
- $x = get_pconfig(local_channel(),'system','invites_remaining');
- if((! $x) && (! is_site_admin())) {
- notice( t('You have no more invitations available') . EOL);
- return '';
- }
- }
-
- if($invonly && ($x || is_site_admin())) {
- $invite_code = autoname(8) . rand(1000,9999);
- $nmessage = str_replace('$invite_code',$invite_code,$message);
-
- $r = q("INSERT INTO `register` (`hash`,`created`) VALUES ('%s', '%s') ",
- dbesc($invite_code),
- dbesc(datetime_convert())
- );
-
- if(! is_site_admin()) {
- $x --;
- if($x >= 0)
- set_pconfig(local_channel(),'system','invites_remaining',$x);
- else
- return;
- }
- }
-
- $ob = App::get_observer();
- if(! $ob)
- return $o;
-
- $channel = App::get_channel();
-
- $o = replace_macros($tpl, array(
- '$form_security_token' => get_form_security_token("send_invite"),
- '$invite' => t('Send invitations'),
- '$addr_text' => t('Enter email addresses, one per line:'),
- '$msg_text' => t('Your message:'),
- '$default_message' => t('Please join my community on $Projectname.') . "\r\n" . "\r\n"
- . $linktxt
- . (($invonly) ? "\r\n" . "\r\n" . t('You will need to supply this invitation code:') . " " . $invite_code . "\r\n" . "\r\n" : '')
- . t('1. Register at any $Projectname location (they are all inter-connected)')
- . "\r\n" . "\r\n" . z_root() . '/register'
- . "\r\n" . "\r\n" . t('2. Enter my $Projectname network address into the site searchbar.')
- . "\r\n" . "\r\n" . $ob['xchan_addr'] . ' (' . t('or visit') . " " . z_root() . '/channel/' . $channel['channel_address'] . ')'
- . "\r\n" . "\r\n"
- . t('3. Click [Connect]')
- . "\r\n" . "\r\n" ,
- '$submit' => t('Submit')
- ));
-
- return $o;
-}
diff --git a/mod/item.php b/mod/item.php
deleted file mode 100644
index 6e7c77a4d..000000000
--- a/mod/item.php
+++ /dev/null
@@ -1,1262 +0,0 @@
-<?php
-
-/**
- *
- * This is the POST destination for most all locally posted
- * text stuff. This function handles status, wall-to-wall status,
- * local comments, and remote coments that are posted on this site
- * (as opposed to being delivered in a feed).
- * Also processed here are posts and comments coming through the
- * statusnet/twitter API.
- * All of these become an "item" which is our basic unit of
- * information.
- * Posts that originate externally or do not fall into the above
- * posting categories go through item_store() instead of this function.
- *
- */
-
-require_once('include/crypto.php');
-require_once('include/enotify.php');
-require_once('include/items.php');
-require_once('include/attach.php');
-
-function item_post(&$a) {
-
- // This will change. Figure out who the observer is and whether or not
- // they have permission to post here. Else ignore the post.
-
- if((! local_channel()) && (! remote_channel()) && (! x($_REQUEST,'commenter')))
- return;
-
- require_once('include/security.php');
-
- $uid = local_channel();
- $channel = null;
- $observer = null;
-
-
- /**
- * Is this a reply to something?
- */
-
- $parent = ((x($_REQUEST,'parent')) ? intval($_REQUEST['parent']) : 0);
- $parent_mid = ((x($_REQUEST,'parent_mid')) ? trim($_REQUEST['parent_mid']) : '');
-
- $remote_xchan = ((x($_REQUEST,'remote_xchan')) ? trim($_REQUEST['remote_xchan']) : false);
- $r = q("select * from xchan where xchan_hash = '%s' limit 1",
- dbesc($remote_xchan)
- );
- if($r)
- $remote_observer = $r[0];
- else
- $remote_xchan = $remote_observer = false;
-
- $profile_uid = ((x($_REQUEST,'profile_uid')) ? intval($_REQUEST['profile_uid']) : 0);
- require_once('include/identity.php');
- $sys = get_sys_channel();
- if($sys && $profile_uid && ($sys['channel_id'] == $profile_uid) && is_site_admin()) {
- $uid = intval($sys['channel_id']);
- $channel = $sys;
- $observer = $sys;
- }
-
- if(x($_REQUEST,'dropitems')) {
- require_once('include/items.php');
- $arr_drop = explode(',',$_REQUEST['dropitems']);
- drop_items($arr_drop);
- $json = array('success' => 1);
- echo json_encode($json);
- killme();
- }
-
- call_hooks('post_local_start', $_REQUEST);
-
-// logger('postvars ' . print_r($_REQUEST,true), LOGGER_DATA);
-
- $api_source = ((x($_REQUEST,'api_source') && $_REQUEST['api_source']) ? true : false);
-
- $consensus = intval($_REQUEST['consensus']);
-
- // 'origin' (if non-zero) indicates that this network is where the message originated,
- // for the purpose of relaying comments to other conversation members.
- // If using the API from a device (leaf node) you must set origin to 1 (default) or leave unset.
- // If the API is used from another network with its own distribution
- // and deliveries, you may wish to set origin to 0 or false and allow the other
- // network to relay comments.
-
- // If you are unsure, it is prudent (and important) to leave it unset.
-
- $origin = (($api_source && array_key_exists('origin',$_REQUEST)) ? intval($_REQUEST['origin']) : 1);
-
- // To represent message-ids on other networks - this will create an item_id record
-
- $namespace = (($api_source && array_key_exists('namespace',$_REQUEST)) ? strip_tags($_REQUEST['namespace']) : '');
- $remote_id = (($api_source && array_key_exists('remote_id',$_REQUEST)) ? strip_tags($_REQUEST['remote_id']) : '');
-
- $owner_hash = null;
-
- $message_id = ((x($_REQUEST,'message_id') && $api_source) ? strip_tags($_REQUEST['message_id']) : '');
- $created = ((x($_REQUEST,'created')) ? datetime_convert(date_default_timezone_get(),'UTC',$_REQUEST['created']) : datetime_convert());
- $post_id = ((x($_REQUEST,'post_id')) ? intval($_REQUEST['post_id']) : 0);
- $app = ((x($_REQUEST,'source')) ? strip_tags($_REQUEST['source']) : '');
- $return_path = ((x($_REQUEST,'return')) ? $_REQUEST['return'] : '');
- $preview = ((x($_REQUEST,'preview')) ? intval($_REQUEST['preview']) : 0);
- $categories = ((x($_REQUEST,'category')) ? escape_tags($_REQUEST['category']) : '');
- $webpage = ((x($_REQUEST,'webpage')) ? intval($_REQUEST['webpage']) : 0);
- $pagetitle = ((x($_REQUEST,'pagetitle')) ? escape_tags(urlencode($_REQUEST['pagetitle'])) : '');
- $layout_mid = ((x($_REQUEST,'layout_mid')) ? escape_tags($_REQUEST['layout_mid']): '');
- $plink = ((x($_REQUEST,'permalink')) ? escape_tags($_REQUEST['permalink']) : '');
- $obj_type = ((x($_REQUEST,'obj_type')) ? escape_tags($_REQUEST['obj_type']) : ACTIVITY_OBJ_NOTE);
-
- // allow API to bulk load a bunch of imported items with sending out a bunch of posts.
- $nopush = ((x($_REQUEST,'nopush')) ? intval($_REQUEST['nopush']) : 0);
-
- /*
- * Check service class limits
- */
- if ($uid && !(x($_REQUEST,'parent')) && !(x($_REQUEST,'post_id'))) {
- $ret = item_check_service_class($uid,(($_REQUEST['webpage'] == ITEM_TYPE_WEBPAGE) ? true : false));
- if (!$ret['success']) {
- notice( t($ret['message']) . EOL) ;
- if(x($_REQUEST,'return'))
- goaway(z_root() . "/" . $return_path );
- killme();
- }
- }
-
- if($pagetitle) {
- require_once('library/urlify/URLify.php');
- $pagetitle = strtolower(URLify::transliterate($pagetitle));
- }
-
-
- $item_flags = $item_restrict = 0;
-
- $route = '';
- $parent_item = null;
- $parent_contact = null;
- $thr_parent = '';
- $parid = 0;
- $r = false;
-
- if($parent || $parent_mid) {
-
- if(! x($_REQUEST,'type'))
- $_REQUEST['type'] = 'net-comment';
-
- if($obj_type == ACTIVITY_OBJ_POST)
- $obj_type = ACTIVITY_OBJ_COMMENT;
-
- if($parent) {
- $r = q("SELECT * FROM `item` WHERE `id` = %d LIMIT 1",
- intval($parent)
- );
- }
- elseif($parent_mid && $uid) {
- // This is coming from an API source, and we are logged in
- $r = q("SELECT * FROM `item` WHERE `mid` = '%s' AND `uid` = %d LIMIT 1",
- dbesc($parent_mid),
- intval($uid)
- );
- }
- // if this isn't the real parent of the conversation, find it
- if($r !== false && count($r)) {
- $parid = $r[0]['parent'];
- $parent_mid = $r[0]['mid'];
- if($r[0]['id'] != $r[0]['parent']) {
- $r = q("SELECT * FROM `item` WHERE `id` = `parent` AND `parent` = %d LIMIT 1",
- intval($parid)
- );
- }
- }
-
- if(($r === false) || (! count($r))) {
- notice( t('Unable to locate original post.') . EOL);
- if(x($_REQUEST,'return'))
- goaway(z_root() . "/" . $return_path );
- killme();
- }
-
- // can_comment_on_post() needs info from the following xchan_query
- xchan_query($r);
-
- $parent_item = $r[0];
- $parent = $r[0]['id'];
-
- // multi-level threading - preserve the info but re-parent to our single level threading
-
- $thr_parent = $parent_mid;
-
- $route = $parent_item['route'];
-
- }
-
- if(! $observer)
- $observer = App::get_observer();
-
- if($parent) {
- logger('mod_item: item_post parent=' . $parent);
- $can_comment = false;
- if((array_key_exists('owner',$parent_item)) && intval($parent_item['owner']['abook_self']))
- $can_comment = perm_is_allowed($profile_uid,$observer['xchan_hash'],'post_comments');
- else
- $can_comment = can_comment_on_post($observer['xchan_hash'],$parent_item);
-
- if(! $can_comment) {
- notice( t('Permission denied.') . EOL) ;
- if(x($_REQUEST,'return'))
- goaway(z_root() . "/" . $return_path );
- killme();
- }
- }
- else {
- if(! perm_is_allowed($profile_uid,$observer['xchan_hash'],($webpage) ? 'write_pages' : 'post_wall')) {
- notice( t('Permission denied.') . EOL) ;
- if(x($_REQUEST,'return'))
- goaway(z_root() . "/" . $return_path );
- killme();
- }
- }
-
-
- // is this an edited post?
-
- $orig_post = null;
-
- if($namespace && $remote_id) {
- // It wasn't an internally generated post - see if we've got an item matching this remote service id
- $i = q("select iid from item_id where service = '%s' and sid = '%s' limit 1",
- dbesc($namespace),
- dbesc($remote_id)
- );
- if($i)
- $post_id = $i[0]['iid'];
- }
-
- $iconfig = null;
-
- if($post_id) {
- $i = q("SELECT * FROM `item` WHERE `uid` = %d AND `id` = %d LIMIT 1",
- intval($profile_uid),
- intval($post_id)
- );
- if(! count($i))
- killme();
- $orig_post = $i[0];
- $iconfig = q("select * from iconfig where iid = %d",
- intval($post_id)
- );
- }
-
-
- if(! $channel) {
- if($uid && $uid == $profile_uid) {
- $channel = App::get_channel();
- }
- else {
- // posting as yourself but not necessarily to a channel you control
- $r = q("select * from channel left join account on channel_account_id = account_id where channel_id = %d LIMIT 1",
- intval($profile_uid)
- );
- if($r)
- $channel = $r[0];
- }
- }
-
-
- if(! $channel) {
- logger("mod_item: no channel.");
- if(x($_REQUEST,'return'))
- goaway(z_root() . "/" . $return_path );
- killme();
- }
-
- $owner_xchan = null;
-
- $r = q("select * from xchan where xchan_hash = '%s' limit 1",
- dbesc($channel['channel_hash'])
- );
- if($r && count($r)) {
- $owner_xchan = $r[0];
- }
- else {
- logger("mod_item: no owner.");
- if(x($_REQUEST,'return'))
- goaway(z_root() . "/" . $return_path );
- killme();
- }
-
- $walltowall = false;
- $walltowall_comment = false;
-
- if($remote_xchan)
- $observer = $remote_observer;
-
- if($observer) {
- logger('mod_item: post accepted from ' . $observer['xchan_name'] . ' for ' . $owner_xchan['xchan_name'], LOGGER_DEBUG);
-
- // wall-to-wall detection.
- // For top-level posts, if the author and owner are different it's a wall-to-wall
- // For comments, We need to additionally look at the parent and see if it's a wall post that originated locally.
-
- if($observer['xchan_name'] != $owner_xchan['xchan_name']) {
- if(($parent_item) && ($parent_item['item_wall'] && $parent_item['item_origin'])) {
- $walltowall_comment = true;
- $walltowall = true;
- }
- if(! $parent) {
- $walltowall = true;
- }
- }
- }
-
- $acl = new Zotlabs\Access\AccessList($channel);
-
-
- $public_policy = ((x($_REQUEST,'public_policy')) ? escape_tags($_REQUEST['public_policy']) : map_scope($channel['channel_r_stream'],true));
- if($webpage)
- $public_policy = '';
- if($public_policy)
- $private = 1;
-
- if($orig_post) {
- $private = 0;
- // webpages are allowed to change ACLs after the fact. Normal conversation items aren't.
- if($webpage) {
- $acl->set_from_array($_REQUEST);
- }
- else {
- $acl->set($orig_post);
- $public_policy = $orig_post['public_policy'];
- $private = $orig_post['item_private'];
- }
-
- if($private || $public_policy || $acl->is_private())
- $private = 1;
-
-
- $location = $orig_post['location'];
- $coord = $orig_post['coord'];
- $verb = $orig_post['verb'];
- $app = $orig_post['app'];
- $title = escape_tags(trim($_REQUEST['title']));
- $body = trim($_REQUEST['body']);
- $item_flags = $orig_post['item_flags'];
-
- $item_origin = $orig_post['item_origin'];
- $item_unseen = $orig_post['item_unseen'];
- $item_starred = $orig_post['item_starred'];
- $item_uplink = $orig_post['item_uplink'];
- $item_consensus = $orig_post['item_consensus'];
- $item_wall = $orig_post['item_wall'];
- $item_thread_top = $orig_post['item_thread_top'];
- $item_notshown = $orig_post['item_notshown'];
- $item_nsfw = $orig_post['item_nsfw'];
- $item_relay = $orig_post['item_relay'];
- $item_mentionsme = $orig_post['item_mentionsme'];
- $item_nocomment = $orig_post['item_nocomment'];
- $item_obscured = $orig_post['item_obscured'];
- $item_verified = $orig_post['item_verified'];
- $item_retained = $orig_post['item_retained'];
- $item_rss = $orig_post['item_rss'];
- $item_deleted = $orig_post['item_deleted'];
- $item_type = $orig_post['item_type'];
- $item_hidden = $orig_post['item_hidden'];
- $item_unpublished = $orig_post['item_unpublished'];
- $item_delayed = $orig_post['item_delayed'];
- $item_pending_remove = $orig_post['item_pending_remove'];
- $item_blocked = $orig_post['item_blocked'];
-
-
-
- $postopts = $orig_post['postopts'];
- $created = $orig_post['created'];
- $mid = $orig_post['mid'];
- $parent_mid = $orig_post['parent_mid'];
- $plink = $orig_post['plink'];
-
- }
- else {
- if(! $walltowall) {
- if((array_key_exists('contact_allow',$_REQUEST))
- || (array_key_exists('group_allow',$_REQUEST))
- || (array_key_exists('contact_deny',$_REQUEST))
- || (array_key_exists('group_deny',$_REQUEST))) {
- $acl->set_from_array($_REQUEST);
- }
- elseif(! $api_source) {
-
- // if no ACL has been defined and we aren't using the API, the form
- // didn't send us any parameters. This means there's no ACL or it has
- // been reset to the default audience.
- // If $api_source is set and there are no ACL parameters, we default
- // to the channel permissions which were set in the ACL contructor.
-
- $acl->set(array('allow_cid' => '', 'allow_gid' => '', 'deny_cid' => '', 'deny_gid' => ''));
- }
- }
-
-
- $location = notags(trim($_REQUEST['location']));
- $coord = notags(trim($_REQUEST['coord']));
- $verb = notags(trim($_REQUEST['verb']));
- $title = escape_tags(trim($_REQUEST['title']));
- $body = trim($_REQUEST['body']);
- $body .= trim($_REQUEST['attachment']);
- $postopts = '';
-
- $private = intval($acl->is_private() || ($public_policy));
-
- // If this is a comment, set the permissions from the parent.
-
- if($parent_item) {
- $private = 0;
- $acl->set($parent_item);
- $private = intval($acl->is_private() || $parent_item['item_private']);
- $public_policy = $parent_item['public_policy'];
- $owner_hash = $parent_item['owner_xchan'];
- }
-
- if(! strlen($body)) {
- if($preview)
- killme();
- info( t('Empty post discarded.') . EOL );
- if(x($_REQUEST,'return'))
- goaway(z_root() . "/" . $return_path );
- killme();
- }
- }
-
-
- $expires = NULL_DATE;
-
- if(feature_enabled($profile_uid,'content_expire')) {
- if(x($_REQUEST,'expire')) {
- $expires = datetime_convert(date_default_timezone_get(),'UTC', $_REQUEST['expire']);
- if($expires <= datetime_convert())
- $expires = NULL_DATE;
- }
- }
-
- $mimetype = notags(trim($_REQUEST['mimetype']));
- if(! $mimetype)
- $mimetype = 'text/bbcode';
-
- if($preview) {
- $body = z_input_filter($profile_uid,$body,$mimetype);
- }
-
-
- // Verify ability to use html or php!!!
-
- $execflag = false;
-
- if($mimetype !== 'text/bbcode') {
- $z = q("select account_id, account_roles, channel_pageflags from account left join channel on channel_account_id = account_id where channel_id = %d limit 1",
- intval($profile_uid)
- );
- if($z && (($z[0]['account_roles'] & ACCOUNT_ROLE_ALLOWCODE) || ($z[0]['channel_pageflags'] & PAGE_ALLOWCODE))) {
- if($uid && (get_account_id() == $z[0]['account_id'])) {
- $execflag = true;
- }
- else {
- notice( t('Executable content type not permitted to this channel.') . EOL);
- if(x($_REQUEST,'return'))
- goaway(z_root() . "/" . $return_path );
- killme();
- }
- }
- }
-
- $gacl = $acl->get();
- $str_contact_allow = $gacl['allow_cid'];
- $str_group_allow = $gacl['allow_gid'];
- $str_contact_deny = $gacl['deny_cid'];
- $str_group_deny = $gacl['deny_gid'];
-
- if($mimetype === 'text/bbcode') {
-
- require_once('include/text.php');
-
- // Markdown doesn't work correctly. Do not re-enable unless you're willing to fix it and support it.
-
- // Sample that will probably give you grief - you must preserve the linebreaks
- // and provide the correct markdown interpretation and you cannot allow unfiltered HTML
-
- // Markdown
- // ========
- //
- // **bold** abcde
- // fghijkl
- // *italic*
- // <img src="javascript:alert('hacked');" />
-
-// if($uid && $uid == $profile_uid && feature_enabled($uid,'markdown')) {
-// require_once('include/bb2diaspora.php');
-// $body = escape_tags(trim($body));
-// $body = str_replace("\n",'<br />', $body);
-// $body = preg_replace_callback('/\[share(.*?)\]/ism','share_shield',$body);
-// $body = diaspora2bb($body,true);
-// $body = preg_replace_callback('/\[share(.*?)\]/ism','share_unshield',$body);
-// }
-
- // BBCODE alert: the following functions assume bbcode input
- // and will require alternatives for alternative content-types (text/html, text/markdown, text/plain, etc.)
- // we may need virtual or template classes to implement the possible alternatives
-
- // Work around doubled linefeeds in Tinymce 3.5b2
- // First figure out if it's a status post that would've been
- // created using tinymce. Otherwise leave it alone.
-
- $plaintext = true;
-
-// $plaintext = ((feature_enabled($profile_uid,'richtext')) ? false : true);
-// if((! $parent) && (! $api_source) && (! $plaintext)) {
-// $body = fix_mce_lf($body);
-// }
-
-
-
- // If we're sending a private top-level message with a single @-taggable channel as a recipient, @-tag it, if our pconfig is set.
-
-
- if((! $parent) && (get_pconfig($profile_uid,'system','tagifonlyrecip')) && (substr_count($str_contact_allow,'<') == 1) && ($str_group_allow == '') && ($str_contact_deny == '') && ($str_group_deny == '')) {
- $x = q("select abook_id, abook_their_perms from abook where abook_xchan = '%s' and abook_channel = %d limit 1",
- dbesc(str_replace(array('<','>'),array('',''),$str_contact_allow)),
- intval($profile_uid)
- );
- if($x && ($x[0]['abook_their_perms'] & PERMS_W_TAGWALL))
- $body .= "\n\n@group+" . $x[0]['abook_id'] . "\n";
- }
-
- /**
- * fix naked links by passing through a callback to see if this is a red site
- * (already known to us) which will get a zrl, otherwise link with url, add bookmark tag to both.
- * First protect any url inside certain bbcode tags so we don't double link it.
- */
-
-
- $body = preg_replace_callback('/\[code(.*?)\[\/(code)\]/ism','red_escape_codeblock',$body);
- $body = preg_replace_callback('/\[url(.*?)\[\/(url)\]/ism','red_escape_codeblock',$body);
- $body = preg_replace_callback('/\[zrl(.*?)\[\/(zrl)\]/ism','red_escape_codeblock',$body);
-
- $body = preg_replace_callback("/([^\]\='".'"'."\/]|^|\#\^)(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\@\_\~\#\%\$\!\+\,]+)/ism", 'red_zrl_callback', $body);
-
- $body = preg_replace_callback('/\[\$b64zrl(.*?)\[\/(zrl)\]/ism','red_unescape_codeblock',$body);
- $body = preg_replace_callback('/\[\$b64url(.*?)\[\/(url)\]/ism','red_unescape_codeblock',$body);
- $body = preg_replace_callback('/\[\$b64code(.*?)\[\/(code)\]/ism','red_unescape_codeblock',$body);
-
-
- // fix any img tags that should be zmg
-
- $body = preg_replace_callback('/\[img(.*?)\](.*?)\[\/img\]/ism','red_zrlify_img_callback',$body);
-
-
- $body = bb_translate_video($body);
-
- /**
- * Fold multi-line [code] sequences
- */
-
- $body = preg_replace('/\[\/code\]\s*\[code\]/ism',"\n",$body);
-
- $body = scale_external_images($body,false);
-
-
- // Look for tags and linkify them
- $results = linkify_tags($a, $body, ($uid) ? $uid : $profile_uid);
-
- if($results) {
-
- // Set permissions based on tag replacements
- set_linkified_perms($results, $str_contact_allow, $str_group_allow, $profile_uid, $parent_item, $private);
-
- $post_tags = array();
- foreach($results as $result) {
- $success = $result['success'];
- if($success['replaced']) {
- $post_tags[] = array(
- 'uid' => $profile_uid,
- 'type' => $success['termtype'],
- 'otype' => TERM_OBJ_POST,
- 'term' => $success['term'],
- 'url' => $success['url']
- );
- }
- }
- }
-
-
- /**
- *
- * When a photo was uploaded into the message using the (profile wall) ajax
- * uploader, The permissions are initially set to disallow anybody but the
- * owner from seeing it. This is because the permissions may not yet have been
- * set for the post. If it's private, the photo permissions should be set
- * appropriately. But we didn't know the final permissions on the post until
- * now. So now we'll look for links of uploaded photos and attachments that are in the
- * post and set them to the same permissions as the post itself.
- *
- * If the post was end-to-end encrypted we can't find images and attachments in the body,
- * use our media_str input instead which only contains these elements - but only do this
- * when encrypted content exists because the photo/attachment may have been removed from
- * the post and we should keep it private. If it's encrypted we have no way of knowing
- * so we'll set the permissions regardless and realise that the media may not be
- * referenced in the post.
- *
- * What is preventing us from being able to upload photos into comments is dealing with
- * the photo and attachment permissions, since we don't always know who was in the
- * distribution for the top level post.
- *
- * We might be able to provide this functionality with a lot of fiddling:
- * - if the top level post is public (make the photo public)
- * - if the top level post was written by us or a wall post that belongs to us (match the top level post)
- * - if the top level post has privacy mentions, add those to the permissions.
- * - otherwise disallow the photo *or* make the photo public. This is the part that gets messy.
- */
-
- if(! $preview) {
- fix_attached_photo_permissions($profile_uid,$owner_xchan['xchan_hash'],((strpos($body,'[/crypt]')) ? $_POST['media_str'] : $body),$str_contact_allow,$str_group_allow,$str_contact_deny,$str_group_deny);
-
- fix_attached_file_permissions($channel,$observer['xchan_hash'],((strpos($body,'[/crypt]')) ? $_POST['media_str'] : $body),$str_contact_allow,$str_group_allow,$str_contact_deny,$str_group_deny);
-
- }
-
-
- $attachments = '';
- $match = false;
-
- if(preg_match_all('/(\[attachment\](.*?)\[\/attachment\])/',$body,$match)) {
- $attachments = array();
- $i = 0;
- foreach($match[2] as $mtch) {
- $attach_link = '';
- $hash = substr($mtch,0,strpos($mtch,','));
- $rev = intval(substr($mtch,strpos($mtch,',')));
- $r = attach_by_hash_nodata($hash,$rev);
- if($r['success']) {
- $attachments[] = array(
- 'href' => z_root() . '/attach/' . $r['data']['hash'],
- 'length' => $r['data']['filesize'],
- 'type' => $r['data']['filetype'],
- 'title' => urlencode($r['data']['filename']),
- 'revision' => $r['data']['revision']
- );
- }
- $ext = substr($r['data']['filename'],strrpos($r['data']['filename'],'.'));
- if(strpos($r['data']['filetype'],'audio/') !== false)
- $attach_link = '[audio]' . z_root() . '/attach/' . $r['data']['hash'] . '/' . $r['data']['revision'] . (($ext) ? $ext : '') . '[/audio]';
- elseif(strpos($r['data']['filetype'],'video/') !== false)
- $attach_link = '[video]' . z_root() . '/attach/' . $r['data']['hash'] . '/' . $r['data']['revision'] . (($ext) ? $ext : '') . '[/video]';
- $body = str_replace($match[1][$i],$attach_link,$body);
- $i++;
- }
- }
-
- }
-
-// BBCODE end alert
-
- if(strlen($categories)) {
- $cats = explode(',',$categories);
- foreach($cats as $cat) {
- $post_tags[] = array(
- 'uid' => $profile_uid,
- 'type' => TERM_CATEGORY,
- 'otype' => TERM_OBJ_POST,
- 'term' => trim($cat),
- 'url' => $owner_xchan['xchan_url'] . '?f=&cat=' . urlencode(trim($cat))
- );
- }
- }
-
- if($orig_post) {
- // preserve original tags
- $t = q("select * from term where oid = %d and otype = %d and uid = %d and type in ( %d, %d, %d )",
- intval($orig_post['id']),
- intval(TERM_OBJ_POST),
- intval($profile_uid),
- intval(TERM_UNKNOWN),
- intval(TERM_FILE),
- intval(TERM_COMMUNITYTAG)
- );
- if($t) {
- foreach($t as $t1) {
- $post_tags[] = array(
- 'uid' => $profile_uid,
- 'type' => $t1['type'],
- 'otype' => TERM_OBJ_POST,
- 'term' => $t1['term'],
- 'url' => $t1['url'],
- );
- }
- }
- }
-
-
- $item_unseen = ((local_channel() != $profile_uid) ? 1 : 0);
- $item_wall = (($post_type === 'wall' || $post_type === 'wall-comment') ? 1 : 0);
- $item_origin = (($origin) ? 1 : 0);
- $item_consensus = (($consensus) ? 1 : 0);
-
-
- // determine if this is a wall post
-
- if($parent) {
- $item_wall = $parent_item['item_wall'];
- }
- else {
- if(! $webpage) {
- $item_wall = 1;
- }
- }
-
-
- if($moderated)
- $item_blocked = ITEM_MODERATED;
-
-
- if(! strlen($verb))
- $verb = ACTIVITY_POST ;
-
- $notify_type = (($parent) ? 'comment-new' : 'wall-new' );
-
- if(! $mid) {
- $mid = (($message_id) ? $message_id : item_message_id());
- }
- if(! $parent_mid) {
- $parent_mid = $mid;
- }
-
- if($parent_item)
- $parent_mid = $parent_item['mid'];
-
- // Fallback so that we alway have a thr_parent
-
- if(!$thr_parent)
- $thr_parent = $mid;
-
- $datarray = array();
-
- $item_thread_top = ((! $parent) ? 1 : 0);
-
- if ((! $plink) && ($item_thread_top)) {
- $plink = z_root() . '/channel/' . $channel['channel_address'] . '/?f=&mid=' . $mid;
- }
-
-
-
-
-
- $datarray['aid'] = $channel['channel_account_id'];
- $datarray['uid'] = $profile_uid;
-
- $datarray['owner_xchan'] = (($owner_hash) ? $owner_hash : $owner_xchan['xchan_hash']);
- $datarray['author_xchan'] = $observer['xchan_hash'];
- $datarray['created'] = $created;
- $datarray['edited'] = (($orig_post) ? datetime_convert() : $created);
- $datarray['expires'] = $expires;
- $datarray['commented'] = (($orig_post) ? datetime_convert() : $created);
- $datarray['received'] = (($orig_post) ? datetime_convert() : $created);
- $datarray['changed'] = (($orig_post) ? datetime_convert() : $created);
- $datarray['mid'] = $mid;
- $datarray['parent_mid'] = $parent_mid;
- $datarray['mimetype'] = $mimetype;
- $datarray['title'] = $title;
- $datarray['body'] = $body;
- $datarray['app'] = $app;
- $datarray['location'] = $location;
- $datarray['coord'] = $coord;
- $datarray['verb'] = $verb;
- $datarray['obj_type'] = $obj_type;
- $datarray['allow_cid'] = $str_contact_allow;
- $datarray['allow_gid'] = $str_group_allow;
- $datarray['deny_cid'] = $str_contact_deny;
- $datarray['deny_gid'] = $str_group_deny;
- $datarray['item_private'] = $private;
- $datarray['item_wall'] = $item_wall;
- $datarray['attach'] = $attachments;
- $datarray['thr_parent'] = $thr_parent;
- $datarray['postopts'] = $postopts;
- $datarray['item_unseen'] = $item_unseen;
- $datarray['item_wall'] = $item_wall;
- $datarray['item_origin'] = $item_origin;
- $datarray['item_type'] = $webpage;
- $datarray['item_thread_top'] = $item_thread_top;
- $datarray['item_unseen'] = $item_unseen;
- $datarray['item_starred'] = $item_starred;
- $datarray['item_uplink'] = $item_uplink;
- $datarray['item_consensus'] = $item_consensus;
- $datarray['item_notshown'] = $item_notshown;
- $datarray['item_nsfw'] = $item_nsfw;
- $datarray['item_relay'] = $item_relay;
- $datarray['item_mentionsme'] = $item_mentionsme;
- $datarray['item_nocomment'] = $item_nocomment;
- $datarray['item_obscured'] = $item_obscured;
- $datarray['item_verified'] = $item_verified;
- $datarray['item_retained'] = $item_retained;
- $datarray['item_rss'] = $item_rss;
- $datarray['item_deleted'] = $item_deleted;
- $datarray['item_hidden'] = $item_hidden;
- $datarray['item_unpublished'] = $item_unpublished;
- $datarray['item_delayed'] = $item_delayed;
- $datarray['item_pending_remove'] = $item_pending_remove;
- $datarray['item_blocked'] = $item_blocked;
-
- $datarray['layout_mid'] = $layout_mid;
- $datarray['public_policy'] = $public_policy;
- $datarray['comment_policy'] = map_scope($channel['channel_w_comment']);
- $datarray['term'] = $post_tags;
- $datarray['plink'] = $plink;
- $datarray['route'] = $route;
-
- if($iconfig)
- $datarray['iconfig'] = $iconfig;
-
- // preview mode - prepare the body for display and send it via json
-
- if($preview) {
- require_once('include/conversation.php');
-
- $datarray['owner'] = $owner_xchan;
- $datarray['author'] = $observer;
- $datarray['attach'] = json_encode($datarray['attach']);
- $o = conversation($a,array($datarray),'search',false,'preview');
-// logger('preview: ' . $o, LOGGER_DEBUG);
- echo json_encode(array('preview' => $o));
- killme();
- }
- if($orig_post)
- $datarray['edit'] = true;
-
- if(feature_enabled($profile_uid,'suppress_duplicates') && (! $orig_post)) {
-
- $z = q("select created from item where uid = %d and body = '%s'",
- intval($profile_uid),
- dbesc($body)
- );
-
- if($z) {
- foreach($z as $zz) {
- if($zz['created'] > datetime_convert('UTC','UTC', 'now - 2 minutes')) {
- $datarray['cancel'] = 1;
- notice( t('Duplicate post suppressed.') . EOL);
- logger('Duplicate post. Faking plugin cancel.');
- }
- }
- }
- }
-
- call_hooks('post_local',$datarray);
-
- if(x($datarray,'cancel')) {
- logger('mod_item: post cancelled by plugin or duplicate suppressed.');
- if($return_path)
- goaway(z_root() . "/" . $return_path);
-
- $json = array('cancel' => 1);
- $json['reload'] = z_root() . '/' . $_REQUEST['jsreload'];
- echo json_encode($json);
- killme();
- }
-
-
- if(mb_strlen($datarray['title']) > 255)
- $datarray['title'] = mb_substr($datarray['title'],0,255);
-
- if(array_key_exists('item_private',$datarray) && $datarray['item_private']) {
-
- $datarray['body'] = trim(z_input_filter($datarray['uid'],$datarray['body'],$datarray['mimetype']));
-
- if($uid) {
- if($channel['channel_hash'] === $datarray['author_xchan']) {
- $datarray['sig'] = base64url_encode(rsa_sign($datarray['body'],$channel['channel_prvkey']));
- $datarray['item_verified'] = 1;
- }
- }
- }
-
- if($orig_post) {
- $datarray['id'] = $post_id;
-
- item_store_update($datarray,$execflag);
-
- update_remote_id($channel,$post_id,$webpage,$pagetitle,$namespace,$remote_id,$mid);
-
- if(! $parent) {
- $r = q("select * from item where id = %d",
- intval($post_id)
- );
- if($r) {
- xchan_query($r);
- $sync_item = fetch_post_tags($r);
- $rid = q("select * from item_id where iid = %d",
- intval($post_id)
- );
- build_sync_packet($uid,array('item' => array(encode_item($sync_item[0],true)),'item_id' => $rid));
- }
- }
- if(! $nopush)
- proc_run('php', "include/notifier.php", 'edit_post', $post_id);
-
- if((x($_REQUEST,'return')) && strlen($return_path)) {
- logger('return: ' . $return_path);
- goaway(z_root() . "/" . $return_path );
- }
- killme();
- }
- else
- $post_id = 0;
-
- $post = item_store($datarray,$execflag);
-
- $post_id = $post['item_id'];
-
- if($post_id) {
- logger('mod_item: saved item ' . $post_id);
-
- if($parent) {
-
- // only send comment notification if this is a wall-to-wall comment,
- // otherwise it will happen during delivery
-
- if(($datarray['owner_xchan'] != $datarray['author_xchan']) && (intval($parent_item['item_wall']))) {
- notification(array(
- 'type' => NOTIFY_COMMENT,
- 'from_xchan' => $datarray['author_xchan'],
- 'to_xchan' => $datarray['owner_xchan'],
- 'item' => $datarray,
- 'link' => z_root() . '/display/' . $datarray['mid'],
- 'verb' => ACTIVITY_POST,
- 'otype' => 'item',
- 'parent' => $parent,
- 'parent_mid' => $parent_item['mid']
- ));
-
- }
- }
- else {
- $parent = $post_id;
-
- if(($datarray['owner_xchan'] != $datarray['author_xchan']) && ($datarray['item_type'] == ITEM_TYPE_POST)) {
- notification(array(
- 'type' => NOTIFY_WALL,
- 'from_xchan' => $datarray['author_xchan'],
- 'to_xchan' => $datarray['owner_xchan'],
- 'item' => $datarray,
- 'link' => z_root() . '/display/' . $datarray['mid'],
- 'verb' => ACTIVITY_POST,
- 'otype' => 'item'
- ));
- }
-
- if($uid && $uid == $profile_uid && (is_item_normal($datarray))) {
- q("update channel set channel_lastpost = '%s' where channel_id = %d",
- dbesc(datetime_convert()),
- intval($uid)
- );
- }
- }
-
- // photo comments turn the corresponding item visible to the profile wall
- // This way we don't see every picture in your new photo album posted to your wall at once.
- // They will show up as people comment on them.
-
- if(intval($parent_item['item_hidden'])) {
- $r = q("UPDATE item SET item_hidden = 0 WHERE id = %d",
- intval($parent_item['id'])
- );
- }
- }
- else {
- logger('mod_item: unable to retrieve post that was just stored.');
- notice( t('System error. Post not saved.') . EOL);
- goaway(z_root() . "/" . $return_path );
- // NOTREACHED
- }
-
-
- update_remote_id($channel,$post_id,$webpage,$pagetitle,$namespace,$remote_id,$mid);
-
- if(($parent) && ($parent != $post_id)) {
- // Store the comment signature information in case we need to relay to Diaspora
- $ditem = $datarray;
- $ditem['author'] = $observer;
- store_diaspora_comment_sig($ditem,$channel,$parent_item, $post_id, (($walltowall_comment) ? 1 : 0));
- }
- else {
- $r = q("select * from item where id = %d",
- intval($post_id)
- );
- if($r) {
- xchan_query($r);
- $sync_item = fetch_post_tags($r);
- $rid = q("select * from item_id where iid = %d",
- intval($post_id)
- );
- build_sync_packet($uid,array('item' => array(encode_item($sync_item[0],true)),'item_id' => $rid));
- }
- }
-
- $datarray['id'] = $post_id;
- $datarray['llink'] = z_root() . '/display/' . $channel['channel_address'] . '/' . $post_id;
-
- call_hooks('post_local_end', $datarray);
-
- if(! $nopush)
- proc_run('php', 'include/notifier.php', $notify_type, $post_id);
-
- logger('post_complete');
-
-
-
-
-
-
- // figure out how to return, depending on from whence we came
-
- if($api_source)
- return $post;
-
- if($return_path) {
- goaway(z_root() . "/" . $return_path);
- }
-
- $json = array('success' => 1);
- if(x($_REQUEST,'jsreload') && strlen($_REQUEST['jsreload']))
- $json['reload'] = z_root() . '/' . $_REQUEST['jsreload'];
-
- logger('post_json: ' . print_r($json,true), LOGGER_DEBUG);
-
- echo json_encode($json);
- killme();
- // NOTREACHED
-}
-
-
-
-
-
-function item_content(&$a) {
-
- if((! local_channel()) && (! remote_channel()))
- return;
-
- require_once('include/security.php');
-
- if((argc() == 3) && (argv(1) === 'drop') && intval(argv(2))) {
-
- require_once('include/items.php');
- $i = q("select id, uid, author_xchan, owner_xchan, source_xchan, item_type from item where id = %d limit 1",
- intval(argv(2))
- );
-
- if($i) {
- $can_delete = false;
- $local_delete = false;
- if(local_channel() && local_channel() == $i[0]['uid'])
- $local_delete = true;
-
- $sys = get_sys_channel();
- if(is_site_admin() && $sys['channel_id'] == $i[0]['uid'])
- $can_delete = true;
-
- $ob_hash = get_observer_hash();
- if($ob_hash && ($ob_hash === $i[0]['author_xchan'] || $ob_hash === $i[0]['owner_xchan'] || $ob_hash === $i[0]['source_xchan']))
- $can_delete = true;
-
- if(! ($can_delete || $local_delete)) {
- notice( t('Permission denied.') . EOL);
- return;
- }
-
- // if this is a different page type or it's just a local delete
- // but not by the item author or owner, do a simple deletion
-
- if(intval($i[0]['item_type']) || ($local_delete && (! $can_delete))) {
- drop_item($i[0]['id']);
- }
- else {
- // complex deletion that needs to propagate and be performed in phases
- drop_item($i[0]['id'],true,DROPITEM_PHASE1);
- tag_deliver($i[0]['uid'],$i[0]['id']);
- }
- }
- }
-}
-
-
-function fix_attached_photo_permissions($uid,$xchan_hash,$body,
- $str_contact_allow,$str_group_allow,$str_contact_deny,$str_group_deny) {
-
- if(get_pconfig($uid,'system','force_public_uploads')) {
- $str_contact_allow = $str_group_allow = $str_contact_deny = $str_group_deny = '';
- }
-
- $match = null;
- // match img and zmg image links
- if(preg_match_all("/\[[zi]mg(.*?)\](.*?)\[\/[zi]mg\]/",$body,$match)) {
- $images = $match[2];
- if($images) {
- foreach($images as $image) {
- if(! stristr($image,z_root() . '/photo/'))
- continue;
- $image_uri = substr($image,strrpos($image,'/') + 1);
- if(strpos($image_uri,'-') !== false)
- $image_uri = substr($image_uri,0, strpos($image_uri,'-'));
- if(strpos($image_uri,'.') !== false)
- $image_uri = substr($image_uri,0, strpos($image_uri,'.'));
- if(! strlen($image_uri))
- continue;
- $srch = '<' . $xchan_hash . '>';
-
- $r = q("select folder from attach where hash = '%s' and uid = %d limit 1",
- dbesc($image_uri),
- intval($uid)
- );
- if($r && $r[0]['folder']) {
- $f = q("select * from attach where hash = '%s' and is_dir = 1 and uid = %d limit 1",
- dbesc($r[0]['folder']),
- intval($uid)
- );
- if(($f) && (($f[0]['allow_cid']) || ($f[0]['allow_gid']) || ($f[0]['deny_cid']) || ($f[0]['deny_gid']))) {
- $str_contact_allow = $f[0]['allow_cid'];
- $str_group_allow = $f[0]['allow_gid'];
- $str_contact_deny = $f[0]['deny_cid'];
- $str_group_deny = $f[0]['deny_gid'];
- }
- }
-
- $r = q("SELECT id FROM photo
- WHERE allow_cid = '%s' AND allow_gid = '' AND deny_cid = '' AND deny_gid = ''
- AND resource_id = '%s' AND uid = %d LIMIT 1",
- dbesc($srch),
- dbesc($image_uri),
- intval($uid)
- );
-
- if($r) {
- $r = q("UPDATE photo SET allow_cid = '%s', allow_gid = '%s', deny_cid = '%s', deny_gid = '%s'
- WHERE resource_id = '%s' AND uid = %d ",
- dbesc($str_contact_allow),
- dbesc($str_group_allow),
- dbesc($str_contact_deny),
- dbesc($str_group_deny),
- dbesc($image_uri),
- intval($uid)
- );
-
- // also update the linked item (which is probably invisible)
-
- $r = q("select id from item
- WHERE allow_cid = '%s' AND allow_gid = '' AND deny_cid = '' AND deny_gid = ''
- AND resource_id = '%s' and resource_type = 'photo' AND uid = %d LIMIT 1",
- dbesc($srch),
- dbesc($image_uri),
- intval($uid)
- );
- if($r) {
- $private = (($str_contact_allow || $str_group_allow || $str_contact_deny || $str_group_deny) ? true : false);
-
- $r = q("UPDATE item SET allow_cid = '%s', allow_gid = '%s', deny_cid = '%s', deny_gid = '%s', item_private = %d
- WHERE id = %d AND uid = %d",
- dbesc($str_contact_allow),
- dbesc($str_group_allow),
- dbesc($str_contact_deny),
- dbesc($str_group_deny),
- intval($private),
- intval($r[0]['id']),
- intval($uid)
- );
- }
- $r = q("select id from attach where hash = '%s' and uid = %d limit 1",
- dbesc($image_uri),
- intval($uid)
- );
- if($r) {
- q("update attach SET allow_cid = '%s', allow_gid = '%s', deny_cid = '%s', deny_gid = '%s'
- WHERE id = %d AND uid = %d",
- dbesc($str_contact_allow),
- dbesc($str_group_allow),
- dbesc($str_contact_deny),
- dbesc($str_group_deny),
- intval($r[0]['id']),
- intval($uid)
- );
- }
- }
- }
- }
- }
-}
-
-
-function fix_attached_file_permissions($channel,$observer_hash,$body,
- $str_contact_allow,$str_group_allow,$str_contact_deny,$str_group_deny) {
-
- if(get_pconfig($channel['channel_id'],'system','force_public_uploads')) {
- $str_contact_allow = $str_group_allow = $str_contact_deny = $str_group_deny = '';
- }
-
- $match = false;
-
- if(preg_match_all("/\[attachment\](.*?)\[\/attachment\]/",$body,$match)) {
- $attaches = $match[1];
- if($attaches) {
- foreach($attaches as $attach) {
- $hash = substr($attach,0,strpos($attach,','));
- $rev = intval(substr($attach,strpos($attach,',')));
- attach_store($channel,$observer_hash,$options = 'update', array(
- 'hash' => $hash,
- 'revision' => $rev,
- 'allow_cid' => $str_contact_allow,
- 'allow_gid' => $str_group_allow,
- 'deny_cid' => $str_contact_deny,
- 'deny_gid' => $str_group_deny
- ));
- }
- }
- }
-}
-
-function item_check_service_class($channel_id,$iswebpage) {
- $ret = array('success' => false, 'message' => '');
-
- if ($iswebpage) {
- $r = q("select count(i.id) as total from item i
- right join channel c on (i.author_xchan=c.channel_hash and i.uid=c.channel_id )
- and i.parent=i.id and i.item_type = %d and i.item_deleted = 0 and i.uid= %d ",
- intval(ITEM_TYPE_WEBPAGE),
- intval($channel_id)
- );
- }
- else {
- $r = q("select count(id) as total from item where parent = id and item_wall = 1 and uid = %d " . item_normal(),
- intval($channel_id)
- );
- }
-
- if(! $r) {
- $ret['message'] = t('Unable to obtain post information from database.');
- return $ret;
- }
-
- if (!$iswebpage) {
- $max = service_class_fetch($channel_id,'total_items');
- if(! service_class_allows($channel_id,'total_items',$r[0]['total'])) {
- $result['message'] .= upgrade_message() . sprintf( t('You have reached your limit of %1$.0f top level posts.'),$max);
- return $result;
- }
- }
- else {
- $max = service_class_fetch($channel_id,'total_pages');
- if(! service_class_allows($channel_id,'total_pages',$r[0]['total'])) {
- $result['message'] .= upgrade_message() . sprintf( t('You have reached your limit of %1$.0f webpages.'),$max);
- return $result;
- }
- }
-
- $ret['success'] = true;
- return $ret;
-}
-
diff --git a/mod/lang.php b/mod/lang.php
deleted file mode 100644
index fba5f9c73..000000000
--- a/mod/lang.php
+++ /dev/null
@@ -1,6 +0,0 @@
-<?php
-
-function lang_content(&$a) {
- return lang_selector();
-}
-
diff --git a/mod/layouts.php b/mod/layouts.php
deleted file mode 100644
index e28c9a066..000000000
--- a/mod/layouts.php
+++ /dev/null
@@ -1,193 +0,0 @@
-<?php
-
-require_once('include/identity.php');
-require_once('include/conversation.php');
-require_once('include/acl_selectors.php');
-
-function layouts_init(&$a) {
-
- if(argc() > 1 && argv(1) === 'sys' && is_site_admin()) {
- $sys = get_sys_channel();
- if($sys && intval($sys['channel_id'])) {
- App::$is_sys = true;
- }
- }
-
- if(argc() > 1)
- $which = argv(1);
- else
- return;
-
- profile_load($a,$which);
-
-}
-
-
-function layouts_content(&$a) {
-
- if(! App::$profile) {
- notice( t('Requested profile is not available.') . EOL );
- App::$error = 404;
- return;
- }
-
- $which = argv(1);
-
- $_SESSION['return_url'] = App::$query_string;
-
- $uid = local_channel();
- $owner = 0;
- $channel = null;
- $observer = App::get_observer();
-
- $channel = App::get_channel();
-
- if(App::$is_sys && is_site_admin()) {
- $sys = get_sys_channel();
- if($sys && intval($sys['channel_id'])) {
- $uid = $owner = intval($sys['channel_id']);
- $channel = $sys;
- $observer = $sys;
- }
- }
-
- if(! $owner) {
- // Figure out who the page owner is.
- $r = q("select channel_id from channel where channel_address = '%s'",
- dbesc($which)
- );
- if($r) {
- $owner = intval($r[0]['channel_id']);
- }
- }
-
- $ob_hash = (($observer) ? $observer['xchan_hash'] : '');
-
- $perms = get_all_perms($owner,$ob_hash);
-
- if(! $perms['write_pages']) {
- notice( t('Permission denied.') . EOL);
- return;
- }
-
- // Block design features from visitors
-
- if((! $uid) || ($uid != $owner)) {
- notice( t('Permission denied.') . EOL);
- return;
- }
-
- // Get the observer, check their permissions
-
- $ob_hash = (($observer) ? $observer['xchan_hash'] : '');
-
- $perms = get_all_perms($owner,$ob_hash);
-
- if(! $perms['write_pages']) {
- notice( t('Permission denied.') . EOL);
- return;
- }
-
- //This feature is not exposed in redbasic ui since it is not clear why one would want to
- //download a json encoded pdl file - we dont have a possibility to import it.
- //Use the buildin share/install feature instead.
- if((argc() > 3) && (argv(2) === 'share') && (argv(3))) {
- $r = q("select sid, service, mimetype, title, body from item_id
- left join item on item.id = item_id.iid
- where item_id.uid = %d and item.mid = '%s' and service = 'PDL' order by sid asc",
- intval($owner),
- dbesc(argv(3))
- );
- if($r) {
- header('Content-type: application/x-hubzilla-layout');
- header('Content-disposition: attachment; filename="' . $r[0]['sid'] . '.pdl"');
- echo json_encode($r);
- killme();
- }
- }
-
- // Create a status editor (for now - we'll need a WYSIWYG eventually) to create pages
- // Nickname is set to the observers xchan, and profile_uid to the owners.
- // This lets you post pages at other people's channels.
-
- $x = array(
- 'webpage' => ITEM_TYPE_PDL,
- 'is_owner' => true,
- 'nickname' => App::$profile['channel_address'],
- 'bang' => '',
- 'showacl' => false,
- 'visitor' => false,
- 'nopreview' => 1,
- 'ptlabel' => t('Layout Name'),
- 'profile_uid' => intval($owner),
- 'expanded' => true,
- 'placeholdertitle' => t('Layout Description (Optional)'),
- 'novoting' => true,
- 'bbco_autocomplete' => 'comanche'
- );
-
- if($_REQUEST['title'])
- $x['title'] = $_REQUEST['title'];
- if($_REQUEST['body'])
- $x['body'] = $_REQUEST['body'];
- if($_REQUEST['pagetitle'])
- $x['pagetitle'] = $_REQUEST['pagetitle'];
-
- $editor = status_editor($a,$x);
-
- $r = q("select iid, sid, mid, title, body, mimetype, created, edited, item_type from item_id left join item on item_id.iid = item.id
- where item_id.uid = %d and service = 'PDL' and item_type = %d order by item.created desc",
- intval($owner),
- intval(ITEM_TYPE_PDL)
- );
-
- $pages = null;
-
- if($r) {
- $pages = array();
- foreach($r as $rr) {
- $element_arr = array(
- 'type' => 'layout',
- 'title' => $rr['title'],
- 'body' => $rr['body'],
- 'created' => $rr['created'],
- 'edited' => $rr['edited'],
- 'mimetype' => $rr['mimetype'],
- 'pagetitle' => $rr['sid'],
- 'mid' => $rr['mid']
- );
- $pages[$rr['iid']][] = array(
- 'url' => $rr['iid'],
- 'title' => $rr['sid'],
- 'descr' => $rr['title'],
- 'mid' => $rr['mid'],
- 'created' => $rr['created'],
- 'edited' => $rr['edited'],
- 'bb_element' => '[element]' . base64url_encode(json_encode($element_arr)) . '[/element]'
- );
- }
- }
-
- //Build the base URL for edit links
- $url = z_root() . '/editlayout/' . $which;
-
- $o .= replace_macros(get_markup_template('layoutlist.tpl'), array(
- '$title' => t('Layouts'),
- '$create' => t('Create'),
- '$help' => array('text' => t('Help'), 'url' => 'help/comanche', 'title' => t('Comanche page description language help')),
- '$editor' => $editor,
- '$baseurl' => $url,
- '$name' => t('Layout Name'),
- '$descr' => t('Layout Description'),
- '$created' => t('Created'),
- '$edited' => t('Edited'),
- '$edit' => t('Edit'),
- '$share' => t('Share'),
- '$download' => t('Download PDL file'),
- '$pages' => $pages,
- '$channel' => $which,
- '$view' => t('View'),
- ));
-
- return $o;
-}
diff --git a/mod/like.php b/mod/like.php
deleted file mode 100755
index 0fbdd5c30..000000000
--- a/mod/like.php
+++ /dev/null
@@ -1,541 +0,0 @@
-<?php
-
-require_once('include/security.php');
-require_once('include/bbcode.php');
-require_once('include/items.php');
-
-
-function like_content(&$a) {
-
- $o = '';
-
- $observer = App::get_observer();
- $interactive = $_REQUEST['interactive'];
- if($interactive) {
- $o .= '<h1>' . t('Like/Dislike') . '</h1>';
- $o .= EOL . EOL;
-
- if(! $observer) {
- $_SESSION['return_url'] = App::$query_string;
- $o .= t('This action is restricted to members.') . EOL;
- $o .= t('Please <a href="rmagic">login with your $Projectname ID</a> or <a href="register">register as a new $Projectname member</a> to continue.') . EOL;
- return $o;
- }
- }
-
- $verb = notags(trim($_GET['verb']));
-
- if(! $verb)
- $verb = 'like';
-
- switch($verb) {
- case 'like':
- case 'unlike':
- $activity = ACTIVITY_LIKE;
- break;
- case 'dislike':
- case 'undislike':
- $activity = ACTIVITY_DISLIKE;
- break;
- case 'agree':
- case 'unagree':
- $activity = ACTIVITY_AGREE;
- break;
- case 'disagree':
- case 'undisagree':
- $activity = ACTIVITY_DISAGREE;
- break;
- case 'abstain':
- case 'unabstain':
- $activity = ACTIVITY_ABSTAIN;
- break;
- case 'attendyes':
- case 'unattendyes':
- $activity = ACTIVITY_ATTEND;
- break;
- case 'attendno':
- case 'unattendno':
- $activity = ACTIVITY_ATTENDNO;
- break;
- case 'attendmaybe':
- case 'unattendmaybe':
- $activity = ACTIVITY_ATTENDMAYBE;
- break;
- default:
- return;
- break;
- }
-
- $extended_like = false;
- $object = $target = null;
- $post_type = '';
- $objtype = '';
-
- if(argc() == 3) {
-
- if(! $observer)
- killme();
-
- $extended_like = true;
- $obj_type = argv(1);
- $obj_id = argv(2);
- $public = true;
-
- if($obj_type == 'profile') {
- $r = q("select * from profile where profile_guid = '%s' limit 1",
- dbesc(argv(2))
- );
- if(! $r)
- killme();
- $owner_uid = $r[0]['uid'];
- if($r[0]['is_default'])
- $public = true;
- if(! $public) {
- $d = q("select abook_xchan from abook where abook_profile = '%s' and abook_channel = %d",
- dbesc($r[0]['profile_guid']),
- intval($owner_uid)
- );
- if(! $d) {
- // forgery - illegal
- if($interactive) {
- notice( t('Invalid request.') . EOL);
- return $o;
- }
- killme();
- }
- // $d now contains a list of those who can see this profile - only send the status notification
- // to them.
- $allow_cid = $allow_gid = $deny_cid = $deny_gid = '';
- foreach($d as $dd) {
- $allow_cid .= '<' . $dd['abook_xchan'] . '>';
- }
- }
- $post_type = t('channel');
- $objtype = ACTIVITY_OBJ_PROFILE;
-
- $profile = $r[0];
- }
- elseif($obj_type == 'thing') {
-
- $r = q("select * from obj where obj_type = %d and obj_obj = '%s' limit 1",
- intval(TERM_OBJ_THING),
- dbesc(argv(2))
- );
-
- if(! $r) {
- if($interactive) {
- notice( t('Invalid request.') . EOL);
- return $o;
- }
- killme();
- }
-
- $owner_uid = $r[0]['obj_channel'];
-
- $allow_cid = $r[0]['allow_cid'];
- $allow_gid = $r[0]['allow_gid'];
- $deny_cid = $r[0]['deny_cid'];
- $deny_gid = $r[0]['deny_gid'];
- if($allow_cid || $allow_gid || $deny_cid || $deny_gid)
- $public = false;
-
- $post_type = t('thing');
- $objtype = ACTIVITY_OBJ_PROFILE;
- $tgttype = ACTIVITY_OBJ_THING;
-
- $links = array();
- $links[] = array('rel' => 'alternate', 'type' => 'text/html',
- 'href' => z_root() . '/thing/' . $r[0]['obj_obj']);
- if($r[0]['imgurl'])
- $links[] = array('rel' => 'photo', 'href' => $r[0]['obj_imgurl']);
-
- $target = json_encode(array(
- 'type' => $tgttype,
- 'title' => $r[0]['obj_term'],
- 'id' => z_root() . '/thing/' . $r[0]['obj_obj'],
- 'link' => $links
- ));
-
- $plink = '[zrl=' . z_root() . '/thing/' . $r[0]['obj_obj'] . ']' . $r[0]['obj_term'] . '[/zrl]';
-
- }
-
- if(! ($owner_uid && $r)) {
- if($interactive) {
- notice( t('Invalid request.') . EOL);
- return $o;
- }
- killme();
- }
-
- // The resultant activity is going to be a wall-to-wall post, so make sure this is allowed
-
- $perms = get_all_perms($owner_uid,$observer['xchan_hash']);
-
- if(! ($perms['post_like'] && $perms['view_profile'])) {
- if($interactive) {
- notice( t('Permission denied.') . EOL);
- return $o;
- }
- killme();
- }
-
- $ch = q("select * from channel left join xchan on channel_hash = xchan_hash where channel_id = %d limit 1",
- intval($owner_uid)
- );
- if(! $ch) {
- if($interactive) {
- notice( t('Channel unavailable.') . EOL);
- return $o;
- }
- killme();
- }
-
- if(! $plink)
- $plink = '[zrl=' . z_root() . '/profile/' . $ch[0]['channel_address'] . ']' . $post_type . '[/zrl]';
-
- $links = array();
- $links[] = array('rel' => 'alternate', 'type' => 'text/html',
- 'href' => z_root() . '/profile/' . $ch[0]['channel_address']);
- $links[] = array('rel' => 'photo', 'type' => $ch[0]['xchan_photo_mimetype'],
- 'href' => $ch[0]['xchan_photo_l']);
-
- $object = json_encode(array(
- 'type' => ACTIVITY_OBJ_PROFILE,
- 'title' => $ch[0]['channel_name'],
- 'id' => $ch[0]['xchan_url'] . '/' . $ch[0]['xchan_hash'],
- 'link' => $links
- ));
-
-
- // second like of the same thing is "undo" for the first like
-
- $z = q("select * from likes where channel_id = %d and liker = '%s' and verb = '%s' and target_type = '%s' and target_id = '%s' limit 1",
- intval($ch[0]['channel_id']),
- dbesc($observer['xchan_hash']),
- dbesc($activity),
- dbesc(($tgttype)?$tgttype:$objtype),
- dbesc($obj_id)
- );
-
- if($z) {
- $z[0]['deleted'] = 1;
- build_sync_packet($ch[0]['channel_id'],array('likes' => $z));
-
- q("delete from likes where id = %d limit 1",
- intval($z[0]['id'])
- );
- if($z[0]['i_mid']) {
- $r = q("select id from item where mid = '%s' and uid = %d limit 1",
- dbesc($z[0]['i_mid']),
- intval($ch[0]['channel_id'])
- );
- if($r)
- drop_item($r[0]['id'],false);
- if($interactive) {
- notice( t('Previous action reversed.') . EOL);
- return $o;
- }
- }
- killme();
- }
- }
- else {
-
- // this is used to like an item or comment
-
- $item_id = ((argc() == 2) ? notags(trim(argv(1))) : 0);
-
- logger('like: verb ' . $verb . ' item ' . $item_id, LOGGER_DEBUG);
-
- // get the item. Allow linked photos (which are normally hidden) to be liked
-
- $r = q("SELECT * FROM item WHERE id = %d
- and item_type = 0 and item_deleted = 0 and item_unpublished = 0
- and item_delayed = 0 and item_pending_remove = 0 and item_blocked = 0 LIMIT 1",
- intval($item_id)
- );
-
- if(! $item_id || (! $r)) {
- logger('like: no item ' . $item_id);
- killme();
- }
-
-
- $item = $r[0];
- $owner_uid = $item['uid'];
- $owner_aid = $item['aid'];
-
-
- $sys = get_sys_channel();
-
-
- // if this is a "discover" item, (item['uid'] is the sys channel),
- // fallback to the item comment policy, which should've been
- // respected when generating the conversation thread.
- // Even if the activity is rejected by the item owner, it should still get attached
- // to the local discover conversation on this site.
-
- if(($owner_uid != $sys['channel_id']) && (! perm_is_allowed($owner_uid,$observer['xchan_hash'],'post_comments'))) {
- notice( t('Permission denied') . EOL);
- killme();
- }
-
- $r = q("select * from xchan where xchan_hash = '%s' limit 1",
- dbesc($item['owner_xchan'])
- );
- if($r)
- $thread_owner = $r[0];
- else
- killme();
-
- $r = q("select * from xchan where xchan_hash = '%s' limit 1",
- dbesc($item['author_xchan'])
- );
- if($r)
- $item_author = $r[0];
- else
- killme();
-
-
- $verbs = " '".dbesc($activity)."' ";
-
- $multi_undo = false;
-
- // event participation and consensus items are essentially radio toggles. If you make a subsequent choice,
- // we need to eradicate your first choice.
-
- if($activity === ACTIVITY_ATTEND || $activity === ACTIVITY_ATTENDNO || $activity === ACTIVITY_ATTENDMAYBE) {
- $verbs = " '" . dbesc(ACTIVITY_ATTEND) . "','" . dbesc(ACTIVITY_ATTENDNO) . "','" . dbesc(ACTIVITY_ATTENDMAYBE) . "' ";
- $multi_undo = 1;
- }
- if($activity === ACTIVITY_AGREE || $activity === ACTIVITY_DISAGREE || $activity === ACTIVITY_ABSTAIN) {
- $verbs = " '" . dbesc(ACTIVITY_AGREE) . "','" . dbesc(ACTIVITY_DISAGREE) . "','" . dbesc(ACTIVITY_ABSTAIN) . "' ";
- $multi_undo = true;
- }
-
- $item_normal = item_normal();
-
- $r = q("SELECT id, parent, uid, verb FROM item WHERE verb in ( $verbs ) $item_normal
- AND author_xchan = '%s' AND thr_parent = '%s' and uid = %d ",
- dbesc($observer['xchan_hash']),
- dbesc($item['mid']),
- intval($owner_uid)
- );
-
- if($r) {
- // already liked it. Drop that item.
- require_once('include/items.php');
- foreach($r as $rr) {
- drop_item($rr['id'],false,DROPITEM_PHASE1);
- // set the changed timestamp on the parent so we'll see the update without a page reload
- $z = q("update item set changed = '%s' where id = %d and uid = %d",
- dbesc(datetime_convert()),
- intval($rr['parent']),
- intval($rr['uid'])
- );
- // Prior activity was a duplicate of the one we're submitting, just undo it;
- // don't fall through and create another
- if(activity_match($rr['verb'],$activity))
- $multi_undo = false;
-
- // drop_item was not done interactively, so we need to invoke the notifier
- // in order to push the changes to connections
-
- proc_run('php','include/notifier.php','drop',$rr['id']);
-
- }
-
- if($interactive)
- return;
-
- if(! $multi_undo)
- killme();
- }
- }
-
- $mid = item_message_id();
-
- $arr = array();
-
- if($extended_like) {
- $arr['item_thread_top'] = 1;
- $arr['item_origin'] = 1;
- $arr['item_wall'] = 1;
- }
- else {
- $post_type = (($item['resource_type'] === 'photo') ? t('photo') : t('status'));
- if($item['obj_type'] === ACTIVITY_OBJ_EVENT)
- $post_type = t('event');
-
- $links = array(array('rel' => 'alternate','type' => 'text/html', 'href' => $item['plink']));
- $objtype = (($item['resource_type'] === 'photo') ? ACTIVITY_OBJ_PHOTO : ACTIVITY_OBJ_NOTE );
-
- $body = $item['body'];
-
- $object = json_encode(array(
- 'type' => $objtype,
- 'id' => $item['mid'],
- 'parent' => (($item['thr_parent']) ? $item['thr_parent'] : $item['parent_mid']),
- 'link' => $links,
- 'title' => $item['title'],
- 'content' => $item['body'],
- 'created' => $item['created'],
- 'edited' => $item['edited'],
- 'author' => array(
- 'name' => $item_author['xchan_name'],
- 'address' => $item_author['xchan_addr'],
- 'guid' => $item_author['xchan_guid'],
- 'guid_sig' => $item_author['xchan_guid_sig'],
- 'link' => array(
- array('rel' => 'alternate', 'type' => 'text/html', 'href' => $item_author['xchan_url']),
- array('rel' => 'photo', 'type' => $item_author['xchan_photo_mimetype'], 'href' => $item_author['xchan_photo_m'])),
- ),
- ));
-
- if(! intval($item['item_thread_top']))
- $post_type = 'comment';
-
- $arr['item_origin'] = 1;
- $arr['item_notshown'] = 1;
-
- if(intval($item['item_wall']))
- $arr['item_wall'] = 1;
-
- // if this was a linked photo and was hidden, unhide it.
-
- if(intval($item['item_hidden'])) {
- $r = q("update item set item_hidden = 0 where id = %d",
- intval($item['id'])
- );
- }
-
- }
-
- if($verb === 'like')
- $bodyverb = t('%1$s likes %2$s\'s %3$s');
- if($verb === 'dislike')
- $bodyverb = t('%1$s doesn\'t like %2$s\'s %3$s');
- if($verb === 'agree')
- $bodyverb = t('%1$s agrees with %2$s\'s %3$s');
- if($verb === 'disagree')
- $bodyverb = t('%1$s doesn\'t agree with %2$s\'s %3$s');
- if($verb === 'abstain')
- $bodyverb = t('%1$s abstains from a decision on %2$s\'s %3$s');
- if($verb === 'attendyes')
- $bodyverb = t('%1$s is attending %2$s\'s %3$s');
- if($verb === 'attendno')
- $bodyverb = t('%1$s is not attending %2$s\'s %3$s');
- if($verb === 'attendmaybe')
- $bodyverb = t('%1$s may attend %2$s\'s %3$s');
-
- if(! isset($bodyverb))
- killme();
-
-
-
- if($extended_like) {
- $ulink = '[zrl=' . $ch[0]['xchan_url'] . ']' . $ch[0]['xchan_name'] . '[/zrl]';
- $alink = '[zrl=' . $observer['xchan_url'] . ']' . $observer['xchan_name'] . '[/zrl]';
- $private = (($public) ? 0 : 1);
- }
- else {
- $arr['parent'] = $item['id'];
- $arr['thr_parent'] = $item['mid'];
- $ulink = '[zrl=' . $item_author['xchan_url'] . ']' . $item_author['xchan_name'] . '[/zrl]';
- $alink = '[zrl=' . $observer['xchan_url'] . ']' . $observer['xchan_name'] . '[/zrl]';
- $plink = '[zrl=' . z_root() . '/display/' . $item['mid'] . ']' . $post_type . '[/zrl]';
- $allow_cid = $item['allow_cid'];
- $allow_gid = $item['allow_gid'];
- $deny_cid = $item['deny_cid'];
- $deny_gid = $item['deny_gid'];
- $private = $item['private'];
-
- }
-
-
- $arr['mid'] = $mid;
- $arr['aid'] = (($extended_like) ? $ch[0]['channel_account_id'] : $owner_aid);
- $arr['uid'] = $owner_uid;
- $arr['item_flags'] = $item_flags;
- $arr['item_wall'] = $item_wall;
- $arr['parent_mid'] = (($extended_like) ? $mid : $item['mid']);
- $arr['owner_xchan'] = (($extended_like) ? $ch[0]['xchan_hash'] : $thread_owner['xchan_hash']);
- $arr['author_xchan'] = $observer['xchan_hash'];
-
-
- $arr['body'] = sprintf( $bodyverb, $alink, $ulink, $plink );
- if($obj_type === 'thing' && $r[0]['imgurl']) {
- $arr['body'] .= "\n\n[zmg=80x80]" . $r[0]['imgurl'] . '[/zmg]';
- }
- if($obj_type === 'profile') {
- if($public) {
- $arr['body'] .= "\n\n" . '[embed]' . z_root() . '/profile/' . $ch[0]['channel_address'] . '[/embed]';
- }
- else
- $arr['body'] .= "\n\n[zmg=80x80]" . $profile['thumb'] . '[/zmg]';
- }
-
-
- $arr['verb'] = $activity;
- $arr['obj_type'] = $objtype;
- $arr['object'] = $object;
-
- if($target) {
- $arr['tgt_type'] = $tgttype;
- $arr['target'] = $target;
- }
-
- $arr['allow_cid'] = $allow_cid;
- $arr['allow_gid'] = $allow_gid;
- $arr['deny_cid'] = $deny_cid;
- $arr['deny_gid'] = $deny_gid;
- $arr['item_private'] = $private;
-
-
- $post = item_store($arr);
- $post_id = $post['item_id'];
-
- $arr['id'] = $post_id;
-
- call_hooks('post_local_end', $arr);
-
-
- if($extended_like) {
- $r = q("insert into likes (channel_id,liker,likee,iid,i_mid,verb,target_type,target_id,target) values (%d,'%s','%s',%d,'%s','%s','%s','%s','%s')",
- intval($ch[0]['channel_id']),
- dbesc($observer['xchan_hash']),
- dbesc($ch[0]['channel_hash']),
- intval($post_id),
- dbesc($mid),
- dbesc($activity),
- dbesc(($tgttype)? $tgttype : $objtype),
- dbesc($obj_id),
- dbesc(($target) ? $target : $object)
- );
- $r = q("select * from likes where liker = '%s' and likee = '%s' and i_mid = '%s' and verb = '%s' and target_type = '%s' and target_id = '%s' ",
- dbesc($observer['xchan_hash']),
- dbesc($ch[0]['channel_hash']),
- dbesc($mid),
- dbesc($activity),
- dbesc(($tgttype)? $tgttype : $objtype),
- dbesc($obj_id)
- );
- if($r)
- build_sync_packet($ch[0]['channel_id'],array('likes' => $r));
-
- }
-
-
- proc_run('php',"include/notifier.php","like","$post_id");
-
- if($interactive) {
- notice( t('Action completed.') . EOL);
- $o .= t('Thank you.');
- return $o;
- }
-
- killme();
-}
-
-
diff --git a/mod/linkinfo.php b/mod/linkinfo.php
deleted file mode 100644
index 07eaa02a0..000000000
--- a/mod/linkinfo.php
+++ /dev/null
@@ -1,371 +0,0 @@
-<?php
-
-
-function arr_add_hashes(&$item,$k) {
- $item = '#' . $item;
-}
-
-
-
-function linkinfo_content(&$a) {
-
- logger('linkinfo: ' . print_r($_REQUEST,true));
-
- $text = null;
- $str_tags = '';
-
-
- $br = "\n";
-
- if(x($_GET,'binurl'))
- $url = trim(hex2bin($_GET['binurl']));
- else
- $url = trim($_GET['url']);
-
- $url = strip_zids($url);
-
- if((substr($url,0,1) != '/') && (substr($url,0,4) != 'http'))
- $url = 'http://' . $url;
-
-
- if($_GET['title'])
- $title = strip_tags(trim($_GET['title']));
-
- if($_GET['description'])
- $text = strip_tags(trim($_GET['description']));
-
- if($_GET['tags']) {
- $arr_tags = str_getcsv($_GET['tags']);
- if(count($arr_tags)) {
- array_walk($arr_tags,'arr_add_hashes');
- $str_tags = $br . implode(' ',$arr_tags) . $br;
- }
- }
-
- logger('linkinfo: ' . $url);
-
- $result = z_fetch_url($url,false,0,array('novalidate' => true, 'nobody' => true));
- if($result['success']) {
- $hdrs=array();
- $h = explode("\n",$result['header']);
- foreach ($h as $l) {
- list($k,$v) = array_map("trim", explode(":", trim($l), 2));
- $hdrs[$k] = $v;
- }
- if (array_key_exists('Content-Type', $hdrs))
- $type = $hdrs['Content-Type'];
- if($type) {
- $zrl = is_matrix_url($url);
- if(stripos($type,'image/') !== false) {
- if($zrl)
- echo $br . '[zmg]' . $url . '[/zmg]' . $br;
- else
- echo $br . '[img]' . $url . '[/img]' . $br;
- killme();
- }
- if(stripos($type,'video/') !== false) {
- if($zrl)
- echo $br . '[zvideo]' . $url . '[/zvideo]' . $br;
- else
- echo $br . '[video]' . $url . '[/video]' . $br;
- killme();
- }
- if(stripos($type,'audio/') !== false) {
- if($zrl)
- echo $br . '[zaudio]' . $url . '[/zaudio]' . $br;
- else
- echo $br . '[audio]' . $url . '[/audio]' . $br;
- killme();
- }
- }
- }
-
- $template = $br . '#^[url=%s]%s[/url]%s' . $br;
-
- $arr = array('url' => $url, 'text' => '');
-
- call_hooks('parse_link', $arr);
-
- if(strlen($arr['text'])) {
- echo $arr['text'];
- killme();
- }
-
- $x = oembed_process($url);
- if($x) {
- echo $x;
- killme();
- }
-
- if($url && $title && $text) {
-
- $text = $br . '[quote]' . trim($text) . '[/quote]' . $br;
-
- $title = str_replace(array("\r","\n"),array('',''),$title);
-
- $result = sprintf($template,$url,($title) ? $title : $url,$text) . $str_tags;
-
- logger('linkinfo (unparsed): returns: ' . $result);
-
- echo $result;
- killme();
- }
-
- $siteinfo = parseurl_getsiteinfo($url);
-
- // If this is a Red site, use zrl rather than url so they get zids sent to them by default
-
- if( x($siteinfo,'generator') && (strpos($siteinfo['generator'], Zotlabs\Project\System::get_platform_name() . ' ') === 0))
- $template = str_replace('url','zrl',$template);
-
- if($siteinfo["title"] == "") {
- echo sprintf($template,$url,$url,'') . $str_tags;
- killme();
- } else {
- $text = $siteinfo["text"];
- $title = $siteinfo["title"];
- }
-
- $image = "";
-
- if(sizeof($siteinfo["images"]) > 0){
- /* Execute below code only if image is present in siteinfo */
-
- $total_images = 0;
- $max_images = get_config('system','max_bookmark_images');
- if($max_images === false)
- $max_images = 2;
- else
- $max_images = intval($max_images);
-
- foreach ($siteinfo["images"] as $imagedata) {
- if ($url) {
- $image .= sprintf('[url=%s]', $url);
- }
- $image .= '[img='.$imagedata["width"].'x'.$imagedata["height"].']'.$imagedata["src"].'[/img]';
- if ($url) {
- $image .= '[/url]';
- }
- $image .= "\n";
- $total_images ++;
- if($max_images && $max_images >= $total_images)
- break;
- }
- }
-
- if(strlen($text)) {
- $text = $br.'[quote]'.trim($text).'[/quote]'.$br ;
- }
-
- if($image) {
- $text = $br.$br.$image.$text;
- }
- $title = str_replace(array("\r","\n"),array('',''),$title);
-
- $result = sprintf($template,$url,($title) ? $title : $url,$text) . $str_tags;
-
- logger('linkinfo: returns: ' . $result, LOGGER_DEBUG);
-
- echo trim($result);
- killme();
-
-}
-
-
-function deletexnode(&$doc, $node) {
- $xpath = new DomXPath($doc);
- $list = $xpath->query("//".$node);
- foreach ($list as $child)
- $child->parentNode->removeChild($child);
-}
-
-function completeurl($url, $scheme) {
- $urlarr = parse_url($url);
-
- if (isset($urlarr["scheme"]))
- return($url);
-
- $schemearr = parse_url($scheme);
-
- $complete = $schemearr["scheme"]."://".$schemearr["host"];
-
- if ($schemearr["port"] != "")
- $complete .= ":".$schemearr["port"];
-
- if(strpos($urlarr['path'],'/') !== 0)
- $complete .= '/';
-
- $complete .= $urlarr["path"];
-
- if ($urlarr["query"] != "")
- $complete .= "?".$urlarr["query"];
-
- if ($urlarr["fragment"] != "")
- $complete .= "#".$urlarr["fragment"];
-
- return($complete);
-}
-
-
-function parseurl_getsiteinfo($url) {
- $siteinfo = array();
-
-
- $result = z_fetch_url($url,false,0,array('novalidate' => true));
- if(! $result['success'])
- return $siteinfo;
-
- $header = $result['header'];
- $body = $result['body'];
-
- $body = mb_convert_encoding($body, 'UTF-8', 'UTF-8');
- $body = mb_convert_encoding($body, 'HTML-ENTITIES', "UTF-8");
-
- $doc = new DOMDocument();
- @$doc->loadHTML($body);
-
- deletexnode($doc, 'style');
- deletexnode($doc, 'script');
- deletexnode($doc, 'option');
- deletexnode($doc, 'h1');
- deletexnode($doc, 'h2');
- deletexnode($doc, 'h3');
- deletexnode($doc, 'h4');
- deletexnode($doc, 'h5');
- deletexnode($doc, 'h6');
- deletexnode($doc, 'ol');
- deletexnode($doc, 'ul');
-
- $xpath = new DomXPath($doc);
-
- //$list = $xpath->query("head/title");
- $list = $xpath->query("//title");
- foreach ($list as $node)
- $siteinfo["title"] = html_entity_decode($node->nodeValue, ENT_QUOTES, "UTF-8");
-
- //$list = $xpath->query("head/meta[@name]");
- $list = $xpath->query("//meta[@name]");
- foreach ($list as $node) {
- $attr = array();
- if ($node->attributes->length)
- foreach ($node->attributes as $attribute)
- $attr[$attribute->name] = $attribute->value;
-
- $attr["content"] = html_entity_decode($attr["content"], ENT_QUOTES, "UTF-8");
-
- switch (strtolower($attr["name"])) {
- case 'generator':
- $siteinfo['generator'] = $attr['content'];
- break;
- case "fulltitle":
- $siteinfo["title"] = $attr["content"];
- break;
- case "description":
- $siteinfo["text"] = $attr["content"];
- break;
- case "dc.title":
- $siteinfo["title"] = $attr["content"];
- break;
- case "dc.description":
- $siteinfo["text"] = $attr["content"];
- break;
- }
- }
-
- //$list = $xpath->query("head/meta[@property]");
- $list = $xpath->query("//meta[@property]");
- foreach ($list as $node) {
- $attr = array();
- if ($node->attributes->length)
- foreach ($node->attributes as $attribute)
- $attr[$attribute->name] = $attribute->value;
-
- $attr["content"] = html_entity_decode($attr["content"], ENT_QUOTES, "UTF-8");
-
- switch (strtolower($attr["property"])) {
- case "og:image":
- $siteinfo["image"] = $attr["content"];
- break;
- case "og:title":
- $siteinfo["title"] = $attr["content"];
- break;
- case "og:description":
- $siteinfo["text"] = $attr["content"];
- break;
- }
- }
-
- if ($siteinfo["image"] == "") {
- $list = $xpath->query("//img[@src]");
- foreach ($list as $node) {
- $attr = array();
- if ($node->attributes->length)
- foreach ($node->attributes as $attribute)
- $attr[$attribute->name] = $attribute->value;
-
- $src = completeurl($attr["src"], $url);
- $photodata = @getimagesize($src);
-
- if (($photodata) && ($photodata[0] > 150) and ($photodata[1] > 150)) {
- if ($photodata[0] > 300) {
- $photodata[1] = round($photodata[1] * (300 / $photodata[0]));
- $photodata[0] = 300;
- }
- if ($photodata[1] > 300) {
- $photodata[0] = round($photodata[0] * (300 / $photodata[1]));
- $photodata[1] = 300;
- }
- $siteinfo["images"][] = array("src"=>$src,
- "width"=>$photodata[0],
- "height"=>$photodata[1]);
- }
-
- }
- } else {
- $src = completeurl($siteinfo["image"], $url);
-
- unset($siteinfo["image"]);
-
- $photodata = @getimagesize($src);
-
- if (($photodata) && ($photodata[0] > 10) and ($photodata[1] > 10))
- $siteinfo["images"][] = array("src"=>$src,
- "width"=>$photodata[0],
- "height"=>$photodata[1]);
- }
-
- if ($siteinfo["text"] == "") {
- $text = "";
-
- $list = $xpath->query("//div[@class='article']");
- foreach ($list as $node)
- if (strlen($node->nodeValue) > 40)
- $text .= " ".trim($node->nodeValue);
-
- if ($text == "") {
- $list = $xpath->query("//div[@class='content']");
- foreach ($list as $node)
- if (strlen($node->nodeValue) > 40)
- $text .= " ".trim($node->nodeValue);
- }
-
- // If none text was found then take the paragraph content
- if ($text == "") {
- $list = $xpath->query("//p");
- foreach ($list as $node)
- if (strlen($node->nodeValue) > 40)
- $text .= " ".trim($node->nodeValue);
- }
-
- if ($text != "") {
- $text = trim(str_replace(array("\n", "\r"), array(" ", " "), $text));
-
- while (strpos($text, " "))
- $text = trim(str_replace(" ", " ", $text));
-
- $siteinfo["text"] = html_entity_decode(substr($text,0,350), ENT_QUOTES, "UTF-8").'...';
- }
- }
-
- return($siteinfo);
-}
diff --git a/mod/lockview.php b/mod/lockview.php
deleted file mode 100644
index d4a626a11..000000000
--- a/mod/lockview.php
+++ /dev/null
@@ -1,115 +0,0 @@
-<?php
-
-
-function lockview_content(&$a) {
-
- $type = ((argc() > 1) ? argv(1) : 0);
- if (is_numeric($type)) {
- $item_id = intval($type);
- $type='item';
- } else {
- $item_id = ((argc() > 2) ? intval(argv(2)) : 0);
- }
-
- if(! $item_id)
- killme();
-
- if (!in_array($type, array('item','photo','event', 'menu_item', 'chatroom')))
- killme();
-
- //we have different naming in in menu_item table and chatroom table
- switch($type) {
- case 'menu_item':
- $id = 'mitem_id';
- break;
- case 'chatroom':
- $id = 'cr_id';
- break;
- default:
- $id = 'id';
- break;
- }
-
- $r = q("SELECT * FROM %s WHERE $id = %d LIMIT 1",
- dbesc($type),
- intval($item_id)
- );
-
- if(! $r)
- killme();
-
- $item = $r[0];
-
- //we have different naming in in menu_item table and chatroom table
- switch($type) {
- case 'menu_item':
- $uid = $item['mitem_channel_id'];
- break;
- case 'chatroom':
- $uid = $item['cr_uid'];
- break;
- default:
- $uid = $item['uid'];
- break;
- }
-
- if($uid != local_channel()) {
- echo '<li>' . t('Remote privacy information not available.') . '</li>';
- killme();
- }
-
- if(($item['item_private'] == 1) && (! strlen($item['allow_cid'])) && (! strlen($item['allow_gid']))
- && (! strlen($item['deny_cid'])) && (! strlen($item['deny_gid']))) {
-
- // if the post is private, but public_policy is blank ("visible to the internet"), and there aren't any
- // specific recipients, we're the recipient of a post with "bcc" or targeted recipients; so we'll just show it
- // as unknown specific recipients. The sender will have the visibility list and will fall through to the
- // next section.
-
- echo '<li>' . translate_scope((! $item['public_policy']) ? 'specific' : $item['public_policy']) . '</li>';
- killme();
- }
-
- $allowed_users = expand_acl($item['allow_cid']);
- $allowed_groups = expand_acl($item['allow_gid']);
- $deny_users = expand_acl($item['deny_cid']);
- $deny_groups = expand_acl($item['deny_gid']);
-
- $o = '<li>' . t('Visible to:') . '</li>';
- $l = array();
-
- stringify_array_elms($allowed_groups,true);
- stringify_array_elms($allowed_users,true);
- stringify_array_elms($deny_groups,true);
- stringify_array_elms($deny_users,true);
-
- if(count($allowed_groups)) {
- $r = q("SELECT name FROM `groups` WHERE hash IN ( " . implode(', ', $allowed_groups) . " )");
- if($r)
- foreach($r as $rr)
- $l[] = '<li><b>' . $rr['name'] . '</b></li>';
- }
- if(count($allowed_users)) {
- $r = q("SELECT xchan_name FROM xchan WHERE xchan_hash IN ( " . implode(', ',$allowed_users) . " )");
- if($r)
- foreach($r as $rr)
- $l[] = '<li>' . $rr['xchan_name'] . '</li>';
- }
- if(count($deny_groups)) {
- $r = q("SELECT name FROM `groups` WHERE hash IN ( " . implode(', ', $deny_groups) . " )");
- if($r)
- foreach($r as $rr)
- $l[] = '<li><b><strike>' . $rr['name'] . '</strike></b></li>';
- }
- if(count($deny_users)) {
- $r = q("SELECT xchan_name FROM xchan WHERE xchan_hash IN ( " . implode(', ', $deny_users) . " )");
- if($r)
- foreach($r as $rr)
- $l[] = '<li><strike>' . $rr['xchan_name'] . '</strike></li>';
- }
-
- echo $o . implode($l);
- killme();
-
-
-}
diff --git a/mod/locs.php b/mod/locs.php
deleted file mode 100644
index 1daf41b89..000000000
--- a/mod/locs.php
+++ /dev/null
@@ -1,126 +0,0 @@
-<?php /** @file */
-
-
-function locs_post(&$a) {
-
- if(! local_channel())
- return;
-
- $channel = App::get_channel();
-
- if($_REQUEST['primary']) {
- $hubloc_id = intval($_REQUEST['primary']);
- if($hubloc_id) {
-
- $r = q("select hubloc_id from hubloc where hubloc_id = %d and hubloc_hash = '%s' limit 1",
- intval($hubloc_id),
- dbesc($channel['channel_hash'])
- );
-
- if(! $r) {
- notice( t('Location not found.') . EOL);
- return;
- }
-
- $r = q("update hubloc set hubloc_primary = 0 where hubloc_primary = 1 and hubloc_hash = '%s' ",
- dbesc($channel['channel_hash'])
- );
- $r = q("update hubloc set hubloc_primary = 1 where hubloc_id = %d and hubloc_hash = '%s'",
- intval($hubloc_id),
- dbesc($channel['channel_hash'])
- );
-
- proc_run('php','include/notifier.php','location',$channel['channel_id']);
- return;
- }
- }
-
-
- if($_REQUEST['drop']) {
- $hubloc_id = intval($_REQUEST['drop']);
-
- if($hubloc_id) {
- $r = q("select * from hubloc where hubloc_id = %d and hubloc_url != '%s' and hubloc_hash = '%s' limit 1",
- intval($hubloc_id),
- dbesc(z_root()),
- dbesc($channel['channel_hash'])
- );
-
- if(! $r) {
- notice( t('Location not found.') . EOL);
- return;
- }
- if(intval($r[0]['hubloc_primary'])) {
- $x = q("select hubloc_id from hubloc where hubloc_primary = 1 and hubloc_hash = '%s'",
- dbesc($channel['channel_hash'])
- );
- if(! $x) {
- notice( t('Location lookup failed.'));
- return;
- }
- if(count($x) == 1) {
- notice( t('Please select another location to become primary before removing the primary location.') . EOL);
- return;
- }
- }
-
- $r = q("update hubloc set hubloc_deleted = 1 where hubloc_id = %d and hubloc_hash = '%s'",
- intval($hubloc_id),
- dbesc($channel['channel_hash'])
- );
- proc_run('php','include/notifier.php','location',$channel['channel_id']);
- return;
- }
- }
-}
-
-
-
-function locs_content(&$a) {
-
-
- if(! local_channel()) {
- notice( t('Permission denied.') . EOL);
- return;
- }
-
- $channel = App::get_channel();
-
- if($_REQUEST['sync']) {
- proc_run('php','include/notifier.php','location',$channel['channel_id']);
- info( t('Syncing locations') . EOL);
- goaway(z_root() . '/locs');
- }
-
-
- $r = q("select * from hubloc where hubloc_hash = '%s'",
- dbesc($channel['channel_hash'])
- );
-
- if(! $r) {
- notice( t('No locations found.') . EOL);
- return;
- }
-
-
- for($x = 0; $x < count($r); $x ++) {
- $r[$x]['primary'] = (intval($r[$x]['hubloc_primary']) ? true : false);
- $r[$x]['deleted'] = (intval($r[$x]['hubloc_deleted']) ? true : false);
- }
-
- $o = replace_macros(get_markup_template('locmanage.tpl'), array(
- '$header' => t('Manage Channel Locations'),
- '$loc' => t('Location'),
- '$addr' => t('Address'),
- '$mkprm' => t('Primary'),
- '$drop' => t('Drop'),
- '$submit' => t('Submit'),
- '$sync' => t('Sync Now'),
- '$sync_text' => t('Please wait several minutes between consecutive operations.'),
- '$drop_text' => t('When possible, drop a location by logging into that website/hub and removing your channel.'),
- '$last_resort' => t('Use this form to drop the location if the hub is no longer operating.'),
- '$hubs' => $r
- ));
-
- return $o;
-}
diff --git a/mod/login.php b/mod/login.php
deleted file mode 100644
index 31a4e7fc0..000000000
--- a/mod/login.php
+++ /dev/null
@@ -1,7 +0,0 @@
-<?php
-
-function login_content(&$a) {
- if(local_channel())
- goaway(z_root());
- return login((App::$config['system']['register_policy'] == REGISTER_CLOSED) ? false : true);
-}
diff --git a/mod/lostpass.php b/mod/lostpass.php
deleted file mode 100644
index 2ae955983..000000000
--- a/mod/lostpass.php
+++ /dev/null
@@ -1,132 +0,0 @@
-<?php
-
-
-function lostpass_post(&$a) {
-
- $loginame = notags(trim($_POST['login-name']));
- if(! $loginame)
- goaway(z_root());
-
- $r = q("SELECT * FROM account WHERE account_email = '%s' LIMIT 1",
- dbesc($loginame)
- );
-
- if(! $r) {
- notice( t('No valid account found.') . EOL);
- goaway(z_root());
- }
-
- $aid = $r[0]['account_id'];
- $email = $r[0]['account_email'];
-
- $hash = random_string();
-
- $r = q("UPDATE account SET account_reset = '%s' WHERE account_id = %d",
- dbesc($hash),
- intval($aid)
- );
- if($r)
- info( t('Password reset request issued. Check your email.') . EOL);
-
- $email_tpl = get_intltext_template("lostpass_eml.tpl");
- $message = replace_macros($email_tpl, array(
- '$sitename' => get_config('system','sitename'),
- '$siteurl' => z_root(),
- '$username' => sprintf( t('Site Member (%s)'), $email),
- '$email' => $email,
- '$reset_link' => z_root() . '/lostpass?verify=' . $hash
- ));
-
- $subject = email_header_encode(sprintf( t('Password reset requested at %s'),get_config('system','sitename')), 'UTF-8');
-
- $res = mail($email, $subject ,
- $message,
- 'From: Administrator@' . $_SERVER['SERVER_NAME'] . "\n"
- . 'Content-type: text/plain; charset=UTF-8' . "\n"
- . 'Content-transfer-encoding: 8bit' );
-
-
- goaway(z_root());
-}
-
-
-function lostpass_content(&$a) {
-
-
- if(x($_GET,'verify')) {
- $verify = $_GET['verify'];
-
- $r = q("SELECT * FROM account WHERE account_reset = '%s' LIMIT 1",
- dbesc($verify)
- );
- if(! $r) {
- notice( t("Request could not be verified. (You may have previously submitted it.) Password reset failed.") . EOL);
- goaway(z_root());
- return;
- }
-
- $aid = $r[0]['account_id'];
- $email = $r[0]['account_email'];
-
- $new_password = autoname(6) . mt_rand(100,9999);
-
- $salt = random_string(32);
- $password_encoded = hash('whirlpool', $salt . $new_password);
-
- $r = q("UPDATE account SET account_salt = '%s', account_password = '%s', account_reset = '', account_flags = (account_flags & ~%d) where account_id = %d",
- dbesc($salt),
- dbesc($password_encoded),
- intval(ACCOUNT_UNVERIFIED),
- intval($aid)
- );
-
- if($r) {
- $tpl = get_markup_template('pwdreset.tpl');
- $o .= replace_macros($tpl,array(
- '$lbl1' => t('Password Reset'),
- '$lbl2' => t('Your password has been reset as requested.'),
- '$lbl3' => t('Your new password is'),
- '$lbl4' => t('Save or copy your new password - and then'),
- '$lbl5' => '<a href="' . z_root() . '/login">' . t('click here to login') . '</a>.',
- '$lbl6' => t('Your password may be changed from the <em>Settings</em> page after successful login.'),
- '$newpass' => $new_password,
- '$baseurl' => z_root()
-
- ));
-
- info("Your password has been reset." . EOL);
-
- $email_tpl = get_intltext_template("passchanged_eml.tpl");
- $message = replace_macros($email_tpl, array(
- '$sitename' => App::$config['sitename'],
- '$siteurl' => z_root(),
- '$username' => sprintf( t('Site Member (%s)'), $email),
- '$email' => $email,
- '$new_password' => $new_password,
- '$uid' => $newuid ));
-
- $subject = email_header_encode( sprintf( t('Your password has changed at %s'), get_config('system','sitename')), 'UTF-8');
-
- $res = mail($email,$subject,$message,
- 'From: ' . 'Administrator@' . $_SERVER['SERVER_NAME'] . "\n"
- . 'Content-type: text/plain; charset=UTF-8' . "\n"
- . 'Content-transfer-encoding: 8bit' );
-
- return $o;
- }
-
- }
- else {
- $tpl = get_markup_template('lostpass.tpl');
-
- $o .= replace_macros($tpl,array(
- '$title' => t('Forgot your Password?'),
- '$desc' => t('Enter your email address and submit to have your password reset. Then check your email for further instructions.'),
- '$name' => t('Email Address'),
- '$submit' => t('Reset')
- ));
-
- return $o;
- }
-
-}
diff --git a/mod/magic.php b/mod/magic.php
deleted file mode 100644
index 74adbfd6d..000000000
--- a/mod/magic.php
+++ /dev/null
@@ -1,167 +0,0 @@
-<?php
-
-@require_once('include/zot.php');
-
-function magic_init(&$a) {
-
- $ret = array('success' => false, 'url' => '', 'message' => '');
- logger('mod_magic: invoked', LOGGER_DEBUG);
-
- logger('mod_magic: args: ' . print_r($_REQUEST,true),LOGGER_DATA);
-
- $addr = ((x($_REQUEST,'addr')) ? $_REQUEST['addr'] : '');
- $dest = ((x($_REQUEST,'dest')) ? $_REQUEST['dest'] : '');
- $test = ((x($_REQUEST,'test')) ? intval($_REQUEST['test']) : 0);
- $rev = ((x($_REQUEST,'rev')) ? intval($_REQUEST['rev']) : 0);
- $delegate = ((x($_REQUEST,'delegate')) ? $_REQUEST['delegate'] : '');
-
- $parsed = parse_url($dest);
- if(! $parsed) {
- if($test) {
- $ret['message'] .= 'could not parse ' . $dest . EOL;
- return($ret);
- }
- goaway($dest);
- }
-
- $basepath = $parsed['scheme'] . '://' . $parsed['host'] . (($parsed['port']) ? ':' . $parsed['port'] : '');
-
- $x = q("select * from hubloc where hubloc_url = '%s' order by hubloc_connected desc limit 1",
- dbesc($basepath)
- );
-
- if(! $x) {
-
- /*
- * We have no records for, or prior communications with this hub.
- * If an address was supplied, let's finger them to create a hub record.
- * Otherwise we'll use the special address '[system]' which will return
- * either a system channel or the first available normal channel. We don't
- * really care about what channel is returned - we need the hub information
- * from that response so that we can create signed auth packets destined
- * for that hub.
- *
- */
-
- $ret = zot_finger((($addr) ? $addr : '[system]@' . $parsed['host']),null);
- if($ret['success']) {
- $j = json_decode($ret['body'],true);
- if($j)
- import_xchan($j);
-
- // Now try again
-
- $x = q("select * from hubloc where hubloc_url = '%s' order by hubloc_connected desc limit 1",
- dbesc($basepath)
- );
- }
- }
-
- if(! $x) {
- if($rev)
- goaway($dest);
- else {
- logger('mod_magic: no channels found for requested hub.' . print_r($_REQUEST,true));
- if($test) {
- $ret['message'] .= 'This site has no previous connections with ' . $basepath . EOL;
- return $ret;
- }
- notice( t('Hub not found.') . EOL);
- return;
- }
- }
-
- // This is ready-made for a plugin that provides a blacklist or "ask me" before blindly authenticating.
- // By default, we'll proceed without asking.
-
- $arr = array(
- 'channel_id' => local_channel(),
- 'xchan' => $x[0],
- 'destination' => $dest,
- 'proceed' => true
- );
-
- call_hooks('magic_auth',$arr);
- $dest = $arr['destination'];
- if(! $arr['proceed']) {
- if($test) {
- $ret['message'] .= 'cancelled by plugin.' . EOL;
- return $ret;
- }
- goaway($dest);
- }
-
- if((get_observer_hash()) && ($x[0]['hubloc_url'] === z_root())) {
- // We are already authenticated on this site and a registered observer.
- // Just redirect.
- if($test) {
- $ret['success'] = true;
- $ret['message'] .= 'Local site - you are already authenticated.' . EOL;
- return $ret;
- }
-
- $delegation_success = false;
- if($delegate) {
- $r = q("select * from channel left join hubloc on channel_hash = hubloc_hash where hubloc_addr = '%s' limit 1",
- dbesc($delegate)
- );
-
- if($r && intval($r[0]['channel_id'])) {
- $allowed = perm_is_allowed($r[0]['channel_id'],get_observer_hash(),'delegate');
- if($allowed) {
- $_SESSION['delegate_channel'] = $r[0]['channel_id'];
- $_SESSION['delegate'] = get_observer_hash();
- $_SESSION['account_id'] = intval($r[0]['channel_account_id']);
- change_channel($r[0]['channel_id']);
-
- $delegation_success = true;
- }
- }
- }
-
-
-
- // FIXME: check and honour local delegation
-
-
- goaway($dest);
- }
-
- if(local_channel()) {
- $channel = App::get_channel();
-
- $token = random_string();
- $token_sig = base64url_encode(rsa_sign($token,$channel['channel_prvkey']));
-
- $channel['token'] = $token;
- $channel['token_sig'] = $token_sig;
-
- Zotlabs\Zot\Verify::create('auth',$channel['channel_id'],$token,$x[0]['hubloc_url']);
-
- $target_url = $x[0]['hubloc_callback'] . '/?f=&auth=' . urlencode($channel['channel_address'] . '@' . App::get_hostname())
- . '&sec=' . $token . '&dest=' . urlencode($dest) . '&version=' . ZOT_REVISION;
-
- if($delegate)
- $target_url .= '&delegate=' . urlencode($delegate);
-
- logger('mod_magic: redirecting to: ' . $target_url, LOGGER_DEBUG);
-
- if($test) {
- $ret['success'] = true;
- $ret['url'] = $target_url;
- $ret['message'] = 'token ' . $token . ' created for channel ' . $channel['channel_id'] . ' for url ' . $x[0]['hubloc_url'] . EOL;
- return $ret;
- }
-
- goaway($target_url);
-
- }
-
- if($test) {
- $ret['message'] = 'Not authenticated or invalid arguments to mod_magic' . EOL;
- return $ret;
- }
-
- goaway($dest);
-
-}
diff --git a/mod/mail.php b/mod/mail.php
deleted file mode 100644
index 1ab2bc5ab..000000000
--- a/mod/mail.php
+++ /dev/null
@@ -1,391 +0,0 @@
-<?php
-
-require_once('include/acl_selectors.php');
-require_once('include/message.php');
-require_once('include/zot.php');
-require_once("include/bbcode.php");
-require_once('include/Contact.php');
-
-
-function mail_post(&$a) {
-
- if(! local_channel())
- return;
-
- $replyto = ((x($_REQUEST,'replyto')) ? notags(trim($_REQUEST['replyto'])) : '');
- $subject = ((x($_REQUEST,'subject')) ? notags(trim($_REQUEST['subject'])) : '');
- $body = ((x($_REQUEST,'body')) ? escape_tags(trim($_REQUEST['body'])) : '');
- $recipient = ((x($_REQUEST,'messageto')) ? notags(trim($_REQUEST['messageto'])) : '');
- $rstr = ((x($_REQUEST,'messagerecip')) ? notags(trim($_REQUEST['messagerecip'])) : '');
- $preview = ((x($_REQUEST,'preview')) ? intval($_REQUEST['preview']) : 0);
- $expires = ((x($_REQUEST,'expires')) ? datetime_convert(date_default_timezone_get(),'UTC', $_REQUEST['expires']) : NULL_DATE);
-
- // If we have a raw string for a recipient which hasn't been auto-filled,
- // it means they probably aren't in our address book, hence we don't know
- // if we have permission to send them private messages.
- // finger them and find out before we try and send it.
-
- if(! $recipient) {
- $channel = App::get_channel();
-
- $ret = zot_finger($rstr,$channel);
-
- if(! $ret['success']) {
- notice( t('Unable to lookup recipient.') . EOL);
- return;
- }
- $j = json_decode($ret['body'],true);
-
- logger('message_post: lookup: ' . $url . ' ' . print_r($j,true));
-
- if(! ($j['success'] && $j['guid'])) {
- notice( t('Unable to communicate with requested channel.'));
- return;
- }
-
- $x = import_xchan($j);
-
- if(! $x['success']) {
- notice( t('Cannot verify requested channel.'));
- return;
- }
-
- $recipient = $x['hash'];
-
- $their_perms = 0;
-
- $global_perms = get_perms();
-
- if($j['permissions']['data']) {
- $permissions = crypto_unencapsulate($j['permissions'],$channel['channel_prvkey']);
- if($permissions)
- $permissions = json_decode($permissions);
- logger('decrypted permissions: ' . print_r($permissions,true), LOGGER_DATA);
- }
- else
- $permissions = $j['permissions'];
-
- foreach($permissions as $k => $v) {
- if($v) {
- $their_perms = $their_perms | intval($global_perms[$k][1]);
- }
- }
-
- if(! ($their_perms & PERMS_W_MAIL)) {
- notice( t('Selected channel has private message restrictions. Send failed.'));
- // reported issue: let's still save the message and continue. We'll just tell them
- // that nothing useful is likely to happen. They might have spent hours on it.
- // return;
-
- }
- }
-
-// if(feature_enabled(local_channel(),'richtext')) {
-// $body = fix_mce_lf($body);
-// }
-
- require_once('include/text.php');
- linkify_tags($a, $body, local_channel());
-
- if($preview) {
-
-
-
-
- }
-
- if(! $recipient) {
- notice('No recipient found.');
- App::$argc = 2;
- App::$argv[1] = 'new';
- return;
- }
-
- // We have a local_channel, let send_message use the session channel and save a lookup
-
- $ret = send_message(0, $recipient, $body, $subject, $replyto, $expires);
-
- if($ret['success']) {
- xchan_mail_query($ret['mail']);
- build_sync_packet(0,array('conv' => array($ret['conv']),'mail' => array(encode_mail($ret['mail'],true))));
- }
- else {
- notice($ret['message']);
- }
-
- goaway(z_root() . '/mail/combined');
-
-}
-
-function mail_content(&$a) {
-
- $o = '';
- nav_set_selected('messages');
-
- if(! local_channel()) {
- notice( t('Permission denied.') . EOL);
- return login();
- }
-
- $channel = App::get_channel();
-
- head_set_icon($channel['xchan_photo_s']);
-
- $cipher = get_pconfig(local_channel(),'system','default_cipher');
- if(! $cipher)
- $cipher = 'aes256';
-
- $tpl = get_markup_template('mail_head.tpl');
- $header = replace_macros($tpl, array(
- '$header' => t('Messages'),
- ));
-
- if((argc() == 4) && (argv(2) === 'drop')) {
- if(! intval(argv(3)))
- return;
- $cmd = argv(2);
- $mailbox = argv(1);
- $r = private_messages_drop(local_channel(), argv(3));
- if($r) {
- //info( t('Message deleted.') . EOL );
- }
- goaway(z_root() . '/mail/' . $mailbox);
- }
-
- if((argc() == 4) && (argv(2) === 'recall')) {
- if(! intval(argv(3)))
- return;
- $cmd = argv(2);
- $mailbox = argv(1);
- $r = q("update mail set mail_recalled = 1 where id = %d and channel_id = %d",
- intval(argv(3)),
- intval(local_channel())
- );
- $x = q("select * from mail where id = %d and channel_id = %d",
- intval(argv(3)),
- intval(local_channel())
- );
- if($x) {
- build_sync_packet(local_channel(),array('mail' => encode_mail($x[0],true)));
- }
-
- proc_run('php','include/notifier.php','mail',intval(argv(3)));
-
- if($r) {
- info( t('Message recalled.') . EOL );
- }
- goaway(z_root() . '/mail/' . $mailbox . '/' . argv(3));
-
- }
-
- if((argc() == 4) && (argv(2) === 'dropconv')) {
- if(! intval(argv(3)))
- return;
- $cmd = argv(2);
- $mailbox = argv(1);
- $r = private_messages_drop(local_channel(), argv(3), true);
- if($r)
- info( t('Conversation removed.') . EOL );
- goaway(z_root() . '/mail/' . $mailbox);
- }
-
- if((argc() > 1) && (argv(1) === 'new')) {
-
- $plaintext = true;
-
- $tpl = get_markup_template('msg-header.tpl');
-
- $header = replace_macros($tpl, array(
- '$baseurl' => z_root(),
- '$editselect' => (($plaintext) ? 'none' : '/(profile-jot-text|prvmail-text)/'),
- '$nickname' => $channel['channel_address'],
- '$linkurl' => t('Please enter a link URL:'),
- '$expireswhen' => t('Expires YYYY-MM-DD HH:MM')
- ));
-
- App::$page['htmlhead'] .= $header;
-
- $prename = '';
- $preid = '';
-
- if(x($_REQUEST,'hash')) {
-
- $r = q("select abook.*, xchan.* from abook left join xchan on abook_xchan = xchan_hash
- where abook_channel = %d and abook_xchan = '%s' limit 1",
- intval(local_channel()),
- dbesc($_REQUEST['hash'])
- );
-
- if(!$r) {
- $r = q("select * from xchan where xchan_hash = '%s' and xchan_network = 'zot' limit 1",
- dbesc($_REQUEST['hash'])
- );
- }
-
- if($r) {
- $prename = (($r[0]['abook_id']) ? $r[0]['xchan_name'] : $r[0]['xchan_addr']);
- $preurl = $r[0]['xchan_url'];
- $preid = (($r[0]['abook_id']) ? ($r[0]['xchan_hash']) : '');
- }
- else {
- notice( t('Requested channel is not in this network') . EOL );
- }
-
- }
-
- $tpl = get_markup_template('prv_message.tpl');
- $o .= replace_macros($tpl,array(
- '$new' => true,
- '$header' => t('Send Private Message'),
- '$to' => t('To:'),
- '$prefill' => $prename,
- '$preid' => $preid,
- '$subject' => t('Subject:'),
- '$subjtxt' => ((x($_REQUEST,'subject')) ? strip_tags($_REQUEST['subject']) : ''),
- '$text' => ((x($_REQUEST,'body')) ? htmlspecialchars($_REQUEST['body'], ENT_COMPAT, 'UTF-8') : ''),
- '$yourmessage' => t('Your message:'),
- '$parent' => '',
- '$attach' => t('Attach file'),
- '$insert' => t('Insert web link'),
- '$submit' => t('Send'),
- '$defexpire' => '',
- '$feature_expire' => ((feature_enabled(local_channel(),'content_expire')) ? true : false),
- '$expires' => t('Set expiration date'),
- '$feature_encrypt' => ((feature_enabled(local_channel(),'content_encrypt')) ? true : false),
- '$encrypt' => t('Encrypt text'),
- '$cipher' => $cipher,
- ));
-
- return $o;
- }
-
- switch(argv(1)) {
- case 'combined':
- $mailbox = 'combined';
- break;
- case 'inbox':
- $mailbox = 'inbox';
- break;
- case 'outbox':
- $mailbox = 'outbox';
- break;
- default:
- $mailbox = 'combined';
- break;
- }
-
- $last_message = private_messages_list(local_channel(), $mailbox, 0, 1);
-
- $mid = ((argc() > 2) && (intval(argv(2)))) ? argv(2) : $last_message[0]['id'];
-
- $plaintext = true;
-
-// if( local_channel() && feature_enabled(local_channel(),'richtext') )
-// $plaintext = false;
-
-
-
- if($mailbox == 'combined') {
- $messages = private_messages_fetch_conversation(local_channel(), $mid, true);
- }
- else {
- $messages = private_messages_fetch_message(local_channel(), $mid, true);
- }
-
- if(! $messages) {
- //info( t('Message not found.') . EOL);
- return;
- }
-
- if($messages[0]['to_xchan'] === $channel['channel_hash'])
- App::$poi = $messages[0]['from'];
- else
- App::$poi = $messages[0]['to'];
-
-// require_once('include/Contact.php');
-
-// App::set_widget('mail_conversant',vcard_from_xchan(App::$poi,$get_observer_hash,'mail'));
-
-
- $tpl = get_markup_template('msg-header.tpl');
-
- App::$page['htmlhead'] .= replace_macros($tpl, array(
- '$nickname' => $channel['channel_address'],
- '$baseurl' => z_root(),
- '$editselect' => (($plaintext) ? 'none' : '/(profile-jot-text|prvmail-text)/'),
- '$linkurl' => t('Please enter a link URL:'),
- '$expireswhen' => t('Expires YYYY-MM-DD HH:MM')
- ));
-
- $mails = array();
-
- $seen = 0;
- $unknown = false;
-
- foreach($messages as $message) {
-
- $s = theme_attachments($message);
-
- $mails[] = array(
- 'mailbox' => $mailbox,
- 'id' => $message['id'],
- 'mid' => $message['mid'],
- 'from_name' => $message['from']['xchan_name'],
- 'from_url' => chanlink_hash($message['from_xchan']),
- 'from_photo' => $message['from']['xchan_photo_s'],
- 'to_name' => $message['to']['xchan_name'],
- 'to_url' => chanlink_hash($message['to_xchan']),
- 'to_photo' => $message['to']['xchan_photo_s'],
- 'subject' => $message['title'],
- 'body' => smilies(bbcode($message['body'])),
- 'attachments' => $s,
- 'delete' => t('Delete message'),
- 'dreport' => t('Delivery report'),
- 'recall' => t('Recall message'),
- 'can_recall' => (($channel['channel_hash'] == $message['from_xchan']) ? true : false),
- 'is_recalled' => (intval($message['mail_recalled']) ? t('Message has been recalled.') : ''),
- 'date' => datetime_convert('UTC',date_default_timezone_get(),$message['created'], 'c'),
- );
-
- $seen = $message['seen'];
-
- }
-
- $recp = (($message['from_xchan'] === $channel['channel_hash']) ? 'to' : 'from');
-
- $tpl = get_markup_template('mail_display.tpl');
- $o = replace_macros($tpl, array(
- '$mailbox' => $mailbox,
- '$prvmsg_header' => $message['title'],
- '$thread_id' => $mid,
- '$thread_subject' => $message['title'],
- '$thread_seen' => $seen,
- '$delete' => t('Delete Conversation'),
- '$canreply' => (($unknown) ? false : '1'),
- '$unknown_text' => t("No secure communications available. You <strong>may</strong> be able to respond from the sender's profile page."),
- '$mails' => $mails,
-
- // reply
- '$header' => t('Send Reply'),
- '$to' => t('To:'),
- '$reply' => true,
- '$subject' => t('Subject:'),
- '$subjtxt' => $message['title'],
- '$yourmessage' => sprintf(t('Your message for %s (%s):'), $message[$recp]['xchan_name'], $message[$recp]['xchan_addr']),
- '$text' => '',
- '$parent' => $message['parent_mid'],
- '$recphash' => $message[$recp]['xchan_hash'],
- '$attach' => t('Attach file'),
- '$insert' => t('Insert web link'),
- '$submit' => t('Submit'),
- '$defexpire' => '',
- '$feature_expire' => ((feature_enabled(local_channel(),'content_expire')) ? true : false),
- '$expires' => t('Set expiration date'),
- '$feature_encrypt' => ((feature_enabled(local_channel(),'content_encrypt')) ? true : false),
- '$encrypt' => t('Encrypt text'),
- '$cipher' => $cipher,
- ));
-
- return $o;
-
-}
diff --git a/mod/manage.php b/mod/manage.php
deleted file mode 100644
index 5ac3e6af8..000000000
--- a/mod/manage.php
+++ /dev/null
@@ -1,175 +0,0 @@
-<?php
-
-function manage_content(&$a) {
-
- if((! get_account_id()) || ($_SESSION['delegate'])) {
- notice( t('Permission denied.') . EOL);
- return;
- }
-
- require_once('include/security.php');
-
- $change_channel = ((argc() > 1) ? intval(argv(1)) : 0);
-
- if((argc() > 2) && (argv(2) === 'default')) {
- $r = q("select channel_id from channel where channel_id = %d and channel_account_id = %d limit 1",
- intval($change_channel),
- intval(get_account_id())
- );
- if($r) {
- q("update account set account_default_channel = %d where account_id = %d",
- intval($change_channel),
- intval(get_account_id())
- );
- }
- goaway(z_root() . '/manage');
- }
-
- if($change_channel) {
- $r = change_channel($change_channel);
-
- if((argc() > 2) && !(argv(2) === 'default')) {
- goaway(z_root() . '/' . implode('/',array_slice(App::$argv,2))); // Go to whatever is after /manage/, but with the new channel
- }
- else {
- if($r && $r['channel_startpage'])
- goaway(z_root() . '/' . $r['channel_startpage']); // If nothing extra is specified, go to the default page
- }
- goaway(z_root());
- }
-
- $channels = null;
-
- if(local_channel()) {
- $r = q("select channel.*, xchan.* from channel left join xchan on channel.channel_hash = xchan.xchan_hash where channel.channel_account_id = %d and channel_removed = 0 order by channel_name ",
- intval(get_account_id())
- );
-
- $account = App::get_account();
-
- if($r && count($r)) {
- $channels = $r;
- for($x = 0; $x < count($channels); $x ++) {
- $channels[$x]['link'] = 'manage/' . intval($channels[$x]['channel_id']);
- $channels[$x]['default'] = (($channels[$x]['channel_id'] == $account['account_default_channel']) ? "1" : '');
- $channels[$x]['default_links'] = '1';
-
-
- $c = q("SELECT id, item_wall FROM item
- WHERE item_unseen = 1 and uid = %d " . item_normal(),
- intval($channels[$x]['channel_id'])
- );
-
- if($c) {
- foreach ($c as $it) {
- if(intval($it['item_wall']))
- $channels[$x]['home'] ++;
- else
- $channels[$x]['network'] ++;
- }
- }
-
-
- $intr = q("SELECT COUNT(abook.abook_id) AS total FROM abook left join xchan on abook.abook_xchan = xchan.xchan_hash where abook_channel = %d and abook_pending = 1 and abook_self = 0 and abook_ignored = 0 and xchan_deleted = 0 and xchan_orphan = 0 ",
- intval($channels[$x]['channel_id'])
- );
-
- if($intr)
- $channels[$x]['intros'] = intval($intr[0]['total']);
-
-
- $mails = q("SELECT count(id) as total from mail WHERE channel_id = %d AND mail_seen = 0 and from_xchan != '%s' ",
- intval($channels[$x]['channel_id']),
- dbesc($channels[$x]['channel_hash'])
- );
-
- if($mails)
- $channels[$x]['mail'] = intval($mails[0]['total']);
-
-
- $events = q("SELECT type, start, adjust FROM `event`
- WHERE `event`.`uid` = %d AND start < '%s' AND start > '%s' and `ignore` = 0
- ORDER BY `start` ASC ",
- intval($channels[$x]['channel_id']),
- dbesc(datetime_convert('UTC', date_default_timezone_get(), 'now + 7 days')),
- dbesc(datetime_convert('UTC', date_default_timezone_get(), 'now - 1 days'))
- );
-
- if($events) {
- $channels[$x]['all_events'] = count($events);
-
- if($channels[$x]['all_events']) {
- $str_now = datetime_convert('UTC', date_default_timezone_get(), 'now', 'Y-m-d');
- foreach($events as $e) {
- $bd = false;
- if($e['type'] === 'birthday') {
- $channels[$x]['birthdays'] ++;
- $bd = true;
- }
- else {
- $channels[$x]['events'] ++;
- }
- if(datetime_convert('UTC', ((intval($e['adjust'])) ? date_default_timezone_get() : 'UTC'), $e['start'], 'Y-m-d') === $str_now) {
- $channels[$x]['all_events_today'] ++;
- if($bd)
- $channels[$x]['birthdays_today'] ++;
- else
- $channels[$x]['events_today'] ++;
- }
- }
- }
- }
- }
- }
-
- $r = q("select count(channel_id) as total from channel where channel_account_id = %d and channel_removed = 0",
- intval(get_account_id())
- );
- $limit = account_service_class_fetch(get_account_id(),'total_identities');
- if($limit !== false) {
- $channel_usage_message = sprintf( t("You have created %1$.0f of %2$.0f allowed channels."), $r[0]['total'], $limit);
- }
- else {
- $channel_usage_message = '';
- }
- }
-
- $create = array( 'new_channel', t('Create a new channel'), t('Create New'));
-
- $delegates = q("select * from abook left join xchan on abook_xchan = xchan_hash where
- abook_channel = %d and (abook_their_perms & %d) > 0",
- intval(local_channel()),
- intval(PERMS_A_DELEGATE)
- );
-
- if($delegates) {
- for($x = 0; $x < count($delegates); $x ++) {
- $delegates[$x]['link'] = 'magic?f=&dest=' . urlencode($delegates[$x]['xchan_url'])
- . '&delegate=' . urlencode($delegates[$x]['xchan_addr']);
- $delegates[$x]['channel_name'] = $delegates[$x]['xchan_name'];
- $delegates[$x]['delegate'] = 1;
- }
- }
- else {
- $delegates = null;
- }
-
- $o = replace_macros(get_markup_template('channels.tpl'), array(
- '$header' => t('Channel Manager'),
- '$msg_selected' => t('Current Channel'),
- '$selected' => local_channel(),
- '$desc' => t('Switch to one of your channels by selecting it.'),
- '$msg_default' => t('Default Channel'),
- '$msg_make_default' => t('Make Default'),
- '$create' => $create,
- '$all_channels' => $channels,
- '$mail_format' => t('%d new messages'),
- '$intros_format' => t('%d new introductions'),
- '$channel_usage_message' => $channel_usage_message,
- '$delegated_desc' => t('Delegated Channel'),
- '$delegates' => $delegates
- ));
-
- return $o;
-
-}
diff --git a/mod/match.php b/mod/match.php
deleted file mode 100644
index f7fc6cebd..000000000
--- a/mod/match.php
+++ /dev/null
@@ -1,78 +0,0 @@
-<?php
-
-/**
- * @brief Controller for /match.
- *
- * It takes keywords from your profile and queries the directory server for
- * matching keywords from other profiles.
- *
- * @FIXME this has never been properly ported from Friendica.
- *
- * @param App &$a
- * @return void|string
- */
-function match_content(&$a) {
-
- $o = '';
- if (! local_channel())
- return;
-
- $_SESSION['return_url'] = z_root() . '/' . App::$cmd;
-
- $o .= '<h2>' . t('Profile Match') . '</h2>';
-
- $r = q("SELECT `keywords` FROM `profile` WHERE `is_default` = 1 AND `uid` = %d LIMIT 1",
- intval(local_channel())
- );
- if (! count($r))
- return;
-
- if (! $r[0]['keywords']) {
- notice( t('No keywords to match. Please add keywords to your default profile.') . EOL);
- return;
- }
-
- $params = array();
- $tags = trim($r[0]['keywords']);
-
- if ($tags) {
- $params['s'] = $tags;
- if (App::$pager['page'] != 1)
- $params['p'] = App::$pager['page'];
-
-// if(strlen(get_config('system','directory_submit_url')))
-// $x = post_url('http://dir.friendica.com/msearch', $params);
-// else
-// $x = post_url(z_root() . '/msearch', $params);
-
- $j = json_decode($x);
-
- if ($j->total) {
- App::set_pager_total($j->total);
- App::set_pager_itemspage($j->items_page);
- }
-
- if (count($j->results)) {
- $tpl = get_markup_template('match.tpl');
- foreach ($j->results as $jj) {
- $connlnk = z_root() . '/follow/?url=' . $jj->url;
- $o .= replace_macros($tpl,array(
- '$url' => zid($jj->url),
- '$name' => $jj->name,
- '$photo' => $jj->photo,
- '$inttxt' => ' ' . t('is interested in:'),
- '$conntxt' => t('Connect'),
- '$connlnk' => $connlnk,
- '$tags' => $jj->tags
- ));
- }
- } else {
- info( t('No matches') . EOL);
- }
- }
-
- $o .= cleardiv();
- $o .= paginate($a);
-
- return $o;
-}
diff --git a/mod/menu.php b/mod/menu.php
deleted file mode 100644
index e11483c2d..000000000
--- a/mod/menu.php
+++ /dev/null
@@ -1,167 +0,0 @@
-<?php
-
-require_once('include/menu.php');
-require_once('include/identity.php');
-
-function menu_init(&$a) {
- if (array_key_exists('sys', $_REQUEST) && $_REQUEST['sys'] && is_site_admin()) {
- $sys = get_sys_channel();
- if ($sys && intval($sys['channel_id'])) {
- App::$is_sys = true;
- }
- }
-}
-
-function menu_post(&$a) {
-
- $uid = local_channel();
-
- if(array_key_exists('sys', $_REQUEST) && $_REQUEST['sys'] && is_site_admin()) {
- $sys = get_sys_channel();
- $uid = intval($sys['channel_id']);
- App::$is_sys = true;
- }
-
- if(! $uid)
- return;
-
- $_REQUEST['menu_channel_id'] = $uid;
-
- if($_REQUEST['menu_bookmark'])
- $_REQUEST['menu_flags'] |= MENU_BOOKMARK;
- if($_REQUEST['menu_system'])
- $_REQUEST['menu_flags'] |= MENU_SYSTEM;
-
- $menu_id = ((argc() > 1) ? intval(argv(1)) : 0);
- if($menu_id) {
- $_REQUEST['menu_id'] = intval(argv(1));
- $r = menu_edit($_REQUEST);
- if($r) {
- menu_sync_packet($uid,get_observer_hash(),$menu_id);
- //info( t('Menu updated.') . EOL);
- goaway(z_root() . '/mitem/' . $menu_id . ((App::$is_sys) ? '?f=&sys=1' : ''));
- }
- else
- notice( t('Unable to update menu.'). EOL);
- }
- else {
- $r = menu_create($_REQUEST);
- if($r) {
- menu_sync_packet($uid,get_observer_hash(),$r);
-
- //info( t('Menu created.') . EOL);
- goaway(z_root() . '/mitem/' . $r . ((App::$is_sys) ? '?f=&sys=1' : ''));
- }
- else
- notice( t('Unable to create menu.'). EOL);
-
- }
-}
-
-
-
-
-function menu_content(&$a) {
-
- $uid = local_channel();
-
- if (App::$is_sys && is_site_admin()) {
- $sys = get_sys_channel();
- $uid = intval($sys['channel_id']);
- }
-
- if(! $uid) {
- notice( t('Permission denied.') . EOL);
- return '';
- }
-
- if(argc() == 1) {
-
-
-
- // list menus
- $x = menu_list($uid);
- if($x) {
- for($y = 0; $y < count($x); $y ++) {
- $m = menu_fetch($x[$y]['menu_name'],$uid,get_observer_hash());
- if($m)
- $x[$y]['element'] = '[element]' . base64url_encode(json_encode(menu_element($m))) . '[/element]';
- $x[$y]['bookmark'] = (($x[$y]['menu_flags'] & MENU_BOOKMARK) ? true : false);
- }
- }
-
- $create = replace_macros(get_markup_template('menuedit.tpl'), array(
- '$menu_name' => array('menu_name', t('Menu Name'), '', t('Unique name (not visible on webpage) - required'), '*'),
- '$menu_desc' => array('menu_desc', t('Menu Title'), '', t('Visible on webpage - leave empty for no title'), ''),
- '$menu_bookmark' => array('menu_bookmark', t('Allow Bookmarks'), 0 , t('Menu may be used to store saved bookmarks'), array(t('No'), t('Yes'))),
- '$submit' => t('Submit and proceed'),
- '$sys' => App::$is_sys,
- '$display' => 'none'
- ));
-
- $o = replace_macros(get_markup_template('menulist.tpl'),array(
- '$title' => t('Menus'),
- '$create' => $create,
- '$menus' => $x,
- '$nametitle' => t('Menu Name'),
- '$desctitle' => t('Menu Title'),
- '$edit' => t('Edit'),
- '$drop' => t('Drop'),
- '$created' => t('Created'),
- '$edited' => t('Edited'),
- '$new' => t('New'),
- '$bmark' => t('Bookmarks allowed'),
- '$hintnew' => t('Create'),
- '$hintdrop' => t('Delete this menu'),
- '$hintcontent' => t('Edit menu contents'),
- '$hintedit' => t('Edit this menu'),
- '$sys' => App::$is_sys
- ));
-
- return $o;
-
- }
-
- if(argc() > 1) {
- if(intval(argv(1))) {
-
- if(argc() == 3 && argv(2) == 'drop') {
- menu_sync_packet($uid,get_observer_hash(),intval(argv(1)),true);
- $r = menu_delete_id(intval(argv(1)),$uid);
- if(!$r)
- notice( t('Menu could not be deleted.'). EOL);
-
- goaway(z_root() . '/menu' . ((App::$is_sys) ? '?f=&sys=1' : ''));
- }
-
- $m = menu_fetch_id(intval(argv(1)),$uid);
-
- if(! $m) {
- notice( t('Menu not found.') . EOL);
- return '';
- }
-
- $o = replace_macros(get_markup_template('menuedit.tpl'), array(
- '$header' => t('Edit Menu'),
- '$sys' => App::$is_sys,
- '$menu_id' => intval(argv(1)),
- '$menu_edit_link' => 'mitem/' . intval(argv(1)) . ((App::$is_sys) ? '?f=&sys=1' : ''),
- '$hintedit' => t('Add or remove entries to this menu'),
- '$editcontents' => t('Edit menu contents'),
- '$menu_name' => array('menu_name', t('Menu name'), $m['menu_name'], t('Must be unique, only seen by you'), '*'),
- '$menu_desc' => array('menu_desc', t('Menu title'), $m['menu_desc'], t('Menu title as seen by others'), ''),
- '$menu_bookmark' => array('menu_bookmark', t('Allow bookmarks'), (($m['menu_flags'] & MENU_BOOKMARK) ? 1 : 0), t('Menu may be used to store saved bookmarks'), array(t('No'), t('Yes'))),
- '$menu_system' => (($m['menu_flags'] & MENU_SYSTEM) ? 1 : 0),
- '$submit' => t('Submit and proceed')
- ));
-
- return $o;
-
- }
- else {
- notice( t('Not found.') . EOL);
- return;
- }
- }
-
-}
diff --git a/mod/message.php b/mod/message.php
deleted file mode 100644
index f6d1d020c..000000000
--- a/mod/message.php
+++ /dev/null
@@ -1,104 +0,0 @@
-<?php
-
-require_once('include/acl_selectors.php');
-require_once('include/message.php');
-require_once('include/zot.php');
-require_once("include/bbcode.php");
-require_once('include/Contact.php');
-
-
-function message_content(&$a) {
-
- $o = '';
- nav_set_selected('messages');
-
- if(! local_channel()) {
- notice( t('Permission denied.') . EOL);
- return login();
- }
-
- $channel = App::get_channel();
- head_set_icon($channel['xchan_photo_s']);
-
- $cipher = get_pconfig(local_channel(),'system','default_cipher');
- if(! $cipher)
- $cipher = 'aes256';
-
-/*
- if((argc() == 3) && (argv(1) === 'dropconv')) {
- if(! intval(argv(2)))
- return;
- $cmd = argv(1);
- $r = private_messages_drop(local_channel(), argv(2), true);
- if($r)
- info( t('Conversation removed.') . EOL );
- goaway(z_root() . '/mail/combined' );
- }
-
- if(argc() == 2) {
-
- switch(argv(1)) {
- case 'combined':
- $mailbox = 'combined';
- $header = t('Conversations');
- break;
- case 'inbox':
- $mailbox = 'inbox';
- $header = t('Received Messages');
- break;
- case 'outbox':
- $mailbox = 'outbox';
- $header = t('Sent Messages');
- break;
- default:
- break;
- }
-
- // private_messages_list() can do other more complicated stuff, for now keep it simple
-
- $r = private_messages_list(local_channel(), $mailbox, App::$pager['start'], App::$pager['itemspage']);
-
- if(! $r) {
- info( t('No messages.') . EOL);
- return $o;
- }
-
- $messages = array();
-
- foreach($r as $rr) {
-
- $messages[] = array(
- 'id' => $rr['id'],
- 'from_name' => $rr['from']['xchan_name'],
- 'from_url' => chanlink_hash($rr['from_xchan']),
- 'from_photo' => $rr['from']['xchan_photo_s'],
- 'to_name' => $rr['to']['xchan_name'],
- 'to_url' => chanlink_hash($rr['to_xchan']),
- 'to_photo' => $rr['to']['xchan_photo_s'],
- 'subject' => (($rr['seen']) ? $rr['title'] : '<strong>' . $rr['title'] . '</strong>'),
- 'delete' => t('Delete conversation'),
- 'body' => smilies(bbcode($rr['body'])),
- 'date' => datetime_convert('UTC',date_default_timezone_get(),$rr['created'], t('D, d M Y - g:i A')),
- 'seen' => $rr['seen']
- );
- }
-
-
- $tpl = get_markup_template('mail_head.tpl');
- $o = replace_macros($tpl, array(
- '$header' => $header,
- '$messages' => $messages
- ));
-
-
- $o .= alt_pager($a,count($r));
-
- return $o;
-
- return;
-
- }
-*/
-
- return;
-}
diff --git a/mod/mitem.php b/mod/mitem.php
deleted file mode 100644
index 5503e93f6..000000000
--- a/mod/mitem.php
+++ /dev/null
@@ -1,239 +0,0 @@
-<?php
-
-require_once('include/menu.php');
-require_once('include/acl_selectors.php');
-
-function mitem_init(&$a) {
-
- $uid = local_channel();
-
- if(array_key_exists('sys',$_REQUEST) && $_REQUEST['sys'] && is_site_admin()) {
- $sys = get_sys_channel();
- $uid = intval($sys['channel_id']);
- App::$is_sys = true;
- }
-
- if(! $uid)
- return;
-
- if(argc() < 2)
- return;
-
- $m = menu_fetch_id(intval(argv(1)),$uid);
- if(! $m) {
- notice( t('Menu not found.') . EOL);
- return '';
- }
- App::$data['menu'] = $m;
-
-}
-
-function mitem_post(&$a) {
-
- $uid = local_channel();
-
- if(App::$is_sys && is_site_admin()) {
- $sys = get_sys_channel();
- $uid = intval($sys['channel_id']);
- }
-
- if(! $uid) {
- return;
- }
-
- if(! App::$data['menu'])
- return;
-
- if(!$_REQUEST['mitem_desc'] || !$_REQUEST['mitem_link']) {
- notice( t('Unable to create element.') . EOL);
- return;
- }
-
- $_REQUEST['mitem_channel_id'] = $uid;
- $_REQUEST['menu_id'] = App::$data['menu']['menu_id'];
-
- $_REQUEST['mitem_flags'] = 0;
- if($_REQUEST['usezid'])
- $_REQUEST['mitem_flags'] |= MENU_ITEM_ZID;
- if($_REQUEST['newwin'])
- $_REQUEST['mitem_flags'] |= MENU_ITEM_NEWWIN;
-
-
- $mitem_id = ((argc() > 2) ? intval(argv(2)) : 0);
- if($mitem_id) {
- $_REQUEST['mitem_id'] = $mitem_id;
- $r = menu_edit_item($_REQUEST['menu_id'],$uid,$_REQUEST);
- if($r) {
- menu_sync_packet($uid,get_observer_hash(),$_REQUEST['menu_id']);
- //info( t('Menu element updated.') . EOL);
- goaway(z_root() . '/mitem/' . $_REQUEST['menu_id'] . ((App::$is_sys) ? '?f=&sys=1' : ''));
- }
- else
- notice( t('Unable to update menu element.') . EOL);
-
- }
- else {
- $r = menu_add_item($_REQUEST['menu_id'],$uid,$_REQUEST);
- if($r) {
- menu_sync_packet($uid,get_observer_hash(),$_REQUEST['menu_id']);
- //info( t('Menu element added.') . EOL);
- if($_REQUEST['submit']) {
- goaway(z_root() . '/menu' . ((App::$is_sys) ? '?f=&sys=1' : ''));
- }
- if($_REQUEST['submit-more']) {
- goaway(z_root() . '/mitem/' . $_REQUEST['menu_id'] . '?f=&display=block' . ((App::$is_sys) ? '&sys=1' : '') );
- }
- }
- else
- notice( t('Unable to add menu element.') . EOL);
-
- }
-
-}
-
-
-function mitem_content(&$a) {
-
- $uid = local_channel();
- $channel = App::get_channel();
- $observer = App::get_observer();
-
- $ob_hash = (($observer) ? $observer['xchan_hash'] : '');
-
- if(App::$is_sys && is_site_admin()) {
- $sys = get_sys_channel();
- $uid = intval($sys['channel_id']);
- $channel = $sys;
- $ob_hash = $sys['xchan_hash'];
- }
-
- if(! $uid) {
- notice( t('Permission denied.') . EOL);
- return '';
- }
-
- if(argc() < 2 || (! App::$data['menu'])) {
- notice( t('Not found.') . EOL);
- return '';
- }
-
- $m = menu_fetch(App::$data['menu']['menu_name'],$uid,$ob_hash);
- App::$data['menu_item'] = $m;
-
- $menu_list = menu_list($uid);
-
- foreach($menu_list as $menus) {
- if($menus['menu_name'] != $m['menu']['menu_name'])
- $menu_names[] = $menus['menu_name'];
- }
-
- $acl = new Zotlabs\Access\AccessList($channel);
-
- $lockstate = (($channel['channel_allow_cid'] || $channel['channel_allow_gid'] || $channel['channel_deny_cid'] || $channel['channel_deny_gid']) ? 'lock' : 'unlock');
-
- if(argc() == 2) {
- $r = q("select * from menu_item where mitem_menu_id = %d and mitem_channel_id = %d order by mitem_order asc, mitem_desc asc",
- intval(App::$data['menu']['menu_id']),
- intval($uid)
- );
-
- if($_GET['display']) {
- $display = $_GET['display'];
- }
- else {
- $display = (($r) ? 'none' : 'block');
- }
-
- $create = replace_macros(get_markup_template('mitemedit.tpl'), array(
- '$menu_id' => App::$data['menu']['menu_id'],
- '$permissions' => t('Menu Item Permissions'),
- '$permdesc' => t("\x28click to open/close\x29"),
- '$aclselect' => populate_acl($acl->get(),false),
- '$mitem_desc' => array('mitem_desc', t('Link Name'), '', 'Visible name of the link','*'),
- '$mitem_link' => array('mitem_link', t('Link or Submenu Target'), '', t('Enter URL of the link or select a menu name to create a submenu'), '*', 'list="menu-names"'),
- '$usezid' => array('usezid', t('Use magic-auth if available'), true, '', array(t('No'), t('Yes'))),
- '$newwin' => array('newwin', t('Open link in new window'), false,'', array(t('No'), t('Yes'))),
- '$mitem_order' => array('mitem_order', t('Order in list'),'0',t('Higher numbers will sink to bottom of listing')),
- '$submit' => t('Submit and finish'),
- '$submit_more' => t('Submit and continue'),
- '$display' => $display,
- '$lockstate' => $lockstate,
- '$menu_names' => $menu_names,
- '$sys' => App::$is_sys
- ));
-
- $o .= replace_macros(get_markup_template('mitemlist.tpl'),array(
- '$title' => t('Menu:'),
- '$create' => $create,
- '$nametitle' => t('Link Name'),
- '$targettitle' => t('Link Target'),
- '$menuname' => App::$data['menu']['menu_name'],
- '$menudesc' => App::$data['menu']['menu_desc'],
- '$edmenu' => t('Edit menu'),
- '$menu_id' => App::$data['menu']['menu_id'],
- '$mlist' => $r,
- '$edit' => t('Edit element'),
- '$drop' => t('Drop element'),
- '$new' => t('New element'),
- '$hintmenu' => t('Edit this menu container'),
- '$hintnew' => t('Add menu element'),
- '$hintdrop' => t('Delete this menu item'),
- '$hintedit' => t('Edit this menu item'),
- ));
-
- return $o;
- }
-
-
- if(argc() > 2) {
-
- if(intval(argv(2))) {
-
- $m = q("select * from menu_item where mitem_id = %d and mitem_channel_id = %d limit 1",
- intval(argv(2)),
- intval($uid)
- );
-
- if(! $m) {
- notice( t('Menu item not found.') . EOL);
- goaway(z_root() . '/menu'. ((App::$is_sys) ? '?f=&sys=1' : ''));
- }
-
- $mitem = $m[0];
-
- $lockstate = (($mitem['allow_cid'] || $mitem['allow_gid'] || $mitem['deny_cid'] || $mitem['deny_gid']) ? 'lock' : 'unlock');
-
- if(argc() == 4 && argv(3) == 'drop') {
- menu_sync_packet($uid,get_observer_hash(),$mitem['mitem_menu_id']);
- $r = menu_del_item($mitem['mitem_menu_id'], $uid, intval(argv(2)));
- menu_sync_packet($uid,get_observer_hash(),$mitem['mitem_menu_id']);
- if($r)
- info( t('Menu item deleted.') . EOL);
- else
- notice( t('Menu item could not be deleted.'). EOL);
-
- goaway(z_root() . '/mitem/' . $mitem['mitem_menu_id'] . ((App::$is_sys) ? '?f=&sys=1' : ''));
- }
-
- // edit menu item
- $o = replace_macros(get_markup_template('mitemedit.tpl'), array(
- '$header' => t('Edit Menu Element'),
- '$menu_id' => App::$data['menu']['menu_id'],
- '$permissions' => t('Menu Item Permissions'),
- '$permdesc' => t("\x28click to open/close\x29"),
- '$aclselect' => populate_acl($mitem,false),
- '$mitem_id' => intval(argv(2)),
- '$mitem_desc' => array('mitem_desc', t('Link text'), $mitem['mitem_desc'], '','*'),
- '$mitem_link' => array('mitem_link', t('Link or Submenu Target'), $mitem['mitem_link'], 'Enter URL of the link or select a menu name to create a submenu', '*', 'list="menu-names"'),
- '$usezid' => array('usezid', t('Use magic-auth if available'), (($mitem['mitem_flags'] & MENU_ITEM_ZID) ? 1 : 0), '', array(t('No'), t('Yes'))),
- '$newwin' => array('newwin', t('Open link in new window'), (($mitem['mitem_flags'] & MENU_ITEM_NEWWIN) ? 1 : 0),'', array(t('No'), t('Yes'))),
- '$mitem_order' => array('mitem_order', t('Order in list'),$mitem['mitem_order'],t('Higher numbers will sink to bottom of listing')),
- '$submit' => t('Submit'),
- '$lockstate' => $lockstate,
- '$menu_names' => $menu_names
- ));
-
- return $o;
- }
- }
-}
diff --git a/mod/mood.php b/mod/mood.php
deleted file mode 100755
index 3ded65469..000000000
--- a/mod/mood.php
+++ /dev/null
@@ -1,140 +0,0 @@
-<?php
-
-require_once('include/security.php');
-require_once('include/bbcode.php');
-require_once('include/items.php');
-
-
-function mood_init(&$a) {
-
- if(! local_channel())
- return;
-
- $uid = local_channel();
- $channel = App::get_channel();
- $verb = notags(trim($_GET['verb']));
-
- if(! $verb)
- return;
-
- $verbs = get_mood_verbs();
-
- if(! array_key_exists($verb,$verbs))
- return;
-
- $activity = ACTIVITY_MOOD . '#' . urlencode($verb);
-
- $parent = ((x($_GET,'parent')) ? intval($_GET['parent']) : 0);
-
-
- logger('mood: verb ' . $verb, LOGGER_DEBUG);
-
-
- if($parent) {
- $r = q("select mid, owner_xchan, private, allow_cid, allow_gid, deny_cid, deny_gid
- from item where id = %d and parent = %d and uid = %d limit 1",
- intval($parent),
- intval($parent),
- intval($uid)
- );
- if(count($r)) {
- $parent_mid = $r[0]['mid'];
- $private = $r[0]['item_private'];
- $allow_cid = $r[0]['allow_cid'];
- $allow_gid = $r[0]['allow_gid'];
- $deny_cid = $r[0]['deny_cid'];
- $deny_gid = $r[0]['deny_gid'];
- }
- }
- else {
-
- $private = 0;
-
- $allow_cid = $channel['channel_allow_cid'];
- $allow_gid = $channel['channel_allow_gid'];
- $deny_cid = $channel['channel_deny_cid'];
- $deny_gid = $channel['channel_deny_gid'];
- }
-
- $poster = App::get_observer();
-
- $mid = item_message_id();
-
- $action = sprintf( t('%1$s is %2$s','mood'), '[zrl=' . $poster['xchan_url'] . ']' . $poster['xchan_name'] . '[/zrl]' , $verbs[$verb]);
-
- $arr = array();
-
- $arr['aid'] = get_account_id();
- $arr['uid'] = $uid;
- $arr['mid'] = $mid;
- $arr['parent_mid'] = (($parent_mid) ? $parent_mid : $mid);
- $arr['author_xchan'] = $poster['xchan_hash'];
- $arr['owner_xchan'] = (($parent_mid) ? $r[0]['owner_xchan'] : $poster['xchan_hash']);
- $arr['title'] = '';
- $arr['allow_cid'] = $allow_cid;
- $arr['allow_gid'] = $allow_gid;
- $arr['deny_cid'] = $deny_cid;
- $arr['deny_gid'] = $deny_gid;
- $arr['item_private'] = $private;
- $arr['verb'] = $activity;
- $arr['body'] = $action;
- $arr['item_origin'] = 1;
- $arr['item_wall'] = 1;
- $arr['item_unseen'] = 1;
- if(! $parent_mid)
- $item['item_thread_top'] = 1;
-
- if ((! $arr['plink']) && intval($arr['item_thread_top'])) {
- $arr['plink'] = z_root() . '/channel/' . $channel['channel_address'] . '/?f=&mid=' . $arr['mid'];
- }
-
-
- $post = item_store($arr);
- $item_id = $post['item_id'];
-
- if($item_id) {
- proc_run('php',"include/notifier.php","activity", $item_id);
- }
-
- call_hooks('post_local_end', $arr);
-
- if($_SESSION['return_url'])
- goaway(z_root() . '/' . $_SESSION['return_url']);
-
- return;
-}
-
-
-
-function mood_content(&$a) {
-
- if(! local_channel()) {
- notice( t('Permission denied.') . EOL);
- return;
- }
-
- $parent = ((x($_GET,'parent')) ? intval($_GET['parent']) : '0');
-
-
-
- $verbs = get_mood_verbs();
-
- $shortlist = array();
- foreach($verbs as $k => $v)
- if($v !== 'NOTRANSLATION')
- $shortlist[] = array($k,$v);
-
-
- $tpl = get_markup_template('mood_content.tpl');
-
- $o = replace_macros($tpl,array(
- '$title' => t('Mood'),
- '$desc' => t('Set your current mood and tell your friends'),
- '$verbs' => $shortlist,
- '$parent' => $parent,
- '$submit' => t('Submit'),
- ));
-
- return $o;
-
-}
diff --git a/mod/msearch.php b/mod/msearch.php
deleted file mode 100644
index f94b75910..000000000
--- a/mod/msearch.php
+++ /dev/null
@@ -1,42 +0,0 @@
-<?php
-
-function msearch_post(&$a) {
-
- $perpage = (($_POST['n']) ? $_POST['n'] : 80);
- $page = (($_POST['p']) ? intval($_POST['p'] - 1) : 0);
- $startrec = (($page+1) * $perpage) - $perpage;
-
- $search = $_POST['s'];
- if(! strlen($search))
- killme();
-
- $r = q("SELECT COUNT(*) AS `total` FROM `profile` LEFT JOIN `user` ON `user`.`uid` = `profile`.`uid` WHERE `is_default` = 1 AND `user`.`hidewall` = 0 AND MATCH `keywords` AGAINST ('%s') ",
- dbesc($search)
- );
- if(count($r))
- $total = $r[0]['total'];
-
- $r = q("SELECT `keywords`, `username`, `nickname`, `user`.`uid` FROM `user` LEFT JOIN `profile` ON `user`.`uid` = `profile`.`uid` WHERE `is_default` = 1 AND `user`.`hidewall` = 0 AND MATCH `keywords` AGAINST ('%s') LIMIT %d , %d ",
- dbesc($search),
- intval($startrec),
- intval($perpage)
- );
-
- $results = array();
- if(count($r)) {
- foreach($r as $rr)
- $results[] = array(
- 'name' => $rr['name'],
- 'url' => z_root() . '/channel/' . $rr['nickname'],
- 'photo' => z_root() . '/photo/avatar/' . $rr['uid'],
- 'tags' => str_replace(array(',',' '),array(' ',' '),$rr['keywords'])
- );
- }
-
- $output = array('total' => $total, 'items_page' => $perpage, 'page' => $page + 1, 'results' => $results);
-
- echo json_encode($output);
-
- killme();
-
-} \ No newline at end of file
diff --git a/mod/network.php b/mod/network.php
deleted file mode 100644
index e6d02f572..000000000
--- a/mod/network.php
+++ /dev/null
@@ -1,525 +0,0 @@
-<?php
-
-require_once('include/items.php');
-require_once('include/group.php');
-require_once('include/contact_widgets.php');
-require_once('include/conversation.php');
-require_once('include/acl_selectors.php');
-
-
-function network_init(&$a) {
- if(! local_channel()) {
- notice( t('Permission denied.') . EOL);
- return;
- }
-
- if(count($_GET) < 2) {
- $network_options = get_pconfig(local_channel(),'system','network_page_default');
- if($network_options)
- goaway('network' . '?f=&' . $network_options);
- }
-
- $channel = App::get_channel();
- App::$profile_uid = local_channel();
- head_set_icon($channel['xchan_photo_s']);
-
-}
-
-function network_content(&$a, $update = 0, $load = false) {
-
- if(! local_channel()) {
- $_SESSION['return_url'] = App::$query_string;
- return login(false);
- }
-
- if($load)
- $_SESSION['loadtime'] = datetime_convert();
-
- $arr = array('query' => App::$query_string);
-
- call_hooks('network_content_init', $arr);
-
- $channel = App::get_channel();
- $item_normal = item_normal();
-
- $datequery = $datequery2 = '';
-
- $group = 0;
-
- $nouveau = false;
-
- $datequery = ((x($_GET,'dend') && is_a_date_arg($_GET['dend'])) ? notags($_GET['dend']) : '');
- $datequery2 = ((x($_GET,'dbegin') && is_a_date_arg($_GET['dbegin'])) ? notags($_GET['dbegin']) : '');
- $nouveau = ((x($_GET,'new')) ? intval($_GET['new']) : 0);
- $gid = ((x($_GET,'gid')) ? intval($_GET['gid']) : 0);
- $category = ((x($_REQUEST,'cat')) ? $_REQUEST['cat'] : '');
- $hashtags = ((x($_REQUEST,'tag')) ? $_REQUEST['tag'] : '');
- $verb = ((x($_REQUEST,'verb')) ? $_REQUEST['verb'] : '');
-
- $search = (($_GET['search']) ? $_GET['search'] : '');
- if($search) {
- if(strpos($search,'@') === 0) {
- $r = q("select abook_id from abook left join xchan on abook_xchan = xchan_hash where xchan_name = '%s' and abook_channel = %d limit 1",
- dbesc(substr($search,1)),
- intval(local_channel())
- );
- if($r) {
- $_GET['cid'] = $r[0]['abook_id'];
- $search = $_GET['search'] = '';
- }
- }
- elseif(strpos($search,'#') === 0) {
- $hashtags = substr($search,1);
- $search = $_GET['search'] = '';
- }
- }
-
- if($datequery)
- $_GET['order'] = 'post';
-
-
- // filter by collection (e.g. group)
-
- if($gid) {
- $r = q("SELECT * FROM groups WHERE id = %d AND uid = %d LIMIT 1",
- intval($gid),
- intval(local_channel())
- );
- if(! $r) {
- if($update)
- killme();
- notice( t('No such group') . EOL );
- goaway(z_root() . '/network');
- // NOTREACHED
- }
-
- $group = $gid;
- $group_hash = $r[0]['hash'];
- $def_acl = array('allow_gid' => '<' . $r[0]['hash'] . '>');
- }
-
- $o = '';
-
-
- // if no tabs are selected, defaults to comments
-
- $cid = ((x($_GET,'cid')) ? intval($_GET['cid']) : 0);
- $star = ((x($_GET,'star')) ? intval($_GET['star']) : 0);
- $order = ((x($_GET,'order')) ? notags($_GET['order']) : 'comment');
- $liked = ((x($_GET,'liked')) ? intval($_GET['liked']) : 0);
- $conv = ((x($_GET,'conv')) ? intval($_GET['conv']) : 0);
- $spam = ((x($_GET,'spam')) ? intval($_GET['spam']) : 0);
- $cmin = ((x($_GET,'cmin')) ? intval($_GET['cmin']) : 0);
- $cmax = ((x($_GET,'cmax')) ? intval($_GET['cmax']) : 99);
- $firehose = ((x($_GET,'fh')) ? intval($_GET['fh']) : 0);
- $file = ((x($_GET,'file')) ? $_GET['file'] : '');
-
-
- $deftag = '';
-
- if(x($_GET,'search') || x($_GET,'file'))
- $nouveau = true;
- if($cid) {
- $r = q("SELECT abook_xchan FROM abook WHERE abook_id = %d AND abook_channel = %d LIMIT 1",
- intval($cid),
- intval(local_channel())
- );
- if(! $r) {
- if($update) {
- killme();
- }
- notice( t('No such channel') . EOL );
- goaway(z_root() . '/network');
- // NOTREACHED
- }
- if($_GET['pf'] === '1')
- $deftag = '@' . t('forum') . '+' . intval($cid) . '+';
- else
- $def_acl = array('allow_cid' => '<' . $r[0]['abook_xchan'] . '>');
- }
-
- if(! $update) {
- $tabs = network_tabs();
- $o .= $tabs;
-
- // search terms header
- if($search) {
- $o .= replace_macros(get_markup_template("section_title.tpl"),array(
- '$title' => t('Search Results For:') . ' ' . htmlspecialchars($search, ENT_COMPAT,'UTF-8')
- ));
- }
-
- nav_set_selected('network');
-
- $channel_acl = array(
- 'allow_cid' => $channel['channel_allow_cid'],
- 'allow_gid' => $channel['channel_allow_gid'],
- 'deny_cid' => $channel['channel_deny_cid'],
- 'deny_gid' => $channel['channel_deny_gid']
- );
-
- $private_editing = ((($group || $cid) && (! intval($_GET['pf']))) ? true : false);
-
- $x = array(
- 'is_owner' => true,
- 'allow_location' => ((intval(get_pconfig($channel['channel_id'],'system','use_browser_location'))) ? '1' : ''),
- 'default_location' => $channel['channel_location'],
- 'nickname' => $channel['channel_address'],
- 'lockstate' => (($private_editing || $channel['channel_allow_cid'] || $channel['channel_allow_gid'] || $channel['channel_deny_cid'] || $channel['channel_deny_gid']) ? 'lock' : 'unlock'),
- 'acl' => populate_acl((($private_editing) ? $def_acl : $channel_acl), true, (($channel['channel_r_stream'] & PERMS_PUBLIC) ? t('Public') : '')),
- 'bang' => (($private_editing) ? '!' : ''),
- 'visitor' => true,
- 'profile_uid' => local_channel(),
- 'editor_autocomplete' => true,
- 'bbco_autocomplete' => 'bbcode',
- 'bbcode' => true
- );
- if($deftag)
- $x['pretext'] = $deftag;
-
-
- $status_editor = status_editor($a,$x);
- $o .= $status_editor;
-
- }
-
-
- // We don't have to deal with ACL's on this page. You're looking at everything
- // that belongs to you, hence you can see all of it. We will filter by group if
- // desired.
-
-
- $sql_options = (($star)
- ? " and item_starred = 1 "
- : '');
-
- $sql_nets = '';
-
- $sql_extra = " AND `item`.`parent` IN ( SELECT `parent` FROM `item` WHERE item_thread_top = 1 $sql_options ) ";
-
- if($group) {
- $contact_str = '';
- $contacts = group_get_members($group);
- if($contacts) {
- foreach($contacts as $c) {
- if($contact_str)
- $contact_str .= ',';
- $contact_str .= "'" . $c['xchan'] . "'";
- }
- }
- else {
- $contact_str = ' 0 ';
- info( t('Privacy group is empty'));
- }
-
- $sql_extra = " AND item.parent IN ( SELECT DISTINCT parent FROM item WHERE true $sql_options AND (( author_xchan IN ( $contact_str ) OR owner_xchan in ( $contact_str )) or allow_gid like '" . protect_sprintf('%<' . dbesc($group_hash) . '>%') . "' ) and id = parent $item_normal ) ";
-
- $x = group_rec_byhash(local_channel(), $group_hash);
-
- if($x) {
- $title = replace_macros(get_markup_template("section_title.tpl"),array(
- '$title' => t('Privacy group: ') . $x['name']
- ));
- }
-
- $o = $tabs;
- $o .= $title;
- $o .= $status_editor;
-
- }
-
- elseif($cid) {
-
- $r = q("SELECT abook.*, xchan.* from abook left join xchan on abook_xchan = xchan_hash where abook_id = %d and abook_channel = %d and abook_blocked = 0 limit 1",
- intval($cid),
- intval(local_channel())
- );
- if($r) {
- $sql_extra = " AND item.parent IN ( SELECT DISTINCT parent FROM item WHERE true $sql_options AND uid = " . intval(local_channel()) . " AND ( author_xchan = '" . dbesc($r[0]['abook_xchan']) . "' or owner_xchan = '" . dbesc($r[0]['abook_xchan']) . "' ) $item_normal ) ";
- $title = replace_macros(get_markup_template("section_title.tpl"),array(
- '$title' => '<a href="' . zid($r[0]['xchan_url']) . '" ><img src="' . zid($r[0]['xchan_photo_s']) . '" alt="' . urlencode($r[0]['xchan_name']) . '" /></a> <a href="' . zid($r[0]['xchan_url']) . '" >' . $r[0]['xchan_name'] . '</a>'
- ));
- $o = $tabs;
- $o .= $title;
- $o .= $status_editor;
- }
- else {
- notice( t('Invalid connection.') . EOL);
- goaway(z_root() . '/network');
- }
- }
-
- if(x($category)) {
- $sql_extra .= protect_sprintf(term_query('item', $category, TERM_CATEGORY));
- }
- if(x($hashtags)) {
- $sql_extra .= protect_sprintf(term_query('item', $hashtags, TERM_HASHTAG, TERM_COMMUNITYTAG));
- }
-
- if(! $update) {
- // The special div is needed for liveUpdate to kick in for this page.
- // We only launch liveUpdate if you aren't filtering in some incompatible
- // way and also you aren't writing a comment (discovered in javascript).
-
- if($gid || $cid || $cmin || ($cmax != 99) || $star || $liked || $conv || $spam || $nouveau || $list)
- $firehose = 0;
-
- $maxheight = get_pconfig(local_channel(),'system','network_divmore_height');
- if(! $maxheight)
- $maxheight = 400;
-
-
- $o .= '<div id="live-network"></div>' . "\r\n";
- $o .= "<script> var profile_uid = " . local_channel()
- . "; var profile_page = " . App::$pager['page']
- . "; divmore_height = " . intval($maxheight) . "; </script>\r\n";
-
- App::$page['htmlhead'] .= replace_macros(get_markup_template("build_query.tpl"),array(
- '$baseurl' => z_root(),
- '$pgtype' => 'network',
- '$uid' => ((local_channel()) ? local_channel() : '0'),
- '$gid' => (($gid) ? $gid : '0'),
- '$cid' => (($cid) ? $cid : '0'),
- '$cmin' => (($cmin) ? $cmin : '0'),
- '$cmax' => (($cmax) ? $cmax : '0'),
- '$star' => (($star) ? $star : '0'),
- '$liked' => (($liked) ? $liked : '0'),
- '$conv' => (($conv) ? $conv : '0'),
- '$spam' => (($spam) ? $spam : '0'),
- '$fh' => (($firehose) ? $firehose : '0'),
- '$nouveau' => (($nouveau) ? $nouveau : '0'),
- '$wall' => '0',
- '$list' => ((x($_REQUEST,'list')) ? intval($_REQUEST['list']) : 0),
- '$page' => ((App::$pager['page'] != 1) ? App::$pager['page'] : 1),
- '$search' => (($search) ? $search : ''),
- '$order' => $order,
- '$file' => $file,
- '$cats' => $category,
- '$tags' => $hashtags,
- '$dend' => $datequery,
- '$mid' => '',
- '$verb' => $verb,
- '$dbegin' => $datequery2
- ));
- }
-
- $sql_extra3 = '';
-
- if($datequery) {
- $sql_extra3 .= protect_sprintf(sprintf(" AND item.created <= '%s' ", dbesc(datetime_convert(date_default_timezone_get(),'',$datequery))));
- }
- if($datequery2) {
- $sql_extra3 .= protect_sprintf(sprintf(" AND item.created >= '%s' ", dbesc(datetime_convert(date_default_timezone_get(),'',$datequery2))));
- }
-
- $sql_extra2 = (($nouveau) ? '' : " AND item.parent = item.id ");
- $sql_extra3 = (($nouveau) ? '' : $sql_extra3);
-
- if(x($_GET,'search')) {
- $search = escape_tags($_GET['search']);
- if(strpos($search,'#') === 0) {
- $sql_extra .= term_query('item',substr($search,1),TERM_HASHTAG,TERM_COMMUNITYTAG);
- }
- else {
- $sql_extra .= sprintf(" AND item.body like '%s' ",
- dbesc(protect_sprintf('%' . $search . '%'))
- );
- }
- }
-
- if($verb) {
- $sql_extra .= sprintf(" AND item.verb like '%s' ",
- dbesc(protect_sprintf('%' . $verb . '%'))
- );
- }
-
- if(strlen($file)) {
- $sql_extra .= term_query('item',$file,TERM_FILE);
- }
-
- if($conv) {
- $sql_extra .= sprintf(" AND parent IN (SELECT distinct(parent) from item where ( author_xchan like '%s' or item_mentionsme = 1 )) ",
- dbesc(protect_sprintf($channel['channel_hash']))
- );
- }
-
- if($update && ! $load) {
-
- // only setup pagination on initial page view
- $pager_sql = '';
-
- }
- else {
- $itemspage = get_pconfig(local_channel(),'system','itemspage');
- App::set_pager_itemspage(((intval($itemspage)) ? $itemspage : 20));
- $pager_sql = sprintf(" LIMIT %d OFFSET %d ", intval(App::$pager['itemspage']), intval(App::$pager['start']));
- }
-
-
- if(($cmin != 0) || ($cmax != 99)) {
-
- // Not everybody who shows up in the network stream will be in your address book.
- // By default those that aren't are assumed to have closeness = 99; but this isn't
- // recorded anywhere. So if cmax is 99, we'll open the search up to anybody in
- // the stream with a NULL address book entry.
-
- $sql_nets .= " AND ";
-
- if($cmax == 99)
- $sql_nets .= " ( ";
-
- $sql_nets .= "( abook.abook_closeness >= " . intval($cmin) . " ";
- $sql_nets .= " AND abook.abook_closeness <= " . intval($cmax) . " ) ";
-
- if($cmax == 99)
- $sql_nets .= " OR abook.abook_closeness IS NULL ) ";
-
-
- }
-
- $abook_uids = " and abook.abook_channel = " . local_channel() . " ";
-
- if($firehose && (! get_config('system','disable_discover_tab'))) {
- require_once('include/identity.php');
- $sys = get_sys_channel();
- $uids = " and item.uid = " . intval($sys['channel_id']) . " ";
- App::$data['firehose'] = intval($sys['channel_id']);
- }
- else {
- $uids = " and item.uid = " . local_channel() . " ";
- }
-
- if(get_pconfig(local_channel(),'system','network_list_mode'))
- $page_mode = 'list';
- else
- $page_mode = 'client';
-
- $simple_update = (($update) ? " and item_unseen = 1 " : '');
-
- // This fixes a very subtle bug so I'd better explain it. You wake up in the morning or return after a day
- // or three and look at your matrix page - after opening up your browser. The first page loads just as it
- // should. All of a sudden a few seconds later, page 2 will get inserted at the beginning of the page
- // (before the page 1 content). The update code is actually doing just what it's supposed
- // to, it's fetching posts that have the ITEM_UNSEEN bit set. But the reason that page 2 content is being
- // returned in an UPDATE is because you hadn't gotten that far yet - you're still on page 1 and everything
- // that we loaded for page 1 is now marked as seen. But the stuff on page 2 hasn't been. So... it's being
- // treated as "new fresh" content because it is unseen. We need to distinguish it somehow from content
- // which "arrived as you were reading page 1". We're going to do this
- // by storing in your session the current UTC time whenever you LOAD a network page, and only UPDATE items
- // which are both ITEM_UNSEEN and have "changed" since that time. Cross fingers...
-
- if($update && $_SESSION['loadtime'])
- $simple_update = " AND (( item_unseen = 1 AND item.changed > '" . datetime_convert('UTC','UTC',$_SESSION['loadtime']) . "' ) OR item.changed > '" . datetime_convert('UTC','UTC',$_SESSION['loadtime']) . "' ) ";
- if($load)
- $simple_update = '';
-
- if($nouveau && $load) {
- // "New Item View" - show all items unthreaded in reverse created date order
-
- $items = q("SELECT item.*, item.id AS item_id, received FROM item
- left join abook on ( item.owner_xchan = abook.abook_xchan $abook_uids )
- WHERE true $uids $item_normal
- and (abook.abook_blocked = 0 or abook.abook_flags is null)
- $simple_update
- $sql_extra $sql_nets
- ORDER BY item.received DESC $pager_sql "
- );
-
- require_once('include/items.php');
-
- xchan_query($items);
-
- $items = fetch_post_tags($items,true);
- }
- elseif($update) {
-
- // Normal conversation view
-
- if($order === 'post')
- $ordering = "created";
- else
- $ordering = "commented";
-
- if($load) {
-
- // Fetch a page full of parent items for this page
-
- $r = q("SELECT distinct item.id AS item_id, $ordering FROM item
- left join abook on ( item.owner_xchan = abook.abook_xchan $abook_uids )
- WHERE true $uids $item_normal
- AND item.parent = item.id
- and (abook.abook_blocked = 0 or abook.abook_flags is null)
- $sql_extra3 $sql_extra $sql_nets
- ORDER BY $ordering DESC $pager_sql "
- );
-
- }
- else {
- // this is an update
- $r = q("SELECT item.parent AS item_id FROM item
- left join abook on ( item.owner_xchan = abook.abook_xchan $abook_uids )
- WHERE true $uids $item_normal $simple_update
- and (abook.abook_blocked = 0 or abook.abook_flags is null)
- $sql_extra3 $sql_extra $sql_nets "
- );
- $_SESSION['loadtime'] = datetime_convert();
- }
-
- // Then fetch all the children of the parents that are on this page
- $parents_str = '';
- $update_unseen = '';
-
- if($r) {
-
- $parents_str = ids_to_querystr($r,'item_id');
-
- $items = q("SELECT item.*, item.id AS item_id FROM item
- WHERE true $uids $item_normal
- AND item.parent IN ( %s )
- $sql_extra ",
- dbesc($parents_str)
- );
-
- xchan_query($items,true,(($firehose) ? local_channel() : 0));
- $items = fetch_post_tags($items,true);
- $items = conv_sort($items,$ordering);
- }
- else {
- $items = array();
- }
-
- if($page_mode === 'list') {
-
- /**
- * in "list mode", only mark the parent item and any like activities as "seen".
- * We won't distinguish between comment likes and post likes. The important thing
- * is that the number of unseen comments will be accurate. The SQL to separate the
- * comment likes could also get somewhat hairy.
- */
-
- if($parents_str) {
- $update_unseen = " AND ( id IN ( " . dbesc($parents_str) . " )";
- $update_unseen .= " OR ( parent IN ( " . dbesc($parents_str) . " ) AND verb in ( '" . dbesc(ACTIVITY_LIKE) . "','" . dbesc(ACTIVITY_DISLIKE) . "' ))) ";
- }
- }
- else {
- if($parents_str) {
- $update_unseen = " AND parent IN ( " . dbesc($parents_str) . " )";
- }
- }
- }
-
- if(($update_unseen) && (! $firehose))
- $r = q("UPDATE item SET item_unseen = 0 WHERE item_unseen = 1 AND uid = %d $update_unseen ",
- intval(local_channel())
- );
-
- $mode = (($nouveau) ? 'network-new' : 'network');
-
- $o .= conversation($a,$items,$mode,$update,$page_mode);
-
- if(($items) && (! $update))
- $o .= alt_pager($a,count($items));
-
- return $o;
-}
diff --git a/mod/new_channel.php b/mod/new_channel.php
deleted file mode 100644
index f3b63b655..000000000
--- a/mod/new_channel.php
+++ /dev/null
@@ -1,145 +0,0 @@
-<?php
-
-require_once('include/identity.php');
-require_once('include/permissions.php');
-
-
-function new_channel_init(&$a) {
-
- $cmd = ((argc() > 1) ? argv(1) : '');
-
- if($cmd === 'autofill.json') {
- require_once('library/urlify/URLify.php');
- $result = array('error' => false, 'message' => '');
- $n = trim($_REQUEST['name']);
-
- $x = strtolower(URLify::transliterate($n));
-
- $test = array();
-
- // first name
- if(strpos($x,' '))
- $test[] = legal_webbie(substr($x,0,strpos($x,' ')));
- if($test[0]) {
- // first name plus first initial of last
- $test[] = ((strpos($x,' ')) ? $test[0] . legal_webbie(trim(substr($x,strpos($x,' '),2))) : '');
- // first name plus random number
- $test[] = $test[0] . mt_rand(1000,9999);
- }
- // fullname
- $test[] = legal_webbie($x);
- // fullname plus random number
- $test[] = legal_webbie($x) . mt_rand(1000,9999);
-
- json_return_and_die(check_webbie($test));
- }
-
- if($cmd === 'checkaddr.json') {
- require_once('library/urlify/URLify.php');
- $result = array('error' => false, 'message' => '');
- $n = trim($_REQUEST['nick']);
-
- $x = strtolower(URLify::transliterate($n));
-
- $test = array();
-
- $n = legal_webbie($x);
- if(strlen($n)) {
- $test[] = $n;
- $test[] = $n . mt_rand(1000,9999);
- }
-
- for($y = 0; $y < 100; $y ++)
- $test[] = 'id' . mt_rand(1000,9999);
-
- json_return_and_die(check_webbie($test));
- }
-
-
-}
-
-function new_channel_post(&$a) {
-
- $arr = $_POST;
-
- $acc = App::get_account();
- $arr['account_id'] = get_account_id();
-
- // prevent execution by delegated channels as well as those not logged in.
- // get_account_id() returns the account_id from the session. But App::$account
- // may point to the original authenticated account.
-
- if((! $acc) || ($acc['account_id'] != $arr['account_id'])) {
- notice( t('Permission denied.') . EOL );
- return;
- }
-
- $result = create_identity($arr);
-
- if(! $result['success']) {
- notice($result['message']);
- return;
- }
-
- $newuid = $result['channel']['channel_id'];
-
- change_channel($result['channel']['channel_id']);
-
- if(! strlen($next_page = get_config('system','workflow_channel_next')))
- $next_page = 'settings';
-
- goaway(z_root() . '/' . $next_page);
-
-}
-
-function new_channel_content(&$a) {
-
- $acc = App::get_account();
-
- if((! $acc) || $acc['account_id'] != get_account_id()) {
- notice( t('Permission denied.') . EOL);
- return;
- }
-
- $default_role = '';
- $aid = get_account_id();
- if($aid) {
- $r = q("select count(channel_id) as total from channel where channel_account_id = %d",
- intval($aid)
- );
- if($r && (! intval($r[0]['total']))) {
- $default_role = get_config('system','default_permissions_role');
- }
-
- $limit = account_service_class_fetch(get_account_id(),'total_identities');
-
- if($r && ($limit !== false)) {
- $channel_usage_message = sprintf( t("You have created %1$.0f of %2$.0f allowed channels."), $r[0]['total'], $limit);
- }
- else {
- $channel_usage_message = '';
- }
- }
-
- $name = array('name', t('Name or caption'), ((x($_REQUEST,'name')) ? $_REQUEST['name'] : ''), t('Examples: "Bob Jameson", "Lisa and her Horses", "Soccer", "Aviation Group"'));
- $nickhub = '@' . App::get_hostname();
- $nickname = array('nickname', t('Choose a short nickname'), ((x($_REQUEST,'nickname')) ? $_REQUEST['nickname'] : ''), sprintf( t('Your nickname will be used to create an easy to remember channel address e.g. nickname%s'), $nickhub));
- $privacy_role = ((x($_REQUEST,'permissions_role')) ? $_REQUEST['permissions_role'] : "" );
- $role = array('permissions_role' , t('Channel role and privacy'), ($privacy_role) ? $privacy_role : 'social', t('Select a channel role with your privacy requirements.') . ' <a href="help/roles" target="_blank">' . t('Read more about roles') . '</a>',get_roles());
-
- $o = replace_macros(get_markup_template('new_channel.tpl'), array(
- '$title' => t('Create Channel'),
- '$desc' => t('A channel is your identity on this network. It can represent a person, a blog, or a forum to name a few. Channels can make connections with other channels to share information with highly detailed permissions.'),
- '$label_import' => t('or <a href="import">import an existing channel</a> from another location.'),
- '$name' => $name,
- '$role' => $role,
- '$default_role' => $default_role,
- '$nickname' => $nickname,
- '$submit' => t('Create'),
- '$channel_usage_message' => $channel_usage_message
- ));
-
- return $o;
-
-}
-
diff --git a/mod/nojs.php b/mod/nojs.php
deleted file mode 100644
index c6e04a72b..000000000
--- a/mod/nojs.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-
-function nojs_init(&$a) {
-
- setcookie('jsdisabled', 1, 0);
- $p = $_GET['query'];
- $hasq = strpos($p,'?');
- goaway(z_root() . (($p) ? '/' . $p : '') . (($hasq) ? '' : '?f=' ) . '&jsdisabled=1');
-
-} \ No newline at end of file
diff --git a/mod/notes.php b/mod/notes.php
deleted file mode 100644
index 9bf37d0f9..000000000
--- a/mod/notes.php
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php /** @file */
-
-function notes_init(&$a) {
-
- if(! local_channel())
- return;
-
- $ret = array('success' => true);
- if(array_key_exists('note_text',$_REQUEST)) {
- $body = escape_tags($_REQUEST['note_text']);
-
- // I've had my notes vanish into thin air twice in four years.
- // Provide a backup copy if there were contents previously
- // and there are none being saved now.
-
- if(! $body) {
- $old_text = get_pconfig(local_channel(),'notes','text');
- if($old_text)
- set_pconfig(local_channel(),'notes','text.bak',$old_text);
- }
- set_pconfig(local_channel(),'notes','text',$body);
- }
-
- // push updates to channel clones
-
- if((argc() > 1) && (argv(1) === 'sync')) {
- require_once('include/zot.php');
- build_sync_packet();
- }
-
- logger('notes saved.', LOGGER_DEBUG);
- json_return_and_die($ret);
-
-}
diff --git a/mod/notifications.php b/mod/notifications.php
deleted file mode 100644
index 45eb6483b..000000000
--- a/mod/notifications.php
+++ /dev/null
@@ -1,105 +0,0 @@
-<?php
-
-function notifications_post(&$a) {
-
- if(! local_channel()) {
- goaway(z_root());
- }
-
- $request_id = ((App::$argc > 1) ? App::$argv[1] : 0);
-
- if($request_id === "all")
- return;
-
- if($request_id) {
-
- $r = q("SELECT * FROM `intro` WHERE `id` = %d AND `uid` = %d LIMIT 1",
- intval($request_id),
- intval(local_channel())
- );
-
- if(count($r)) {
- $intro_id = $r[0]['id'];
- $contact_id = $r[0]['contact-id'];
- }
- else {
- notice( t('Invalid request identifier.') . EOL);
- return;
- }
-
- // If it is a friend suggestion, the contact is not a new friend but an existing friend
- // that should not be deleted.
-
- $fid = $r[0]['fid'];
-
- if($_POST['submit'] == t('Discard')) {
- $r = q("DELETE FROM `intro` WHERE `id` = %d",
- intval($intro_id)
- );
- if(! $fid) {
-
- // The check for blocked and pending is in case the friendship was already approved
- // and we just want to get rid of the now pointless notification
-
- $r = q("DELETE FROM `contact` WHERE `id` = %d AND `uid` = %d AND `self` = 0 AND `blocked` = 1 AND `pending` = 1",
- intval($contact_id),
- intval(local_channel())
- );
- }
- goaway(z_root() . '/notifications/intros');
- }
- if($_POST['submit'] == t('Ignore')) {
- $r = q("UPDATE `intro` SET `ignore` = 1 WHERE `id` = %d",
- intval($intro_id));
- goaway(z_root() . '/notifications/intros');
- }
- }
-}
-
-
-
-
-
-function notifications_content(&$a) {
-
- if(! local_channel()) {
- notice( t('Permission denied.') . EOL);
- return;
- }
-
- nav_set_selected('notifications');
-
- $o = '';
-
- $notif_tpl = get_markup_template('notifications.tpl');
-
- $not_tpl = get_markup_template('notify.tpl');
- require_once('include/bbcode.php');
-
- $r = q("SELECT * from notify where uid = %d and seen = 0 order by date desc",
- intval(local_channel())
- );
-
- if (count($r) > 0) {
- $notifications_available =1;
- foreach ($r as $it) {
- $notif_content .= replace_macros($not_tpl,array(
- '$item_link' => z_root().'/notify/view/'. $it['id'],
- '$item_image' => $it['photo'],
- '$item_text' => strip_tags(bbcode($it['msg'])),
- '$item_when' => relative_date($it['date'])
- ));
- }
- } else {
- $notif_content .= t('No more system notifications.');
- }
-
- $o .= replace_macros($notif_tpl,array(
- '$notif_header' => t('System Notifications'),
- '$notif_link_mark_seen' => t('Mark all system notifications seen'),
- '$notif_content' => $notif_content,
- '$notifications_available' => $notifications_available,
- ));
-
- return $o;
-}
diff --git a/mod/notify.php b/mod/notify.php
deleted file mode 100644
index d56871880..000000000
--- a/mod/notify.php
+++ /dev/null
@@ -1,64 +0,0 @@
-<?php
-
-
-function notify_init(&$a) {
- if(! local_channel())
- return;
-
- if(argc() > 2 && argv(1) === 'view' && intval(argv(2))) {
- $r = q("select * from notify where id = %d and uid = %d limit 1",
- intval(argv(2)),
- intval(local_channel())
- );
- if($r) {
- q("update notify set seen = 1 where (( parent != '' and parent = '%s' and otype = '%s' ) or link = '%s' ) and uid = %d",
- dbesc($r[0]['parent']),
- dbesc($r[0]['otype']),
- dbesc($r[0]['link']),
- intval(local_channel())
- );
- goaway($r[0]['link']);
- }
- goaway(z_root());
- }
-
-
-}
-
-
-function notify_content(&$a) {
- if(! local_channel())
- return login();
-
- $notif_tpl = get_markup_template('notifications.tpl');
-
- $not_tpl = get_markup_template('notify.tpl');
- require_once('include/bbcode.php');
-
- $r = q("SELECT * from notify where uid = %d and seen = 0 order by date desc",
- intval(local_channel())
- );
-
- if($r) {
- foreach ($r as $it) {
- $notif_content .= replace_macros($not_tpl,array(
- '$item_link' => z_root().'/notify/view/'. $it['id'],
- '$item_image' => $it['photo'],
- '$item_text' => strip_tags(bbcode($it['msg'])),
- '$item_when' => relative_date($it['date'])
- ));
- }
- }
- else {
- $notif_content .= t('No more system notifications.');
- }
-
- $o .= replace_macros($notif_tpl,array(
- '$notif_header' => t('System Notifications'),
- '$tabs' => '', // $tabs,
- '$notif_content' => $notif_content,
- ));
-
- return $o;
-
-} \ No newline at end of file
diff --git a/mod/oembed.php b/mod/oembed.php
deleted file mode 100644
index a3ac8672d..000000000
--- a/mod/oembed.php
+++ /dev/null
@@ -1,30 +0,0 @@
-<?php
-require_once("include/oembed.php");
-
-function oembed_init(&$a){
- // logger('mod_oembed ' . App::$query_string, LOGGER_ALL);
-
- if(argc() > 1) {
- if (argv(1) == 'b2h'){
- $url = array( "", trim(hex2bin($_REQUEST['url'])));
- echo oembed_replacecb($url);
- killme();
- }
-
- elseif (argv(1) == 'h2b'){
- $text = trim(hex2bin($_REQUEST['text']));
- echo oembed_html2bbcode($text);
- killme();
- }
-
- else {
- echo "<html><body>";
- $src = base64url_decode(argv(1));
- $j = oembed_fetch_url($src);
- echo $j->html;
-// logger('mod-oembed ' . $h, LOGGER_ALL);
- echo "</body></html>";
- }
- }
- killme();
-}
diff --git a/mod/oep.php b/mod/oep.php
deleted file mode 100644
index 36741a752..000000000
--- a/mod/oep.php
+++ /dev/null
@@ -1,398 +0,0 @@
-<?php
-
-// oembed provider
-
-
-
-function oep_init(&$a) {
-
- logger('oep: ' . print_r($_REQUEST,true), LOGGER_DEBUG, LOG_INFO);
-
- $html = ((argc() > 1 && argv(1) === 'html') ? true : false);
- if($_REQUEST['url']) {
- $_REQUEST['url'] = strip_zids($_REQUEST['url']);
- $url = $_REQUEST['url'];
- }
-
- if(! $url)
- http_status_exit(404, 'Not found');
-
- $maxwidth = $_REQUEST['maxwidth'];
- $maxheight = $_REQUEST['maxheight'];
- $format = $_REQUEST['format'];
- if($format && $format !== 'json')
- http_status_exit(501, 'Not implemented');
-
- if(fnmatch('*/photos/*/album/*',$url))
- $arr = oep_album_reply($_REQUEST);
- elseif(fnmatch('*/photos/*/image/*',$url))
- $arr = oep_photo_reply($_REQUEST);
- elseif(fnmatch('*/photos*',$url))
- $arr = oep_phototop_reply($_REQUEST);
- elseif(fnmatch('*/display/*',$url))
- $arr = oep_display_reply($_REQUEST);
- elseif(fnmatch('*/channel/*mid=*',$url))
- $arr = oep_mid_reply($_REQUEST);
- elseif(fnmatch('*/channel*',$url))
- $arr = oep_profile_reply($_REQUEST);
- elseif(fnmatch('*/profile/*',$url))
- $arr = oep_profile_reply($_REQUEST);
-
- if($arr) {
- if($html) {
- if($arr['type'] === 'rich') {
- header('Content-Type: text/html');
- echo $arr['html'];
- }
- }
- else {
- header('Content-Type: application/json+oembed');
- echo json_encode($arr);
- }
- killme();
- }
-
- http_status_exit(404,'Not found');
-
-}
-
-function oep_display_reply($args) {
-
- $ret = array();
- $url = $args['url'];
- $maxwidth = intval($args['maxwidth']);
- $maxheight = intval($args['maxheight']);
-
- if(preg_match('#//(.*?)/(.*?)/(.*?)/(.*?)mid\=(.*?)(&|$)#',$url,$matches)) {
- $chn = $matches[3];
- $res = $matches[5];
- }
-
- if(! ($chn && $res))
- return;
- $c = q("select * from channel where channel_address = '%s' limit 1",
- dbesc($chn)
- );
-
- if(! $c)
- return;
-
- $sql_extra = item_permissions_sql($c[0]['channel_id']);
-
- $p = q("select * from item where mid = '%s' and uid = %d $sql_extra limit 1",
- dbesc($res),
- intval($c[0]['channel_id'])
- );
- if(! $p)
- return;
-
- xchan_query($p,true);
- $p = fetch_post_tags($p,true);
-
- $o = "[share author='".urlencode($p[0]['author']['xchan_name']).
- "' profile='".$p[0]['author']['xchan_url'] .
- "' avatar='".$p[0]['author']['xchan_photo_s'].
- "' link='".$p[0]['plink'].
- "' posted='".$p[0]['created'].
- "' message_id='".$p[0]['mid']."']";
- if($p[0]['title'])
- $o .= '[b]'.$p[0]['title'].'[/b]'."\r\n";
- $o .= $p[0]['body'];
- $o .= "[/share]";
- $o = bbcode($o);
-
- $ret['type'] = 'rich';
-
- $w = (($maxwidth) ? $maxwidth : 640);
- $h = (($maxheight) ? $maxheight : $w * 2 / 3);
-
- $ret['html'] = '<div style="width: ' . $w . '; height: ' . $h . '; font-family: sans-serif,arial,freesans;" >' . $o . '</div>';
-
- $ret['width'] = $w;
- $ret['height'] = $h;
-
- return $ret;
-
-}
-
-function oep_mid_reply($args) {
-
- $ret = array();
- $url = $args['url'];
- $maxwidth = intval($args['maxwidth']);
- $maxheight = intval($args['maxheight']);
-
- if(preg_match('#//(.*?)/(.*?)/(.*?)/(.*?)mid\=(.*?)(&|$)#',$url,$matches)) {
- $chn = $matches[3];
- $res = $matches[5];
- }
-
- if(! ($chn && $res))
- return;
- $c = q("select * from channel where channel_address = '%s' limit 1",
- dbesc($chn)
- );
-
- if(! $c)
- return;
-
- $sql_extra = item_permissions_sql($c[0]['channel_id']);
-
- $p = q("select * from item where mid = '%s' and uid = %d $sql_extra limit 1",
- dbesc($res),
- intval($c[0]['channel_id'])
- );
- if(! $p)
- return;
-
- xchan_query($p,true);
- $p = fetch_post_tags($p,true);
-
- $o = "[share author='".urlencode($p[0]['author']['xchan_name']).
- "' profile='".$p[0]['author']['xchan_url'] .
- "' avatar='".$p[0]['author']['xchan_photo_s'].
- "' link='".$p[0]['plink'].
- "' posted='".$p[0]['created'].
- "' message_id='".$p[0]['mid']."']";
- if($p[0]['title'])
- $o .= '[b]'.$p[0]['title'].'[/b]'."\r\n";
- $o .= $p[0]['body'];
- $o .= "[/share]";
- $o = bbcode($o);
-
- $ret['type'] = 'rich';
-
- $w = (($maxwidth) ? $maxwidth : 640);
- $h = (($maxheight) ? $maxheight : $w * 2 / 3);
-
- $ret['html'] = '<div style="width: ' . $w . '; height: ' . $h . '; font-family: sans-serif,arial,freesans;" >' . $o . '</div>';
-
- $ret['width'] = $w;
- $ret['height'] = $h;
-
- return $ret;
-
-}
-
-function oep_profile_reply($args) {
-
-
- require_once('include/identity.php');
- require_once('include/Contact.php');
- $url = $args['url'];
-
- if(preg_match('#//(.*?)/(.*?)/(.*?)(/|\?|&|$)#',$url,$matches)) {
- $chn = $matches[3];
- }
-
- if(! $chn)
- return;
-
- $c = channelx_by_nick($chn);
-
- if(! $c)
- return;
-
-
- $maxwidth = intval($args['maxwidth']);
- $maxheight = intval($args['maxheight']);
-
- $width = 800;
- $height = 375;
-
- if($maxwidth) {
- $width = $maxwidth;
- $height = (375 / 800) * $width;
- }
- if($maxheight) {
- if($maxheight < $height) {
- $width = (800 / 375) * $maxheight;
- $height = $maxheight;
- }
- }
- $ret = array();
-
- $ret['type'] = 'rich';
- $ret['width'] = intval($width);
- $ret['height'] = intval($height);
-
- $ret['html'] = get_zcard($c,get_observer_hash(),array('width' => $width, 'height' => $height));
-
- return $ret;
-
-}
-
-function oep_album_reply($args) {
-
- $ret = array();
- $url = $args['url'];
- $maxwidth = intval($args['maxwidth']);
- $maxheight = intval($args['maxheight']);
-
- if(preg_match('|//(.*?)/(.*?)/(.*?)/album/|',$url,$matches)) {
- $chn = $matches[3];
- $res = hex2bin(basename($url));
- }
-
- if(! ($chn && $res))
- return;
- $c = q("select * from channel where channel_address = '%s' limit 1",
- dbesc($chn)
- );
-
- if(! $c)
- return;
-
- $sql_extra = permissions_sql($c[0]['channel_id']);
-
- $p = q("select resource_id from photo where album = '%s' and uid = %d and scale = 0 $sql_extra order by created desc limit 1",
- dbesc($res),
- intval($c[0]['channel_id'])
- );
- if(! $p)
- return;
-
- $res = $p[0]['resource_id'];
-
- $r = q("select height, width, scale, resource_id from photo where uid = %d and resource_id = '%s' $sql_extra order by scale asc",
- intval($c[0]['channel_id']),
- dbesc($res)
- );
-
- if($r) {
- foreach($r as $rr) {
- $foundres = false;
- if($maxheight && $rr['height'] > $maxheight)
- continue;
- if($maxwidth && $rr['width'] > $maxwidth)
- continue;
- $foundres = true;
- break;
- }
-
- if($foundres) {
- $ret['type'] = 'link';
- $ret['thumbnail_url'] = z_root() . '/photo/' . '/' . $rr['resource_id'] . '-' . $rr['scale'];
- $ret['thumbnail_width'] = $rr['width'];
- $ret['thumbnail_height'] = $rr['height'];
- }
-
-
- }
- return $ret;
-
-}
-
-
-function oep_phototop_reply($args) {
-
- $ret = array();
- $url = $args['url'];
- $maxwidth = intval($args['maxwidth']);
- $maxheight = intval($args['maxheight']);
-
- if(preg_match('|//(.*?)/(.*?)/(.*?)$|',$url,$matches)) {
- $chn = $matches[3];
- }
-
- if(! $chn)
- return;
- $c = q("select * from channel where channel_address = '%s' limit 1",
- dbesc($chn)
- );
-
- if(! $c)
- return;
-
- $sql_extra = permissions_sql($c[0]['channel_id']);
-
- $p = q("select resource_id from photo where uid = %d and scale = 0 $sql_extra order by created desc limit 1",
- intval($c[0]['channel_id'])
- );
- if(! $p)
- return;
-
- $res = $p[0]['resource_id'];
-
- $r = q("select height, width, scale, resource_id from photo where uid = %d and resource_id = '%s' $sql_extra order by scale asc",
- intval($c[0]['channel_id']),
- dbesc($res)
- );
-
- if($r) {
- foreach($r as $rr) {
- $foundres = false;
- if($maxheight && $rr['height'] > $maxheight)
- continue;
- if($maxwidth && $rr['width'] > $maxwidth)
- continue;
- $foundres = true;
- break;
- }
-
- if($foundres) {
- $ret['type'] = 'link';
- $ret['thumbnail_url'] = z_root() . '/photo/' . '/' . $rr['resource_id'] . '-' . $rr['scale'];
- $ret['thumbnail_width'] = $rr['width'];
- $ret['thumbnail_height'] = $rr['height'];
- }
-
-
- }
- return $ret;
-
-}
-
-
-function oep_photo_reply($args) {
-
- $ret = array();
- $url = $args['url'];
- $maxwidth = intval($args['maxwidth']);
- $maxheight = intval($args['maxheight']);
-
- if(preg_match('|//(.*?)/(.*?)/(.*?)/image/|',$url,$matches)) {
- $chn = $matches[3];
- $res = basename($url);
- }
-
- if(! ($chn && $res))
- return;
- $c = q("select * from channel where channel_address = '%s' limit 1",
- dbesc($chn)
- );
-
- if(! $c)
- return;
-
- $sql_extra = permissions_sql($c[0]['channel_id']);
-
-
- $r = q("select height, width, scale, resource_id from photo where uid = %d and resource_id = '%s' $sql_extra order by scale asc",
- intval($c[0]['channel_id']),
- dbesc($res)
- );
-
- if($r) {
- foreach($r as $rr) {
- $foundres = false;
- if($maxheight && $rr['height'] > $maxheight)
- continue;
- if($maxwidth && $rr['width'] > $maxwidth)
- continue;
- $foundres = true;
- break;
- }
-
- if($foundres) {
- $ret['type'] = 'link';
- $ret['thumbnail_url'] = z_root() . '/photo/' . '/' . $rr['resource_id'] . '-' . $rr['scale'];
- $ret['thumbnail_width'] = $rr['width'];
- $ret['thumbnail_height'] = $rr['height'];
- }
-
-
- }
- return $ret;
-
-} \ No newline at end of file
diff --git a/mod/oexchange.php b/mod/oexchange.php
deleted file mode 100644
index 342b8c3cd..000000000
--- a/mod/oexchange.php
+++ /dev/null
@@ -1,71 +0,0 @@
-<?php
-
-
-function oexchange_init(&$a) {
-
- if((argc() > 1) && (argv(1) === 'xrd')) {
- $tpl = get_markup_template('oexchange_xrd.tpl');
-
- $o = replace_macros($tpl, array('$base' => z_root()));
- echo $o;
- killme();
- }
-}
-
-function oexchange_content(&$a) {
-
- if(! local_channel()) {
- if(remote_channel()) {
- $observer = App::get_observer();
- if($observer && $observer['xchan_url']) {
- $parsed = @parse_url($observer['xchan_url']);
- if(! $parsed) {
- notice( t('Unable to find your hub.') . EOL);
- return;
- }
- $url = $parsed['scheme'] . '://' . $parsed['host'] . (($parsed['port']) ? ':' . $parsed['port'] : '');
- $url .= '/oexchange';
- $result = z_post_url($url,$_REQUEST);
- json_return_and_die($result);
- }
- }
-
- return login(false);
- }
-
- if((argc() > 1) && argv(1) === 'done') {
- info( t('Post successful.') . EOL);
- return;
- }
-
- $url = (((x($_REQUEST,'url')) && strlen($_REQUEST['url']))
- ? urlencode(notags(trim($_REQUEST['url']))) : '');
- $title = (((x($_REQUEST,'title')) && strlen($_REQUEST['title']))
- ? '&title=' . urlencode(notags(trim($_REQUEST['title']))) : '');
- $description = (((x($_REQUEST,'description')) && strlen($_REQUEST['description']))
- ? '&description=' . urlencode(notags(trim($_REQUEST['description']))) : '');
- $tags = (((x($_REQUEST,'tags')) && strlen($_REQUEST['tags']))
- ? '&tags=' . urlencode(notags(trim($_REQUEST['tags']))) : '');
-
- $ret = z_fetch_url(z_root() . '/urlinfo?f=&url=' . $url . $title . $description . $tags);
-
- if($ret['success'])
- $s = $ret['body'];
-
- if(! strlen($s))
- return;
-
- $post = array();
-
- $post['profile_uid'] = local_channel();
- $post['return'] = '/oexchange/done' ;
- $post['body'] = $s;
- $post['type'] = 'wall';
-
- $_REQUEST = $post;
- require_once('mod/item.php');
- item_post($a);
-
-}
-
-
diff --git a/mod/online.php b/mod/online.php
deleted file mode 100644
index c6500347a..000000000
--- a/mod/online.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php /** @file */
-
-function online_init(&$a) {
-
- $ret = array('result' => false);
- if(argc() != 2)
- json_return_and_die($ret);
-
- $ret = get_online_status(argv(1));
- json_return_and_die($ret);
-}
diff --git a/mod/openid.php b/mod/openid.php
deleted file mode 100644
index 1ca1ba91e..000000000
--- a/mod/openid.php
+++ /dev/null
@@ -1,192 +0,0 @@
-<?php
-
-
-require_once('library/openid/openid.php');
-require_once('include/auth.php');
-
-function openid_content(&$a) {
-
- $noid = get_config('system','disable_openid');
- if($noid)
- goaway(z_root());
-
- logger('mod_openid ' . print_r($_REQUEST,true), LOGGER_DATA);
-
- if(x($_REQUEST,'openid_mode')) {
-
- $openid = new LightOpenID(z_root());
-
- if($openid->validate()) {
-
- logger('openid: validate');
-
- $authid = normalise_openid($_REQUEST['openid_identity']);
-
- if(! strlen($authid)) {
- logger( t('OpenID protocol error. No ID returned.') . EOL);
- goaway(z_root());
- }
-
- $x = match_openid($authid);
- if($x) {
-
- $r = q("select * from channel where channel_id = %d limit 1",
- intval($x)
- );
- if($r) {
- $y = q("select * from account where account_id = %d limit 1",
- intval($r[0]['channel_account_id'])
- );
- if($y) {
- foreach($y as $record) {
- if(($record['account_flags'] == ACCOUNT_OK) || ($record['account_flags'] == ACCOUNT_UNVERIFIED)) {
- logger('mod_openid: openid success for ' . $x[0]['channel_name']);
- $_SESSION['uid'] = $r[0]['channel_id'];
- $_SESSION['account_id'] = $r[0]['channel_account_id'];
- $_SESSION['authenticated'] = true;
- authenticate_success($record,true,true,true,true);
- goaway(z_root());
- }
- }
- }
- }
- }
-
- // Successful OpenID login - but we can't match it to an existing account.
- // See if they've got an xchan
-
- $r = q("select * from xconfig left join xchan on xchan_hash = xconfig.xchan where cat = 'system' and k = 'openid' and v = '%s' limit 1",
- dbesc($authid)
- );
-
- if($r) {
- $_SESSION['authenticated'] = 1;
- $_SESSION['visitor_id'] = $r[0]['xchan_hash'];
- $_SESSION['my_url'] = $r[0]['xchan_url'];
- $_SESSION['my_address'] = $r[0]['xchan_addr'];
- $arr = array('xchan' => $r[0], 'session' => $_SESSION);
- call_hooks('magic_auth_openid_success',$arr);
- App::set_observer($r[0]);
- require_once('include/security.php');
- App::set_groups(init_groups_visitor($_SESSION['visitor_id']));
- info(sprintf( t('Welcome %s. Remote authentication successful.'),$r[0]['xchan_name']));
- logger('mod_openid: remote auth success from ' . $r[0]['xchan_addr']);
- if($_SESSION['return_url'])
- goaway($_SESSION['return_url']);
- goaway(z_root());
- }
-
- // no xchan...
- // create one.
- // We should probably probe the openid url and figure out if they have any kind of social presence we might be able to
- // scrape some identifying info from.
-
- $name = $authid;
- $url = trim($_REQUEST['openid_identity'],'/');
- if(strpos($url,'http') === false)
- $url = 'https://' . $url;
- $pphoto = z_root() . '/' . get_default_profile_photo();
- $parsed = @parse_url($url);
- if($parsed) {
- $host = $parsed['host'];
- }
-
- $attr = $openid->getAttributes();
-
- if(is_array($attr) && count($attr)) {
- foreach($attr as $k => $v) {
- if($k === 'namePerson/friendly')
- $nick = notags(trim($v));
- if($k === 'namePerson/first')
- $first = notags(trim($v));
- if($k === 'namePerson')
- $name = notags(trim($v));
- if($k === 'contact/email')
- $addr = notags(trim($v));
- if($k === 'media/image/aspect11')
- $photosq = trim($v);
- if($k === 'media/image/default')
- $photo_other = trim($v);
- }
- }
- if(! $nick) {
- if($first)
- $nick = $first;
- else
- $nick = $name;
- }
-
- require_once('library/urlify/URLify.php');
- $x = strtolower(URLify::transliterate($nick));
- if($nick & $host)
- $addr = $nick . '@' . $host;
- $network = 'unknown';
-
- if($photosq)
- $pphoto = $photosq;
- elseif($photo_other)
- $pphoto = $photo_other;
-
- $mimetype = guess_image_type($pphoto);
-
- $x = q("insert into xchan ( xchan_hash, xchan_guid, xchan_guid_sig, xchan_pubkey, xchan_photo_mimetype,
- xchan_photo_l, xchan_addr, xchan_url, xchan_connurl, xchan_follow, xchan_connpage, xchan_name, xchan_network, xchan_photo_date,
- xchan_name_date, xchan_hidden)
- values ( '%s', '%s', '%s', '%s' , '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', 1) ",
- dbesc($url),
- dbesc(''),
- dbesc(''),
- dbesc(''),
- dbesc($mimetype),
- dbesc($pphoto),
- dbesc($addr),
- dbesc($url),
- dbesc(''),
- dbesc(''),
- dbesc(''),
- dbesc($name),
- dbesc($network),
- dbesc(datetime_convert()),
- dbesc(datetime_convert())
- );
- if($x) {
- $r = q("select * from xchan where xchan_hash = '%s' limit 1",
- dbesc($url)
- );
- if($r) {
-
- $photos = import_xchan_photo($pphoto,$url);
- if($photos) {
- $z = q("update xchan set xchan_photo_date = '%s', xchan_photo_l = '%s', xchan_photo_m = '%s',
- xchan_photo_s = '%s', xchan_photo_mimetype = '%s' where xchan_hash = '%s'",
- dbesc(datetime_convert()),
- dbesc($photos[0]),
- dbesc($photos[1]),
- dbesc($photos[2]),
- dbesc($photos[3]),
- dbesc($url)
- );
- }
-
- set_xconfig($url,'system','openid',$authid);
- $_SESSION['authenticated'] = 1;
- $_SESSION['visitor_id'] = $r[0]['xchan_hash'];
- $_SESSION['my_url'] = $r[0]['xchan_url'];
- $_SESSION['my_address'] = $r[0]['xchan_addr'];
- $arr = array('xchan' => $r[0], 'session' => $_SESSION);
- call_hooks('magic_auth_openid_success',$arr);
- App::set_observer($r[0]);
- info(sprintf( t('Welcome %s. Remote authentication successful.'),$r[0]['xchan_name']));
- logger('mod_openid: remote auth success from ' . $r[0]['xchan_addr']);
- if($_SESSION['return_url'])
- goaway($_SESSION['return_url']);
- goaway(z_root());
- }
- }
-
- }
- }
- notice( t('Login failed.') . EOL);
- goaway(z_root());
- // NOTREACHED
-}
diff --git a/mod/opensearch.php b/mod/opensearch.php
deleted file mode 100644
index 19f7985c5..000000000
--- a/mod/opensearch.php
+++ /dev/null
@@ -1,18 +0,0 @@
-<?php
-
-function opensearch_init(&$a) {
-
- $tpl = get_markup_template('opensearch.tpl');
-
- header("Content-type: application/opensearchdescription+xml");
-
- $o = replace_macros($tpl, array(
- '$baseurl' => z_root(),
- '$nodename' => App::get_hostname(),
- ));
-
- echo $o;
-
- killme();
-
-}
diff --git a/mod/page.php b/mod/page.php
deleted file mode 100644
index c7b827e4d..000000000
--- a/mod/page.php
+++ /dev/null
@@ -1,144 +0,0 @@
-<?php
-
-require_once('include/items.php');
-require_once('include/conversation.php');
-require_once('include/page_widgets.php');
-
-function page_init(&$a) {
- // We need this to make sure the channel theme is always loaded.
-
- $which = argv(1);
- $profile = 0;
- profile_load($a,$which,$profile);
-
-
-
- if(App::$profile['profile_uid'])
- head_set_icon(App::$profile['thumb']);
-
- // load the item here in the init function because we need to extract
- // the page layout and initialise the correct theme.
-
-
- $observer = App::get_observer();
- $ob_hash = (($observer) ? $observer['xchan_hash'] : '');
-
-
- // perm_is_allowed is denied unconditionally when 'site blocked to unauthenticated members'.
- // This bypasses that restriction for sys channel (public) content
-
- if((! perm_is_allowed(App::$profile['profile_uid'],$ob_hash,'view_pages')) && (! is_sys_channel(App::$profile['profile_uid']))) {
- notice( t('Permission denied.') . EOL);
- return;
- }
-
- if(argc() < 3) {
- notice( t('Invalid item.') . EOL);
- return;
- }
-
- $channel_address = argv(1);
-
- // The page link title was stored in a urlencoded format
- // php or the browser may/will have decoded it, so re-encode it for our search
-
- $page_id = urlencode(argv(2));
-
- $u = q("select channel_id from channel where channel_address = '%s' limit 1",
- dbesc($channel_address)
- );
-
- if(! $u) {
- notice( t('Channel not found.') . EOL);
- return;
- }
-
- if($_REQUEST['rev'])
- $revision = " and revision = " . intval($_REQUEST['rev']) . " ";
- else
- $revision = " order by revision desc ";
-
- require_once('include/security.php');
- $sql_options = item_permissions_sql($u[0]['channel_id']);
-
- $r = q("select item.* from item left join item_id on item.id = item_id.iid
- where item.uid = %d and sid = '%s' and (( service = 'WEBPAGE' and item_type = %d )
- OR ( service = 'PDL' AND item_type = %d )) $sql_options $revision limit 1",
- intval($u[0]['channel_id']),
- dbesc($page_id),
- intval(ITEM_TYPE_WEBPAGE),
- intval(ITEM_TYPE_PDL)
- );
- if(! $r) {
-
- // Check again with no permissions clause to see if it is a permissions issue
-
- $x = q("select item.* from item left join item_id on item.id = item_id.iid
- where item.uid = %d and sid = '%s' and service = 'WEBPAGE' and
- item_type = %d $revision limit 1",
- intval($u[0]['channel_id']),
- dbesc($page_id),
- intval(ITEM_TYPE_WEBPAGE)
- );
-
- if($x) {
- // Yes, it's there. You just aren't allowed to see it.
- notice( t('Permission denied.') . EOL);
- }
- else {
- notice( t('Page not found.') . EOL);
- }
- return;
- }
-
- if($r[0]['title'])
- App::$page['title'] = escape_tags($r[0]['title']);
-
- if($r[0]['item_type'] == ITEM_TYPE_PDL) {
- require_once('include/comanche.php');
- comanche_parser(get_app(),$r[0]['body']);
- App::$pdl = $r[0]['body'];
- }
- elseif($r[0]['layout_mid']) {
- $l = q("select body from item where mid = '%s' and uid = %d limit 1",
- dbesc($r[0]['layout_mid']),
- intval($u[0]['channel_id'])
- );
-
- if($l) {
- require_once('include/comanche.php');
- comanche_parser(get_app(),$l[0]['body']);
- App::$pdl = $l[0]['body'];
- }
- }
-
- App::$data['webpage'] = $r;
-
-}
-
-
-
-
-function page_content(&$a) {
-
- $r = App::$data['webpage'];
- if(! $r)
- return;
-
- if($r[0]['item_type'] == ITEM_TYPE_PDL) {
- $r[0]['body'] = t('Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.');
- $r[0]['mimetype'] = 'text/plain';
- $r[0]['title'] = '';
-
- }
-
- xchan_query($r);
- $r = fetch_post_tags($r,true);
-
- if($r[0]['mimetype'] === 'application/x-pdl')
- App::$page['pdl_content'] = true;
-
- $o .= prepare_page($r[0]);
- return $o;
-
-}
diff --git a/mod/pconfig.php b/mod/pconfig.php
deleted file mode 100755
index 64fc1271c..000000000
--- a/mod/pconfig.php
+++ /dev/null
@@ -1,113 +0,0 @@
-<?php
-
-
-function disallowed_pconfig() {
- return array(
- 'permissions_role'
- );
-}
-
-
-function pconfig_post(&$a) {
-
- if(! local_channel())
- return;
-
-
- if($_SESSION['delegate'])
- return;
-
- check_form_security_token_redirectOnErr('/pconfig', 'pconfig');
-
- $cat = trim(escape_tags($_POST['cat']));
- $k = trim(escape_tags($_POST['k']));
- $v = trim($_POST['v']);
-
- if(in_array(argv(2),disallowed_pconfig())) {
- notice( t('This setting requires special processing and editing has been blocked.') . EOL);
- return;
- }
-
- if(strpos($k,'password') !== false) {
- $v = z_obscure($v);
- }
-
- set_pconfig(local_channel(),$cat,$k,$v);
- build_sync_packet();
-
- goaway(z_root() . '/pconfig/' . $cat . '/' . $k);
-
-}
-
-
-function pconfig_content(&$a) {
-
- if(! local_channel()) {
- return login();
- }
-
- $content = '<h3>' . t('Configuration Editor') . '</h3>';
- $content .= '<div class="descriptive-paragraph">' . t('Warning: Changing some settings could render your channel inoperable. Please leave this page unless you are comfortable with and knowledgeable about how to correctly use this feature.') . '</div>' . EOL . EOL;
-
-
-
- if(argc() == 3) {
- $content .= '<a href="pconfig">pconfig[' . local_channel() . ']</a>' . EOL;
- $content .= '<a href="pconfig/' . escape_tags(argv(1)) . '">pconfig[' . local_channel() . '][' . escape_tags(argv(1)) . ']</a>' . EOL . EOL;
- $content .= '<a href="pconfig/' . escape_tags(argv(1)) . '/' . escape_tags(argv(2)) . '" >pconfig[' . local_channel() . '][' . escape_tags(argv(1)) . '][' . escape_tags(argv(2)) . ']</a> = ' . get_pconfig(local_channel(),escape_tags(argv(1)),escape_tags(argv(2))) . EOL;
-
- if(in_array(argv(2),disallowed_pconfig())) {
- notice( t('This setting requires special processing and editing has been blocked.') . EOL);
- return $content;
- }
- else
- $content .= pconfig_form(escape_tags(argv(1)),escape_tags(argv(2)));
- }
-
-
- if(argc() == 2) {
- $content .= '<a href="pconfig">pconfig[' . local_channel() . ']</a>' . EOL;
- load_pconfig(local_channel(),escape_tags(argv(1)));
- foreach(App::$config[local_channel()][escape_tags(argv(1))] as $k => $x) {
- $content .= '<a href="pconfig/' . escape_tags(argv(1)) . '/' . $k . '" >pconfig[' . local_channel() . '][' . escape_tags(argv(1)) . '][' . $k . ']</a> = ' . escape_tags($x) . EOL;
- }
- }
-
- if(argc() == 1) {
-
- $r = q("select * from pconfig where uid = " . local_channel());
- if($r) {
- foreach($r as $rr) {
- $content .= '<a href="' . 'pconfig/' . escape_tags($rr['cat']) . '/' . escape_tags($rr['k']) . '" >pconfig[' . local_channel() . '][' . escape_tags($rr['cat']) . '][' . escape_tags($rr['k']) . ']</a> = ' . escape_tags($rr['v']) . EOL;
- }
- }
- }
- return $content;
-
-}
-
-
-function pconfig_form($cat,$k) {
-
- $o = '<form action="pconfig" method="post" >';
- $o .= '<input type="hidden" name="form_security_token" value="' . get_form_security_token('pconfig') . '" />';
-
- $v = get_pconfig(local_channel(),$cat,$k);
- if(strpos($k,'password') !== false)
- $v = z_unobscure($v);
-
- $o .= '<input type="hidden" name="cat" value="' . $cat . '" />';
- $o .= '<input type="hidden" name="k" value="' . $k . '" />';
-
- if(strpos($v,"\n"))
- $o .= '<textarea name="v" >' . escape_tags($v) . '</textarea>';
- else
- $o .= '<input type="text" name="v" value="' . escape_tags($v) . '" />';
-
- $o .= EOL . EOL;
- $o .= '<input type="submit" name="submit" value="' . t('Submit') . '" />';
- $o .= '</form>';
-
- return $o;
-
-}
diff --git a/mod/pdledit.php b/mod/pdledit.php
deleted file mode 100644
index bf29b2da0..000000000
--- a/mod/pdledit.php
+++ /dev/null
@@ -1,66 +0,0 @@
-<?php
-
-function pdledit_post(&$a) {
- if(! local_channel())
- return;
- if(! $_REQUEST['module'])
- return;
- if(! trim($_REQUEST['content'])) {
- del_pconfig(local_channel(),'system','mod_' . $_REQUEST['module'] . '.pdl');
- goaway(z_root() . '/pdledit/' . $_REQUEST['module']);
- }
- set_pconfig(local_channel(),'system','mod_' . $_REQUEST['module'] . '.pdl',escape_tags($_REQUEST['content']));
- build_sync_packet();
- info( t('Layout updated.') . EOL);
- goaway(z_root() . '/pdledit/' . $_REQUEST['module']);
-}
-
-
-function pdledit_content(&$a) {
-
- if(! local_channel()) {
- notice( t('Permission denied.') . EOL);
- return;
- }
-
- if(argc() > 1)
- $module = 'mod_' . argv(1) . '.pdl';
- else {
- $o .= '<div class="generic-content-wrapper-styled">';
- $o .= '<h1>' . t('Edit System Page Description') . '</h1>';
- $files = glob('mod/*');
- if($files) {
- foreach($files as $f) {
- $name = basename($f,'.php');
- $x = theme_include('mod_' . $name . '.pdl');
- if($x) {
- $o .= '<a href="pdledit/' . $name . '" >' . $name . '</a><br />';
- }
- }
- }
-
- $o .= '</div>';
-
- // list module pdl files
- return $o;
- }
-
- $t = get_pconfig(local_channel(),'system',$module);
- if(! $t)
- $t = file_get_contents(theme_include($module));
- if(! $t) {
- notice( t('Layout not found.') . EOL);
- return '';
- }
-
- $o = replace_macros(get_markup_template('pdledit.tpl'),array(
- '$header' => t('Edit System Page Description'),
- '$mname' => t('Module Name:'),
- '$help' => t('Layout Help'),
- '$module' => argv(1),
- '$content' => htmlspecialchars($t,ENT_COMPAT,'UTF-8'),
- '$submit' => t('Submit')
- ));
-
- return $o;
-}
diff --git a/mod/photo.php b/mod/photo.php
deleted file mode 100644
index 93c6efa95..000000000
--- a/mod/photo.php
+++ /dev/null
@@ -1,244 +0,0 @@
-<?php
-
-require_once('include/security.php');
-require_once('include/photo/photo_driver.php');
-
-function photo_init(&$a) {
-
- $prvcachecontrol = false;
-
- switch(argc()) {
- case 4:
- $person = argv(3);
- $res = argv(2);
- $type = argv(1);
- break;
- case 2:
- $photo = argv(1);
- break;
- case 1:
- default:
- killme();
- // NOTREACHED
- }
-
- $observer_xchan = get_observer_hash();
-
- $default = get_default_profile_photo();
-
- if(isset($type)) {
-
- /**
- * Profile photos - Access controls on default profile photos are not honoured since they need to be exchanged with remote sites.
- *
- */
-
- if($type === 'profile') {
- switch($res) {
-
- case 'm':
- $resolution = 5;
- $default = get_default_profile_photo(80);
- break;
- case 's':
- $resolution = 6;
- $default = get_default_profile_photo(48);
- break;
- case 'l':
- default:
- $resolution = 4;
- break;
- }
- }
-
- $uid = $person;
-
- $r = q("SELECT * FROM photo WHERE scale = %d AND uid = %d AND photo_usage = %d LIMIT 1",
- intval($resolution),
- intval($uid),
- intval(PHOTO_PROFILE)
- );
- if(count($r)) {
- $data = dbunescbin($r[0]['data']);
- $mimetype = $r[0]['type'];
- }
- if(intval($r[0]['os_storage']))
- $data = file_get_contents($data);
- if(! isset($data)) {
- $data = file_get_contents($default);
- $mimetype = 'image/png';
- }
- }
- else {
-
- /**
- * Other photos
- */
-
- /* Check for a cookie to indicate display pixel density, in order to detect high-resolution
- displays. This procedure was derived from the "Retina Images" by Jeremey Worboys,
- used in accordance with the Creative Commons Attribution 3.0 Unported License.
- Project link: https://github.com/Retina-Images/Retina-Images
- License link: http://creativecommons.org/licenses/by/3.0/
- */
- $cookie_value = false;
- if (isset($_COOKIE['devicePixelRatio'])) {
- $cookie_value = intval($_COOKIE['devicePixelRatio']);
- }
- else {
- // Force revalidation of cache on next request
- $cache_directive = 'no-cache';
- $status = 'no cookie';
- }
-
- $resolution = 0;
-
- if(strpos($photo,'.') !== false)
- $photo = substr($photo,0,strpos($photo,'.'));
-
- if(substr($photo,-2,1) == '-') {
- $resolution = intval(substr($photo,-1,1));
- $photo = substr($photo,0,-2);
- // If viewing on a high-res screen, attempt to serve a higher resolution image:
- if ($resolution == 2 && ($cookie_value > 1))
- {
- $resolution = 1;
- }
- }
-
- // If using resolution 1, make sure it exists before proceeding:
- if ($resolution == 1)
- {
- $r = q("SELECT uid FROM photo WHERE resource_id = '%s' AND scale = %d LIMIT 1",
- dbesc($photo),
- intval($resolution)
- );
- if (!($r))
- $resolution = 2;
- }
-
- $r = q("SELECT uid FROM photo WHERE resource_id = '%s' AND scale = %d LIMIT 1",
- dbesc($photo),
- intval($resolution)
- );
- if($r) {
-
- $allowed = (($r[0]['uid']) ? perm_is_allowed($r[0]['uid'],$observer_xchan,'view_storage') : true);
-
- $sql_extra = permissions_sql($r[0]['uid']);
-
- // Now we'll see if we can access the photo
-
- $r = q("SELECT * FROM photo WHERE resource_id = '%s' AND scale = %d $sql_extra LIMIT 1",
- dbesc($photo),
- intval($resolution)
- );
-
- if($r && $allowed) {
- $data = dbunescbin($r[0]['data']);
- $mimetype = $r[0]['type'];
- if(intval($r[0]['os_storage']))
- $data = file_get_contents($data);
- }
- else {
-
- // Does the picture exist? It may be a remote person with no credentials,
- // but who should otherwise be able to view it. Show a default image to let
- // them know permissions was denied. It may be possible to view the image
- // through an authenticated profile visit.
- // There won't be many completely unauthorised people seeing this because
- // they won't have the photo link, so there's a reasonable chance that the person
- // might be able to obtain permission to view it.
-
- $r = q("SELECT * FROM `photo` WHERE `resource_id` = '%s' AND `scale` = %d LIMIT 1",
- dbesc($photo),
- intval($resolution)
- );
-
- if($r) {
- logger('mod_photo: forbidden. ' . App::$query_string);
- $observer = App::get_observer();
- logger('mod_photo: observer = ' . (($observer) ? $observer['xchan_addr'] : '(not authenticated)'));
- $data = file_get_contents('images/nosign.png');
- $mimetype = 'image/png';
- $prvcachecontrol = true;
- }
- }
- }
- }
-
- if(! isset($data)) {
- if(isset($resolution)) {
- switch($resolution) {
-
- case 4:
- $data = file_get_contents(get_default_profile_photo());
- $mimetype = 'image/png';
- break;
- case 5:
- $data = file_get_contents(get_default_profile_photo(80));
- $mimetype = 'image/png';
- break;
- case 6:
- $data = file_get_contents(get_default_profile_photo(48));
- $mimetype = 'image/png';
- break;
- default:
- killme();
- // NOTREACHED
- break;
- }
- }
- }
-
- if(isset($res) && intval($res) && $res < 500) {
- $ph = photo_factory($data, $mimetype);
- if($ph->is_valid()) {
- $ph->scaleImageSquare($res);
- $data = $ph->imageString();
- $mimetype = $ph->getType();
- }
- }
-
- // Writing in cachefile
- if (isset($cachefile) && $cachefile != '')
- file_put_contents($cachefile, $data);
-
- if(function_exists('header_remove')) {
- header_remove('Pragma');
- header_remove('pragma');
- }
-
- header("Content-type: " . $mimetype);
-
- if($prvcachecontrol) {
-
- // it is a private photo that they have no permission to view.
- // tell the browser not to cache it, in case they authenticate
- // and subsequently have permission to see it
-
- header("Cache-Control: no-store, no-cache, must-revalidate");
-
- }
- else {
- // The photo cache default is 1 day to provide a privacy trade-off,
- // as somebody reducing photo permissions on a photo that is already
- // "in the wild" won't be able to stop the photo from being viewed
- // for this amount amount of time once it is in the browser cache.
- // The privacy expectations of your site members and their perception
- // of privacy where it affects the entire project may be affected.
- // This has performance considerations but we highly recommend you
- // leave it alone.
-
- $cache = get_config('system','photo_cache_time');
- if(! $cache)
- $cache = (3600 * 24); // 1 day
-
- header("Expires: " . gmdate("D, d M Y H:i:s", time() + $cache) . " GMT");
- header("Cache-Control: max-age=" . $cache);
-
- }
- echo $data;
- killme();
- // NOTREACHED
-}
diff --git a/mod/photos.php b/mod/photos.php
deleted file mode 100644
index bf904db22..000000000
--- a/mod/photos.php
+++ /dev/null
@@ -1,1378 +0,0 @@
-<?php
-require_once('include/photo/photo_driver.php');
-require_once('include/photos.php');
-require_once('include/items.php');
-require_once('include/acl_selectors.php');
-require_once('include/bbcode.php');
-require_once('include/security.php');
-require_once('include/Contact.php');
-require_once('include/attach.php');
-require_once('include/text.php');
-
-
-function photos_init(&$a) {
-
-
- if((get_config('system','block_public')) && (! local_channel()) && (! remote_channel())) {
- return;
- }
-
- $o = '';
-
- if(argc() > 1) {
- $nick = argv(1);
-
- profile_load($a,$nick);
-
- $channelx = channelx_by_nick($nick);
-
- if(! $channelx)
- return;
-
- App::$data['channel'] = $channelx;
-
- $observer = App::get_observer();
- App::$data['observer'] = $observer;
-
- $observer_xchan = (($observer) ? $observer['xchan_hash'] : '');
-
- head_set_icon(App::$data['channel']['xchan_photo_s']);
-
- App::$page['htmlhead'] .= "<script> var ispublic = '" . t('everybody') . "'; var profile_uid = " . ((App::$data['channel']) ? App::$data['channel']['channel_id'] : 0) . "; </script>" ;
-
- }
-
- return;
-}
-
-
-
-function photos_post(&$a) {
-
- logger('mod-photos: photos_post: begin' , LOGGER_DEBUG);
-
-
- logger('mod_photos: REQUEST ' . print_r($_REQUEST,true), LOGGER_DATA);
- logger('mod_photos: FILES ' . print_r($_FILES,true), LOGGER_DATA);
-
- $ph = photo_factory('');
-
- $phototypes = $ph->supportedTypes();
-
- $can_post = false;
-
- $page_owner_uid = App::$data['channel']['channel_id'];
-
- if(perm_is_allowed($page_owner_uid,get_observer_hash(),'write_storage'))
- $can_post = true;
-
- if(! $can_post) {
- notice( t('Permission denied.') . EOL );
- if(is_ajax())
- killme();
- return;
- }
-
- $s = abook_self($page_owner_uid);
-
- if(! $s) {
- notice( t('Page owner information could not be retrieved.') . EOL);
- logger('mod_photos: post: unable to locate contact record for page owner. uid=' . $page_owner_uid);
- if(is_ajax())
- killme();
- return;
- }
-
- $owner_record = $s[0];
-
- $acl = new Zotlabs\Access\AccessList(App::$data['channel']);
-
- if((argc() > 3) && (argv(2) === 'album')) {
-
- $album = hex2bin(argv(3));
-
- if($album === t('Profile Photos')) {
- // not allowed
- goaway(z_root() . '/' . $_SESSION['photo_return']);
- }
-
- if(! photos_album_exists($page_owner_uid,$album)) {
- notice( t('Album not found.') . EOL);
- goaway(z_root() . '/' . $_SESSION['photo_return']);
- }
-
-
- /*
- * RENAME photo album
- */
-
- $newalbum = notags(trim($_REQUEST['albumname']));
- if($newalbum != $album) {
-
- // @fixme - syncronise with DAV or disallow completely
-
- goaway(z_root() . '/' . $_SESSION['photo_return']);
-
-// $x = photos_album_rename($page_owner_uid,$album,$newalbum);
-// if($x) {
-// $newurl = str_replace(bin2hex($album),bin2hex($newalbum),$_SESSION['photo_return']);
-// goaway(z_root() . '/' . $newurl);
-// }
- }
-
- /*
- * DELETE photo album and all its photos
- */
-
- if($_REQUEST['dropalbum'] == t('Delete Album')) {
-
-
- // This is dangerous because we combined file storage and photos into one interface
- // This function will remove all photos from any directory with the same name since
- // we have not passed the path value.
-
- // The correct solution would be to use a full pathname from your storage root for 'album'
- // We also need to prevent/block removing the storage root folder.
-
- $folder_hash = '';
-
- $r = q("select * from attach where is_dir = 1 and uid = %d and filename = '%s'",
- intval($page_owner_uid),
- dbesc($album)
- );
- if(! $r) {
- notice( t('Album not found.') . EOL);
- return;
- }
- if(count($r) > 1) {
- notice( t('Multiple storage folders exist with this album name, but within different directories. Please remove the desired folder or folders using the Files manager') . EOL);
- return;
- }
- else {
- $folder_hash = $r[0]['hash'];
- }
-
-
-
- $res = array();
-
- // get the list of photos we are about to delete
-
- if(remote_channel() && (! local_channel())) {
- $str = photos_album_get_db_idstr($page_owner_uid,$album,remote_channel());
- }
- elseif(local_channel()) {
- $str = photos_album_get_db_idstr(local_channel(),$album);
- }
- else {
- $str = null;
- }
- if(! $str) {
- goaway(z_root() . '/' . $_SESSION['photo_return']);
- }
-
- $r = q("select id from item where resource_id in ( $str ) and resource_type = 'photo' and uid = %d " . item_normal(),
- intval($page_owner_uid)
- );
- if($r) {
- foreach($r as $i) {
- attach_delete($page_owner_uid, $i['resource_id'], 1 );
- }
- }
-
- // remove the associated photos in case they weren't attached to an item
-
- q("delete from photo where resource_id in ( $str ) and uid = %d",
- intval($page_owner_uid)
- );
-
- // @FIXME do the same for the linked attach
-
- if($folder_hash) {
- attach_delete($page_owner_uid,$folder_hash, 1);
-
- $sync = attach_export_data(App::$data['channel'],$folder_hash, true);
-
- if($sync)
- build_sync_packet($page_owner_uid,array('file' => array($sync)));
- }
-
- }
-
- goaway(z_root() . '/photos/' . App::$data['channel']['channel_address']);
- }
-
- if((argc() > 2) && (x($_REQUEST,'delete')) && ($_REQUEST['delete'] === t('Delete Photo'))) {
-
- // same as above but remove single photo
-
- $ob_hash = get_observer_hash();
- if(! $ob_hash)
- goaway(z_root() . '/' . $_SESSION['photo_return']);
-
- $r = q("SELECT `id`, `resource_id` FROM `photo` WHERE ( xchan = '%s' or `uid` = %d ) AND `resource_id` = '%s' LIMIT 1",
- dbesc($ob_hash),
- intval(local_channel()),
- dbesc(App::$argv[2])
- );
-
- if($r) {
- attach_delete($page_owner_uid, $r[0]['resource_id'], 1 );
- $sync = attach_export_data(App::$data['channel'],$r[0]['resource_id'], true);
-
- if($sync)
- build_sync_packet($page_owner_uid,array('file' => array($sync)));
- }
-
- goaway(z_root() . '/photos/' . App::$data['channel']['channel_address'] . '/album/' . $_SESSION['album_return']);
- }
-
-
- if((App::$argc > 2) && ((x($_POST,'desc') !== false) || (x($_POST,'newtag') !== false)) || (x($_POST,'albname') !== false)) {
-
-
- $desc = ((x($_POST,'desc')) ? notags(trim($_POST['desc'])) : '');
- $rawtags = ((x($_POST,'newtag')) ? notags(trim($_POST['newtag'])) : '');
- $item_id = ((x($_POST,'item_id')) ? intval($_POST['item_id']) : 0);
- $albname = ((x($_POST,'albname')) ? notags(trim($_POST['albname'])) : '');
- $is_nsfw = ((x($_POST,'adult')) ? intval($_POST['adult']) : 0);
-
- $acl->set_from_array($_POST);
- $perm = $acl->get();
-
- $resource_id = argv(2);
-
- if(! strlen($albname))
- $albname = datetime_convert('UTC',date_default_timezone_get(),'now', 'Y');
-
-
- if((x($_POST,'rotate') !== false) &&
- ( (intval($_POST['rotate']) == 1) || (intval($_POST['rotate']) == 2) )) {
- logger('rotate');
-
- $r = q("select * from photo where `resource_id` = '%s' and uid = %d and scale = 0 limit 1",
- dbesc($resource_id),
- intval($page_owner_uid)
- );
- if(count($r)) {
- $d = (($r[0]['os_storage']) ? @file_get_contents($r[0]['data']) : dbunescbin($r[0]['data']));
- $ph = photo_factory($d, $r[0]['type']);
- if($ph->is_valid()) {
- $rotate_deg = ( (intval($_POST['rotate']) == 1) ? 270 : 90 );
- $ph->rotate($rotate_deg);
-
- $width = $ph->getWidth();
- $height = $ph->getHeight();
-
- if(intval($r[0]['os_storage'])) {
- @file_put_contents($r[0]['data'],$ph->imageString());
- $data = $r[0]['data'];
- $fsize = @filesize($r[0]['data']);
- q("update attach set filesize = %d where hash = '%s' and uid = %d limit 1",
- intval($fsize),
- dbesc($resource_id),
- intval($page_owner_uid)
- );
- }
- else {
- $data = $ph->imageString();
- $fsize = strlen($data);
- }
-
- $x = q("update photo set data = '%s', `size` = %d, height = %d, width = %d where `resource_id` = '%s' and uid = %d and scale = 0",
- dbescbin($data),
- intval($fsize),
- intval($height),
- intval($width),
- dbesc($resource_id),
- intval($page_owner_uid)
- );
-
- if($width > 1024 || $height > 1024)
- $ph->scaleImage(1024);
-
- $width = $ph->getWidth();
- $height = $ph->getHeight();
-
- $x = q("update photo set data = '%s', height = %d, width = %d where `resource_id` = '%s' and uid = %d and scale = 1",
- dbescbin($ph->imageString()),
- intval($height),
- intval($width),
- dbesc($resource_id),
- intval($page_owner_uid)
- );
-
-
- if($width > 640 || $height > 640)
- $ph->scaleImage(640);
-
- $width = $ph->getWidth();
- $height = $ph->getHeight();
-
- $x = q("update photo set data = '%s', height = %d, width = %d where `resource_id` = '%s' and uid = %d and scale = 2",
- dbescbin($ph->imageString()),
- intval($height),
- intval($width),
- dbesc($resource_id),
- intval($page_owner_uid)
- );
-
-
- if($width > 320 || $height > 320)
- $ph->scaleImage(320);
-
- $width = $ph->getWidth();
- $height = $ph->getHeight();
-
- $x = q("update photo set data = '%s', height = %d, width = %d where `resource_id` = '%s' and uid = %d and scale = 3",
- dbescbin($ph->imageString()),
- intval($height),
- intval($width),
- dbesc($resource_id),
- intval($page_owner_uid)
- );
- }
- }
- }
-
- $p = q("SELECT type, is_nsfw, description, resource_id, scale, allow_cid, allow_gid, deny_cid, deny_gid FROM photo WHERE resource_id = '%s' AND uid = %d ORDER BY scale DESC",
- dbesc($resource_id),
- intval($page_owner_uid)
- );
- if($p) {
- $ext = $phototypes[$p[0]['type']];
-
- $r = q("UPDATE `photo` SET `description` = '%s', `allow_cid` = '%s', `allow_gid` = '%s', `deny_cid` = '%s', `deny_gid` = '%s' WHERE `resource_id` = '%s' AND `uid` = %d",
- dbesc($desc),
- dbesc($perm['allow_cid']),
- dbesc($perm['allow_gid']),
- dbesc($perm['deny_cid']),
- dbesc($perm['deny_gid']),
- dbesc($resource_id),
- intval($page_owner_uid)
- );
- }
-
- $item_private = (($str_contact_allow || $str_group_allow || $str_contact_deny || $str_group_deny) ? true : false);
-
- $old_is_nsfw = $p[0]['is_nsfw'];
- if($old_is_nsfw != $is_nsfw) {
- $r = q("update photo set is_nsfw = %d where resource_id = '%s' and uid = %d",
- intval($is_nsfw),
- dbesc($resource_id),
- intval($page_owner_uid)
- );
- }
-
- /* Don't make the item visible if the only change was the album name */
-
- $visibility = 0;
- if($p[0]['description'] !== $desc || strlen($rawtags))
- $visibility = 1;
-
- if(! $item_id) {
- $item_id = photos_create_item(App::$data['channel'],get_observer_hash(),$p[0],$visibility);
-
- }
-
- if($item_id) {
- $r = q("SELECT * FROM `item` WHERE `id` = %d AND `uid` = %d LIMIT 1",
- intval($item_id),
- intval($page_owner_uid)
- );
-
- if($r) {
- $old_tag = $r[0]['tag'];
- $old_inform = $r[0]['inform'];
- }
- }
-
-
- // make sure the linked item has the same permissions as the photo regardless of any other changes
- $x = q("update item set allow_cid = '%s', allow_gid = '%s', deny_cid = '%s', deny_gid = '%s', item_private = %d
- where id = %d",
- dbesc($perm['allow_cid']),
- dbesc($perm['allow_gid']),
- dbesc($perm['deny_cid']),
- dbesc($perm['deny_gid']),
- intval($acl->is_private()),
- intval($item_id)
- );
-
- // make sure the attach has the same permissions as the photo regardless of any other changes
- $x = q("update attach set allow_cid = '%s', allow_gid = '%s', deny_cid = '%s', deny_gid = '%s' where hash = '%s' and uid = %d and is_photo = 1",
- dbesc($perm['allow_cid']),
- dbesc($perm['allow_gid']),
- dbesc($perm['deny_cid']),
- dbesc($perm['deny_gid']),
- dbesc($resource_id),
- intval($page_owner_uid)
- );
-
-
-
- if(strlen($rawtags)) {
-
- $str_tags = '';
- $inform = '';
-
- // if the new tag doesn't have a namespace specifier (@foo or #foo) give it a mention
-
- $x = substr($rawtags,0,1);
- if($x !== '@' && $x !== '#')
- $rawtags = '@' . $rawtags;
-
- require_once('include/text.php');
- $profile_uid = App::$profile['profile_uid'];
-
- $results = linkify_tags($a, $rawtags, (local_channel()) ? local_channel() : $profile_uid);
-
- $success = $results['success'];
- $post_tags = array();
-
- foreach($results as $result) {
- $success = $result['success'];
- if($success['replaced']) {
- $post_tags[] = array(
- 'uid' => $profile_uid,
- 'type' => $success['termtype'],
- 'otype' => TERM_OBJ_POST,
- 'term' => $success['term'],
- 'url' => $success['url']
- );
- }
- }
-
- $r = q("select * from item where id = %d and uid = %d limit 1",
- intval($item_id),
- intval($page_owner_uid)
- );
-
- if($r) {
- $r = fetch_post_tags($r,true);
- $datarray = $r[0];
- if($post_tags) {
- if((! array_key_exists('term',$datarray)) || (! is_array($datarray['term'])))
- $datarray['term'] = $post_tags;
- else
- $datarray['term'] = array_merge($datarray['term'],$post_tags);
- }
- item_store_update($datarray,$execflag);
- }
-
- }
-
- goaway(z_root() . '/' . $_SESSION['photo_return']);
- return; // NOTREACHED
-
- $sync = attach_export_data(App::$data['channel'],$resource_id);
-
- if($sync)
- build_sync_packet($page_owner_uid,array('file' => array($sync)));
-
- }
-
-
- /**
- * default post action - upload a photo
- */
-
- $channel = App::$data['channel'];
- $observer = App::$data['observer'];
-
- $_REQUEST['source'] = 'photos';
- require_once('include/attach.php');
-
- if(! local_channel()) {
- $_REQUEST['contact_allow'] = expand_acl($channel['channel_allow_cid']);
- $_REQUEST['group_allow'] = expand_acl($channel['channel_allow_gid']);
- $_REQUEST['contact_deny'] = expand_acl($channel['channel_deny_cid']);
- $_REQUEST['group_deny'] = expand_acl($channel['channel_deny_gid']);
- }
-
- $r = attach_store($channel,get_observer_hash(), '', $_REQUEST);
-
- if(! $r['success']) {
- notice($r['message'] . EOL);
- }
-
- if($_REQUEST['newalbum'])
- goaway(z_root() . '/photos/' . App::$data['channel']['channel_address'] . '/album/' . bin2hex($_REQUEST['newalbum']));
- else
- goaway(z_root() . '/photos/' . App::$data['channel']['channel_address'] . '/album/' . bin2hex(datetime_convert('UTC',date_default_timezone_get(),'now', 'Y')));
-
-}
-
-
-
-function photos_content(&$a) {
-
- // URLs:
- // photos/name
- // photos/name/album/xxxxx (xxxxx is album name)
- // photos/name/image/xxxxx
-
-
- if((get_config('system','block_public')) && (! local_channel()) && (! remote_channel())) {
- notice( t('Public access denied.') . EOL);
- return;
- }
-
- $unsafe = ((array_key_exists('unsafe',$_REQUEST) && $_REQUEST['unsafe']) ? 1 : 0);
-
- require_once('include/bbcode.php');
- require_once('include/security.php');
- require_once('include/conversation.php');
-
- if(! x(App::$data,'channel')) {
- notice( t('No photos selected') . EOL );
- return;
- }
-
- $ph = photo_factory('');
- $phototypes = $ph->supportedTypes();
-
- $_SESSION['photo_return'] = App::$cmd;
-
- //
- // Parse arguments
- //
-
- $can_comment = perm_is_allowed(App::$profile['profile_uid'],get_observer_hash(),'post_comments');
-
- if(argc() > 3) {
- $datatype = argv(2);
- $datum = argv(3);
- } else {
- if(argc() > 2) {
- $datatype = argv(2);
- $datum = '';
- }
- else
- $datatype = 'summary';
- }
-
- if(argc() > 4)
- $cmd = argv(4);
- else
- $cmd = 'view';
-
- //
- // Setup permissions structures
- //
-
- $can_post = false;
- $visitor = 0;
-
-
- $owner_uid = App::$data['channel']['channel_id'];
- $owner_aid = App::$data['channel']['channel_account_id'];
-
- $observer = App::get_observer();
-
- $can_post = perm_is_allowed($owner_uid,$observer['xchan_hash'],'write_storage');
- $can_view = perm_is_allowed($owner_uid,$observer['xchan_hash'],'view_storage');
-
- if(! $can_view) {
- notice( t('Access to this item is restricted.') . EOL);
- return;
- }
-
- $sql_extra = permissions_sql($owner_uid);
-
- $o = "";
-
- $o .= "<script> var profile_uid = " . App::$profile['profile_uid']
- . "; var netargs = '?f='; var profile_page = " . App::$pager['page'] . "; </script>\r\n";
-
- // tabs
-
- $_is_owner = (local_channel() && (local_channel() == $owner_uid));
- $o .= profile_tabs($a,$_is_owner, App::$data['channel']['channel_address']);
-
- /**
- * Display upload form
- */
-
- if( $can_post) {
-
- $uploader = '';
-
- $ret = array('post_url' => z_root() . '/photos/' . App::$data['channel']['channel_address'],
- 'addon_text' => $uploader,
- 'default_upload' => true);
-
- call_hooks('photo_upload_form',$ret);
-
- /* Show space usage */
-
- $r = q("select sum(size) as total from photo where aid = %d and scale = 0 ",
- intval(App::$data['channel']['channel_account_id'])
- );
-
-
- $limit = service_class_fetch(App::$data['channel']['channel_id'],'photo_upload_limit');
- if($limit !== false) {
- $usage_message = sprintf( t("%1$.2f MB of %2$.2f MB photo storage used."), $r[0]['total'] / 1024000, $limit / 1024000 );
- }
- else {
- $usage_message = sprintf( t('%1$.2f MB photo storage used.'), $r[0]['total'] / 1024000 );
- }
-
- if($_is_owner) {
- $channel = App::get_channel();
-
- $acl = new Zotlabs\Access\AccessList($channel);
- $channel_acl = $acl->get();
-
- $lockstate = (($acl->is_private()) ? 'lock' : 'unlock');
- }
-
- $aclselect = (($_is_owner) ? populate_acl($channel_acl,false) : '');
-
- // this is wrong but is to work around an issue with js_upload wherein it chokes if these variables
- // don't exist. They really should be set to a parseable representation of the channel's default permissions
- // which can be processed by getSelected()
-
- if(! $aclselect) {
- $aclselect = '<input id="group_allow" type="hidden" name="allow_gid[]" value="" /><input id="contact_allow" type="hidden" name="allow_cid[]" value="" /><input id="group_deny" type="hidden" name="deny_gid[]" value="" /><input id="contact_deny" type="hidden" name="deny_cid[]" value="" />';
- }
-
- $selname = (($datum) ? hex2bin($datum) : '');
-
- $albums = ((array_key_exists('albums', App::$data)) ? App::$data['albums'] : photos_albums_list(App::$data['channel'],App::$data['observer']));
-
- if(! $selname) {
- $def_album = get_pconfig(App::$data['channel']['channel_id'],'system','photo_path');
- if($def_album) {
- $selname = filepath_macro($def_album);
- $albums['album'][] = array('text' => $selname);
- }
- }
-
- $tpl = get_markup_template('photos_upload.tpl');
- $upload_form = replace_macros($tpl,array(
- '$pagename' => t('Upload Photos'),
- '$sessid' => session_id(),
- '$usage' => $usage_message,
- '$nickname' => App::$data['channel']['channel_address'],
- '$newalbum_label' => t('Enter an album name'),
- '$newalbum_placeholder' => t('or select an existing album (doubleclick)'),
- '$visible' => array('visible', t('Create a status post for this upload'), 0,'', array(t('No'), t('Yes')), 'onclick="showHideBodyTextarea();"'),
- '$caption' => array('description', t('Caption (optional):')),
- '$body' => array('body', t('Description (optional):'),'', 'Description will only appear in the status post'),
- '$albums' => $albums['albums'],
- '$selname' => $selname,
- '$permissions' => t('Permissions'),
- '$aclselect' => $aclselect,
- '$lockstate' => $lockstate,
- '$uploader' => $ret['addon_text'],
- '$default' => (($ret['default_upload']) ? true : false),
- '$uploadurl' => $ret['post_url'],
- '$submit' => t('Submit')
-
- ));
-
- }
-
- //
- // dispatch request
- //
-
- /*
- * Display a single photo album
- */
-
- if($datatype === 'album') {
-
- if(strlen($datum)) {
- if((strlen($datum) & 1) || (! ctype_xdigit($datum))) {
- notice( t('Album name could not be decoded') . EOL);
- logger('mod_photos: illegal album encoding: ' . $datum);
- $datum = '';
- }
- }
-
- $album = (($datum) ? hex2bin($datum) : '');
-
-
- App::$page['htmlhead'] .= "\r\n" . '<link rel="alternate" type="application/json+oembed" href="' . z_root() . '/oep?f=&url=' . urlencode(z_root() . '/' . App::$cmd) . '" title="oembed" />' . "\r\n";
-
-
- $r = q("SELECT `resource_id`, max(`scale`) AS `scale` FROM `photo` WHERE `uid` = %d AND `album` = '%s'
- AND `scale` <= 4 and photo_usage IN ( %d, %d ) and is_nsfw = %d $sql_extra GROUP BY `resource_id`",
- intval($owner_uid),
- dbesc($album),
- intval(PHOTO_NORMAL),
- intval(PHOTO_PROFILE),
- intval($unsafe)
- );
- if(count($r)) {
- App::set_pager_total(count($r));
- App::set_pager_itemspage(60);
- } else {
- goaway(z_root() . '/photos/' . App::$data['channel']['channel_address']);
- }
-
- if($_GET['order'] === 'posted')
- $order = 'ASC';
- else
- $order = 'DESC';
-
-
- $r = q("SELECT p.resource_id, p.id, p.filename, p.type, p.scale, p.description, p.created FROM photo p INNER JOIN
- (SELECT resource_id, max(scale) scale FROM photo WHERE uid = %d AND album = '%s' AND scale <= 4 AND photo_usage IN ( %d, %d ) and is_nsfw = %d $sql_extra GROUP BY resource_id) ph
- ON (p.resource_id = ph.resource_id AND p.scale = ph.scale)
- ORDER BY created $order LIMIT %d OFFSET %d",
- intval($owner_uid),
- dbesc($album),
- intval(PHOTO_NORMAL),
- intval(PHOTO_PROFILE),
- intval($unsafe),
- intval(App::$pager['itemspage']),
- intval(App::$pager['start'])
- );
-
- //edit album name
- $album_edit = null;
- if(($album !== t('Profile Photos')) && ($album !== 'Profile Photos') && ($album !== 'Contact Photos') && ($album !== t('Contact Photos'))) {
- if($can_post) {
- $album_e = $album;
- $albums = ((array_key_exists('albums', App::$data)) ? App::$data['albums'] : photos_albums_list(App::$data['channel'],App::$data['observer']));
-
- // @fixme - syncronise actions with DAV
-
-// $edit_tpl = get_markup_template('album_edit.tpl');
-// $album_edit = replace_macros($edit_tpl,array(
-// '$nametext' => t('Enter a new album name'),
-// '$name_placeholder' => t('or select an existing one (doubleclick)'),
-// '$nickname' => App::$data['channel']['channel_address'],
-// '$album' => $album_e,
-// '$albums' => $albums['albums'],
-// '$hexalbum' => bin2hex($album),
-// '$submit' => t('Submit'),
-// '$dropsubmit' => t('Delete Album')
-// ));
-
- }
- }
-
- if($_GET['order'] === 'posted')
- $order = array(t('Show Newest First'), z_root() . '/photos/' . App::$data['channel']['channel_address'] . '/album/' . bin2hex($album));
- else
- $order = array(t('Show Oldest First'), z_root() . '/photos/' . App::$data['channel']['channel_address'] . '/album/' . bin2hex($album) . '?f=&order=posted');
-
- $photos = array();
- if(count($r)) {
- $twist = 'rotright';
- foreach($r as $rr) {
-
- if($twist == 'rotright')
- $twist = 'rotleft';
- else
- $twist = 'rotright';
-
- $ext = $phototypes[$rr['type']];
-
- $imgalt_e = $rr['filename'];
- $desc_e = $rr['description'];
-
- $imagelink = (z_root() . '/photos/' . App::$data['channel']['channel_address'] . '/image/' . $rr['resource_id']
- . (($_GET['order'] === 'posted') ? '?f=&order=posted' : ''));
-
- $photos[] = array(
- 'id' => $rr['id'],
- 'twist' => ' ' . $twist . rand(2,4),
- 'link' => $imagelink,
- 'title' => t('View Photo'),
- 'src' => z_root() . '/photo/' . $rr['resource_id'] . '-' . $rr['scale'] . '.' .$ext,
- 'alt' => $imgalt_e,
- 'desc'=> $desc_e,
- 'ext' => $ext,
- 'hash'=> $rr['resource_id'],
- 'unknown' => t('Unknown')
- );
- }
- }
-
- if($_REQUEST['aj']) {
- if($photos) {
- $o = replace_macros(get_markup_template('photosajax.tpl'),array(
- '$photos' => $photos,
- '$album_id' => bin2hex($album)
- ));
- }
- else {
- $o = '<div id="content-complete"></div>';
- }
- echo $o;
- killme();
- }
- else {
- $o .= "<script> var page_query = '" . $_GET['q'] . "'; var extra_args = '" . extra_query_args() . "' ; </script>";
- $tpl = get_markup_template('photo_album.tpl');
- $o .= replace_macros($tpl, array(
- '$photos' => $photos,
- '$album' => $album,
- '$album_id' => bin2hex($album),
- '$album_edit' => array(t('Edit Album'), $album_edit),
- '$can_post' => $can_post,
- '$upload' => array(t('Upload'), z_root() . '/photos/' . App::$data['channel']['channel_address'] . '/upload/' . bin2hex($album)),
- '$order' => $order,
- '$upload_form' => $upload_form,
- '$usage' => $usage_message
- ));
-
- }
-
- if((! $photos) && ($_REQUEST['aj'])) {
- $o .= '<div id="content-complete"></div>';
- echo $o;
- killme();
- }
-
-// $o .= paginate($a);
-
- return $o;
-
- }
-
- /**
- * Display one photo
- */
-
- if($datatype === 'image') {
-
- App::$page['htmlhead'] .= "\r\n" . '<link rel="alternate" type="application/json+oembed" href="' . z_root() . '/oep?f=&url=' . urlencode(z_root() . '/' . App::$cmd) . '" title="oembed" />' . "\r\n";
-
- // fetch image, item containing image, then comments
-
- $ph = q("SELECT id,aid,uid,xchan,resource_id,created,edited,title,`description`,album,filename,`type`,height,width,`size`,scale,photo_usage,is_nsfw,allow_cid,allow_gid,deny_cid,deny_gid FROM `photo` WHERE `uid` = %d AND `resource_id` = '%s'
- $sql_extra ORDER BY `scale` ASC ",
- intval($owner_uid),
- dbesc($datum)
- );
-
- if(! $ph) {
-
- /* Check again - this time without specifying permissions */
-
- $ph = q("SELECT id FROM photo WHERE uid = %d AND resource_id = '%s' LIMIT 1",
- intval($owner_uid),
- dbesc($datum)
- );
- if($ph)
- notice( t('Permission denied. Access to this item may be restricted.') . EOL);
- else
- notice( t('Photo not available') . EOL );
- return;
- }
-
-
-
- $prevlink = '';
- $nextlink = '';
-
- if($_GET['order'] === 'posted')
- $order = 'ASC';
- else
- $order = 'DESC';
-
-
- $prvnxt = q("SELECT `resource_id` FROM `photo` WHERE `album` = '%s' AND `uid` = %d AND `scale` = 0
- $sql_extra ORDER BY `created` $order ",
- dbesc($ph[0]['album']),
- intval($owner_uid)
- );
-
- if(count($prvnxt)) {
- for($z = 0; $z < count($prvnxt); $z++) {
- if($prvnxt[$z]['resource_id'] == $ph[0]['resource_id']) {
- $prv = $z - 1;
- $nxt = $z + 1;
- if($prv < 0)
- $prv = count($prvnxt) - 1;
- if($nxt >= count($prvnxt))
- $nxt = 0;
- break;
- }
- }
-
- $prevlink = z_root() . '/photos/' . App::$data['channel']['channel_address'] . '/image/' . $prvnxt[$prv]['resource_id'] . (($_GET['order'] === 'posted') ? '?f=&order=posted' : '');
- $nextlink = z_root() . '/photos/' . App::$data['channel']['channel_address'] . '/image/' . $prvnxt[$nxt]['resource_id'] . (($_GET['order'] === 'posted') ? '?f=&order=posted' : '');
- }
-
-
- if(count($ph) == 1)
- $hires = $lores = $ph[0];
- if(count($ph) > 1) {
- if($ph[1]['scale'] == 2) {
- // original is 640 or less, we can display it directly
- $hires = $lores = $ph[0];
- }
- else {
- $hires = $ph[0];
- $lores = $ph[1];
- }
- }
-
- $album_link = z_root() . '/photos/' . App::$data['channel']['channel_address'] . '/album/' . bin2hex($ph[0]['album']);
- $tools = Null;
- $lock = Null;
-
- if($can_post && ($ph[0]['uid'] == $owner_uid)) {
- $tools = array(
- 'profile'=>array(z_root() . '/profile_photo/use/'.$ph[0]['resource_id'], t('Use as profile photo')),
- 'cover'=>array(z_root() . '/cover_photo/use/'.$ph[0]['resource_id'], t('Use as cover photo')),
- );
- }
-
- // lockstate
- $lockstate = ( ( (strlen($ph[0]['allow_cid']) || strlen($ph[0]['allow_gid'])
- || strlen($ph[0]['deny_cid']) || strlen($ph[0]['deny_gid'])) )
- ? array('lock', t('Private Photo'))
- : array('unlock', Null));
-
- App::$page['htmlhead'] .= '<script>$(document).keydown(function(event) {' . "\n";
- if($prevlink)
- App::$page['htmlhead'] .= 'if(event.ctrlKey && event.keyCode == 37) { event.preventDefault(); window.location.href = \'' . $prevlink . '\'; }' . "\n";
- if($nextlink)
- App::$page['htmlhead'] .= 'if(event.ctrlKey && event.keyCode == 39) { event.preventDefault(); window.location.href = \'' . $nextlink . '\'; }' . "\n";
- App::$page['htmlhead'] .= '});</script>';
-
- if($prevlink)
- $prevlink = array($prevlink, t('Previous'));
-
- $photo = array(
- 'href' => z_root() . '/photo/' . $hires['resource_id'] . '-' . $hires['scale'] . '.' . $phototypes[$hires['type']],
- 'title'=> t('View Full Size'),
- 'src' => z_root() . '/photo/' . $lores['resource_id'] . '-' . $lores['scale'] . '.' . $phototypes[$lores['type']] . '?f=&_u=' . datetime_convert('','','','ymdhis')
- );
-
- if($nextlink)
- $nextlink = array($nextlink, t('Next'));
-
-
- // Do we have an item for this photo?
-
- $linked_items = q("SELECT * FROM item WHERE resource_id = '%s' and resource_type = 'photo'
- $sql_extra LIMIT 1",
- dbesc($datum)
- );
-
- $map = null;
-
- if($linked_items) {
-
- xchan_query($linked_items);
- $linked_items = fetch_post_tags($linked_items,true);
-
- $link_item = $linked_items[0];
- $item_normal = item_normal();
-
- $r = q("select * from item where parent_mid = '%s'
- $item_normal and uid = %d $sql_extra ",
- dbesc($link_item['mid']),
- intval($link_item['uid'])
-
- );
-
- if($r) {
- xchan_query($r);
- $r = fetch_post_tags($r,true);
- $r = conv_sort($r,'commented');
- }
-
- $tags = array();
- if($link_item['term']) {
- $cnt = 0;
- foreach($link_item['term'] as $t) {
- $tags[$cnt] = array(0 => format_term_for_display($t));
- if($can_post && ($ph[0]['uid'] == $owner_uid)) {
- $tags[$cnt][1] = 'tagrm/drop/' . $link_item['id'] . '/' . bin2hex($t['term']); //?f=&item=' . $link_item['id'];
- $tags[$cnt][2] = t('Remove');
- }
- $cnt ++;
- }
- }
-
- if((local_channel()) && (local_channel() == $link_item['uid'])) {
- q("UPDATE `item` SET item_unseen = 0 WHERE parent = %d and uid = %d and item_unseen = 1",
- intval($link_item['parent']),
- intval(local_channel())
- );
- }
-
- if($link_item['coord']) {
- $map = generate_map($link_item['coord']);
- }
- }
-
-// logger('mod_photo: link_item' . print_r($link_item,true));
-
- // FIXME - remove this when we move to conversation module
-
- $r = $r[0]['children'];
-
- $edit = null;
- if($can_post) {
- $album_e = $ph[0]['album'];
- $caption_e = $ph[0]['description'];
- $aclselect_e = (($_is_owner) ? populate_acl($ph[0]) : '');
- $albums = ((array_key_exists('albums', App::$data)) ? App::$data['albums'] : photos_albums_list(App::$data['channel'],App::$data['observer']));
-
- $_SESSION['album_return'] = bin2hex($ph[0]['album']);
-
- $edit = array(
- 'edit' => t('Edit photo'),
- 'id' => $link_item['id'],
- 'rotatecw' => t('Rotate CW (right)'),
- 'rotateccw' => t('Rotate CCW (left)'),
- 'albums' => $albums['albums'],
- 'album' => $album_e,
- 'newalbum_label' => t('Enter a new album name'),
- 'newalbum_placeholder' => t('or select an existing one (doubleclick)'),
- 'nickname' => App::$data['channel']['channel_address'],
- 'resource_id' => $ph[0]['resource_id'],
- 'capt_label' => t('Caption'),
- 'caption' => $caption_e,
- 'tag_label' => t('Add a Tag'),
- 'permissions' => t('Permissions'),
- 'aclselect' => $aclselect_e,
- 'lockstate' => $lockstate[0],
- 'help_tags' => t('Example: @bob, @Barbara_Jensen, @jim@example.com'),
- 'item_id' => ((count($linked_items)) ? $link_item['id'] : 0),
- 'adult_enabled' => feature_enabled($owner_uid,'adult_photo_flagging'),
- 'adult' => array('adult',t('Flag as adult in album view'), intval($ph[0]['is_nsfw']),''),
- 'submit' => t('Submit'),
- 'delete' => t('Delete Photo')
- );
- }
-
- if(count($linked_items)) {
-
- $cmnt_tpl = get_markup_template('comment_item.tpl');
- $tpl = get_markup_template('photo_item.tpl');
- $return_url = App::$cmd;
-
- $like_tpl = get_markup_template('like_noshare.tpl');
-
- $likebuttons = '';
-
- if($can_post || $can_comment) {
- $likebuttons = array(
- 'id' => $link_item['id'],
- 'likethis' => t("I like this \x28toggle\x29"),
- 'nolike' => t("I don't like this \x28toggle\x29"),
- 'share' => t('Share'),
- 'wait' => t('Please wait')
- );
- }
-
- $comments = '';
- if(! count($r)) {
- if($can_post || $can_comment) {
- $commentbox = replace_macros($cmnt_tpl,array(
- '$return_path' => '',
- '$mode' => 'photos',
- '$jsreload' => $return_url,
- '$type' => 'wall-comment',
- '$id' => $link_item['id'],
- '$parent' => $link_item['id'],
- '$profile_uid' => $owner_uid,
- '$mylink' => $observer['xchan_url'],
- '$mytitle' => t('This is you'),
- '$myphoto' => $observer['xchan_photo_s'],
- '$comment' => t('Comment'),
- '$submit' => t('Submit'),
- '$preview' => t('Preview'),
- '$ww' => '',
- '$feature_encrypt' => false
- ));
- }
- }
-
- $alike = array();
- $dlike = array();
-
- $like = '';
- $dislike = '';
-
- $conv_responses = array(
- 'like' => array('title' => t('Likes','title')),'dislike' => array('title' => t('Dislikes','title')),
- 'agree' => array('title' => t('Agree','title')),'disagree' => array('title' => t('Disagree','title')), 'abstain' => array('title' => t('Abstain','title')),
- 'attendyes' => array('title' => t('Attending','title')), 'attendno' => array('title' => t('Not attending','title')), 'attendmaybe' => array('title' => t('Might attend','title'))
- );
-
-
-
-
- if($r) {
-
- foreach($r as $item) {
- builtin_activity_puller($item, $conv_responses);
- }
-
-
- $like_count = ((x($alike,$link_item['mid'])) ? $alike[$link_item['mid']] : '');
- $like_list = ((x($alike,$link_item['mid'])) ? $alike[$link_item['mid'] . '-l'] : '');
- if (count($like_list) > MAX_LIKERS) {
- $like_list_part = array_slice($like_list, 0, MAX_LIKERS);
- array_push($like_list_part, '<a href="#" data-toggle="modal" data-target="#likeModal-' . $this->get_id() . '"><b>' . t('View all') . '</b></a>');
- } else {
- $like_list_part = '';
- }
- $like_button_label = tt('Like','Likes',$like_count,'noun');
-
- //if (feature_enabled($conv->get_profile_owner(),'dislike')) {
- $dislike_count = ((x($dlike,$link_item['mid'])) ? $dlike[$link_item['mid']] : '');
- $dislike_list = ((x($dlike,$link_item['mid'])) ? $dlike[$link_item['mid'] . '-l'] : '');
- $dislike_button_label = tt('Dislike','Dislikes',$dislike_count,'noun');
- if (count($dislike_list) > MAX_LIKERS) {
- $dislike_list_part = array_slice($dislike_list, 0, MAX_LIKERS);
- array_push($dislike_list_part, '<a href="#" data-toggle="modal" data-target="#dislikeModal-' . $this->get_id() . '"><b>' . t('View all') . '</b></a>');
- } else {
- $dislike_list_part = '';
- }
- //}
-
-
- $like = ((isset($alike[$link_item['mid']])) ? format_like($alike[$link_item['mid']],$alike[$link_item['mid'] . '-l'],'like',$link_item['mid']) : '');
- $dislike = ((isset($dlike[$link_item['mid']])) ? format_like($dlike[$link_item['mid']],$dlike[$link_item['mid'] . '-l'],'dislike',$link_item['mid']) : '');
-
- // display comments
-
- foreach($r as $item) {
- $comment = '';
- $template = $tpl;
- $sparkle = '';
-
- if(((activity_match($item['verb'],ACTIVITY_LIKE)) || (activity_match($item['verb'],ACTIVITY_DISLIKE))) && ($item['id'] != $item['parent']))
- continue;
-
- $redirect_url = z_root() . '/redir/' . $item['cid'] ;
-
-
- $profile_url = zid($item['author']['xchan_url']);
- $sparkle = '';
-
-
- $profile_name = $item['author']['xchan_name'];
- $profile_avatar = $item['author']['xchan_photo_m'];
-
- $profile_link = $profile_url;
-
- $drop = '';
-
- if($observer['xchan_hash'] === $item['author_xchan'] || $observer['xchan_hash'] === $item['owner_xchan'])
- $drop = replace_macros(get_markup_template('photo_drop.tpl'), array('$id' => $item['id'], '$delete' => t('Delete')));
-
-
- $name_e = $profile_name;
- $title_e = $item['title'];
- unobscure($item);
- $body_e = prepare_text($item['body'],$item['mimetype']);
-
- $comments .= replace_macros($template,array(
- '$id' => $item['id'],
- '$mode' => 'photos',
- '$profile_url' => $profile_link,
- '$name' => $name_e,
- '$thumb' => $profile_avatar,
- '$sparkle' => $sparkle,
- '$title' => $title_e,
- '$body' => $body_e,
- '$ago' => relative_date($item['created']),
- '$indent' => (($item['parent'] != $item['id']) ? ' comment' : ''),
- '$drop' => $drop,
- '$comment' => $comment
- ));
-
- }
-
- if($can_post || $can_comment) {
- $commentbox = replace_macros($cmnt_tpl,array(
- '$return_path' => '',
- '$jsreload' => $return_url,
- '$type' => 'wall-comment',
- '$id' => $link_item['id'],
- '$parent' => $link_item['id'],
- '$profile_uid' => $owner_uid,
- '$mylink' => $observer['xchan_url'],
- '$mytitle' => t('This is you'),
- '$myphoto' => $observer['xchan_photo_s'],
- '$comment' => t('Comment'),
- '$submit' => t('Submit'),
- '$ww' => ''
- ));
- }
-
- }
- $paginate = paginate($a);
- }
-
- $album_e = array($album_link,$ph[0]['album']);
- $like_e = $like;
- $dislike_e = $dislike;
-
-
- $response_verbs = array('like');
- if(feature_enabled($owner_uid,'dislike'))
- $response_verbs[] = 'dislike';
-
-
- $responses = get_responses($conv_responses,$response_verbs,'',$link_item);
-
- $photo_tpl = get_markup_template('photo_view.tpl');
- $o .= replace_macros($photo_tpl, array(
- '$id' => $ph[0]['id'],
- '$album' => $album_e,
- '$tools' => $tools,
- '$lock' => $lockstate[1],
- '$photo' => $photo,
- '$prevlink' => $prevlink,
- '$nextlink' => $nextlink,
- '$desc' => $ph[0]['description'],
- '$filename' => $ph[0]['filename'],
- '$unknown' => t('Unknown'),
- '$tag_hdr' => t('In This Photo:'),
- '$tags' => $tags,
- 'responses' => $responses,
- '$edit' => $edit,
- '$map' => $map,
- '$map_text' => t('Map'),
- '$likebuttons' => $likebuttons,
- '$like' => $like_e,
- '$dislike' => $dislike_e,
- '$like_count' => $like_count,
- '$like_list' => $like_list,
- '$like_list_part' => $like_list_part,
- '$like_button_label' => $like_button_label,
- '$like_modal_title' => t('Likes','noun'),
- '$dislike_modal_title' => t('Dislikes','noun'),
- '$dislike_count' => $dislike_count, //((feature_enabled($conv->get_profile_owner(),'dislike')) ? $dislike_count : ''),
- '$dislike_list' => $dislike_list, //((feature_enabled($conv->get_profile_owner(),'dislike')) ? $dislike_list : ''),
- '$dislike_list_part' => $dislike_list_part, //((feature_enabled($conv->get_profile_owner(),'dislike')) ? $dislike_list_part : ''),
- '$dislike_button_label' => $dislike_button_label, //((feature_enabled($conv->get_profile_owner(),'dislike')) ? $dislike_button_label : ''),
- '$modal_dismiss' => t('Close'),
- '$comments' => $comments,
- '$commentbox' => $commentbox,
- '$paginate' => $paginate,
- ));
-
- App::$data['photo_html'] = $o;
-
- return $o;
- }
-
- // Default - show recent photos with upload link (if applicable)
- //$o = '';
-
- App::$page['htmlhead'] .= "\r\n" . '<link rel="alternate" type="application/json+oembed" href="' . z_root() . '/oep?f=&url=' . urlencode(z_root() . '/' . App::$cmd) . '" title="oembed" />' . "\r\n";
-
-
- $r = q("SELECT `resource_id`, max(`scale`) AS `scale` FROM `photo` WHERE `uid` = %d AND `album` != '%s' AND `album` != '%s'
- and photo_usage in ( %d, %d ) and is_nsfw = %d $sql_extra GROUP BY `resource_id`",
- intval(App::$data['channel']['channel_id']),
- dbesc('Contact Photos'),
- dbesc( t('Contact Photos')),
- intval(PHOTO_NORMAL),
- intval(PHOTO_PROFILE),
- intval($unsafe)
- );
- if(count($r)) {
- App::set_pager_total(count($r));
- App::set_pager_itemspage(60);
- }
-
- $r = q("SELECT p.resource_id, p.id, p.filename, p.type, p.album, p.scale, p.created FROM photo p INNER JOIN
- (SELECT resource_id, max(scale) scale FROM photo
- WHERE uid=%d AND album != '%s' AND album != '%s'
- AND photo_usage IN ( %d, %d ) and is_nsfw = %d $sql_extra group by resource_id) ph
- ON (p.resource_id = ph.resource_id and p.scale = ph.scale) ORDER by p.created DESC LIMIT %d OFFSET %d",
- intval(App::$data['channel']['channel_id']),
- dbesc('Contact Photos'),
- dbesc( t('Contact Photos')),
- intval(PHOTO_NORMAL),
- intval(PHOTO_PROFILE),
- intval($unsafe),
- intval(App::$pager['itemspage']),
- intval(App::$pager['start'])
- );
-
-
-
- $photos = array();
- if(count($r)) {
- $twist = 'rotright';
- foreach($r as $rr) {
- if($twist == 'rotright')
- $twist = 'rotleft';
- else
- $twist = 'rotright';
- $ext = $phototypes[$rr['type']];
-
- if(App::get_template_engine() === 'internal') {
- $alt_e = template_escape($rr['filename']);
- $name_e = template_escape($rr['album']);
- }
- else {
- $alt_e = $rr['filename'];
- $name_e = $rr['album'];
- }
-
- $photos[] = array(
- 'id' => $rr['id'],
- 'twist' => ' ' . $twist . rand(2,4),
- 'link' => z_root() . '/photos/' . App::$data['channel']['channel_address'] . '/image/' . $rr['resource_id'],
- 'title' => t('View Photo'),
- 'src' => z_root() . '/photo/' . $rr['resource_id'] . '-' . ((($rr['scale']) == 6) ? 4 : $rr['scale']) . '.' . $ext,
- 'alt' => $alt_e,
- 'album' => array(
- 'link' => z_root() . '/photos/' . App::$data['channel']['channel_address'] . '/album/' . bin2hex($rr['album']),
- 'name' => $name_e,
- 'alt' => t('View Album'),
- ),
-
- );
- }
- }
-
- if($_REQUEST['aj']) {
- if($photos) {
- $o = replace_macros(get_markup_template('photosajax.tpl'),array(
- '$photos' => $photos,
- '$album_id' => bin2hex(t('Recent Photos'))
- ));
- }
- else {
- $o = '<div id="content-complete"></div>';
- }
- echo $o;
- killme();
- }
- else {
- $o .= "<script> var page_query = '" . $_GET['q'] . "'; var extra_args = '" . extra_query_args() . "' ; </script>";
- $tpl = get_markup_template('photos_recent.tpl');
- $o .= replace_macros($tpl, array(
- '$title' => t('Recent Photos'),
- '$album_id' => bin2hex(t('Recent Photos')),
- '$can_post' => $can_post,
- '$upload' => array(t('Upload'), z_root().'/photos/'.App::$data['channel']['channel_address'].'/upload'),
- '$photos' => $photos,
- '$upload_form' => $upload_form,
- '$usage' => $usage_message
- ));
-
- }
-
- if((! $photos) && ($_REQUEST['aj'])) {
- $o .= '<div id="content-complete"></div>';
- echo $o;
- killme();
- }
-
-// paginate($a);
- return $o;
-}
-
diff --git a/mod/ping.php b/mod/ping.php
deleted file mode 100644
index 32bc9753e..000000000
--- a/mod/ping.php
+++ /dev/null
@@ -1,491 +0,0 @@
-<?php
-/**
- * @file mod/ping.php
- *
- */
-
-require_once('include/bbcode.php');
-require_once('include/notify.php');
-
-/**
- * @brief do several updates when pinged.
- *
- * This function does several tasks. Whenever called it checks for new messages,
- * introductions, notifications, etc. and returns a json with the results.
- *
- * @param App &$a
- * @result JSON
- */
-
-function ping_init(&$a) {
-
- $result = array();
- $notifs = array();
-
- $result['notify'] = 0;
- $result['home'] = 0;
- $result['network'] = 0;
- $result['intros'] = 0;
- $result['mail'] = 0;
- $result['register'] = 0;
- $result['events'] = 0;
- $result['events_today'] = 0;
- $result['birthdays'] = 0;
- $result['birthdays_today'] = 0;
- $result['all_events'] = 0;
- $result['all_events_today'] = 0;
- $result['notice'] = array();
- $result['info'] = array();
-
- $t0 = dba_timer();
-
- header("content-type: application/json");
-
- $vnotify = false;
-
- $item_normal = item_normal();
-
- if(local_channel()) {
- $vnotify = get_pconfig(local_channel(),'system','vnotify');
- $evdays = intval(get_pconfig(local_channel(),'system','evdays'));
- $ob_hash = get_observer_hash();
- }
-
- // if unset show all visual notification types
- if($vnotify === false)
- $vnotify = (-1);
- if($evdays < 1)
- $evdays = 3;
-
- /**
- * If you have several windows open to this site and switch to a different channel
- * in one of them, the others may get into a confused state showing you a page or options
- * on that page which were only valid under the old identity. You session has changed.
- * Therefore we send a notification of this fact back to the browser where it is picked up
- * in javascript and which reloads the page it is on so that it is valid under the context
- * of the now current channel.
- */
-
- $result['invalid'] = ((intval($_GET['uid'])) && (intval($_GET['uid']) != local_channel()) ? 1 : 0);
-
- /**
- * Send all system messages (alerts) to the browser.
- * Some are marked as informational and some represent
- * errors or serious notifications. These typically
- * will popup on the current page (no matter what page it is)
- */
-
- if(x($_SESSION, 'sysmsg')){
- foreach ($_SESSION['sysmsg'] as $m){
- $result['notice'][] = array('message' => $m);
- }
- unset($_SESSION['sysmsg']);
- }
- if(x($_SESSION, 'sysmsg_info')){
- foreach ($_SESSION['sysmsg_info'] as $m){
- $result['info'][] = array('message' => $m);
- }
- unset($_SESSION['sysmsg_info']);
- }
- if(! ($vnotify & VNOTIFY_INFO))
- $result['info'] = array();
- if(! ($vnotify & VNOTIFY_ALERT))
- $result['notice'] = array();
-
-
- if(App::$install) {
- echo json_encode($result);
- killme();
- }
-
- /**
- * Update chat presence indication (if applicable)
- */
-
- if(get_observer_hash() && (! $result['invalid'])) {
- $r = q("select cp_id, cp_room from chatpresence where cp_xchan = '%s' and cp_client = '%s' and cp_room = 0 limit 1",
- dbesc(get_observer_hash()),
- dbesc($_SERVER['REMOTE_ADDR'])
- );
- $basic_presence = false;
- if($r) {
- $basic_presence = true;
- q("update chatpresence set cp_last = '%s' where cp_id = %d",
- dbesc(datetime_convert()),
- intval($r[0]['cp_id'])
- );
- }
- if(! $basic_presence) {
- q("insert into chatpresence ( cp_xchan, cp_last, cp_status, cp_client)
- values( '%s', '%s', '%s', '%s' ) ",
- dbesc(get_observer_hash()),
- dbesc(datetime_convert()),
- dbesc('online'),
- dbesc($_SERVER['REMOTE_ADDR'])
- );
- }
- }
-
- /**
- * Chatpresence continued... if somebody hasn't pinged recently, they've most likely left the page
- * and shouldn't count as online anymore. We allow an expection for bots.
- */
-
- q("delete from chatpresence where cp_last < %s - INTERVAL %s and cp_client != 'auto' ",
- db_utcnow(), db_quoteinterval('3 MINUTE')
- );
-
- if((! local_channel()) || ($result['invalid'])) {
- echo json_encode($result);
- killme();
- }
-
- /**
- * Everything following is only permitted under the context of a locally authenticated site member.
- */
-
-
- /**
- * Handle "mark all xyz notifications read" requests.
- */
-
- // mark all items read
- if(x($_REQUEST, 'markRead') && local_channel()) {
- switch($_REQUEST['markRead']) {
- case 'network':
- $r = q("update item set item_unseen = 0 where item_unseen = 1 and uid = %d",
- intval(local_channel())
- );
- break;
- case 'home':
- $r = q("update item set item_unseen = 0 where item_unseen = 1 and item_wall = 1 and uid = %d",
- intval(local_channel())
- );
- break;
- case 'messages':
- $r = q("update mail set mail_seen = 1 where mail_seen = 0 and channel_id = %d ",
- intval(local_channel())
- );
- break;
- case 'all_events':
- $r = q("update event set `ignore` = 1 where `ignore` = 0 and uid = %d AND start < '%s' AND start > '%s' ",
- intval(local_channel()),
- dbesc(datetime_convert('UTC', date_default_timezone_get(), 'now + ' . intval($evdays) . ' days')),
- dbesc(datetime_convert('UTC', date_default_timezone_get(), 'now - 1 days'))
- );
- break;
- case 'notify':
- $r = q("update notify set seen = 1 where uid = %d",
- intval(local_channel())
- );
- break;
- default:
- break;
- }
- }
-
- if(x($_REQUEST, 'markItemRead') && local_channel()) {
- $r = q("update item set item_unseen = 0 where parent = %d and uid = %d",
- intval($_REQUEST['markItemRead']),
- intval(local_channel())
- );
- }
-
-
-
- /**
- * URL ping/something will return detail for "something", e.g. a json list with which to populate a notification
- * dropdown menu.
- */
-
- if(argc() > 1 && argv(1) === 'notify') {
- $t = q("select count(*) as total from notify where uid = %d and seen = 0",
- intval(local_channel())
- );
- if($t && intval($t[0]['total']) > 49) {
- $z = q("select * from notify where uid = %d
- and seen = 0 order by date desc limit 50",
- intval(local_channel())
- );
- }
- else {
- $z1 = q("select * from notify where uid = %d
- and seen = 0 order by date desc limit 50",
- intval(local_channel())
- );
- $z2 = q("select * from notify where uid = %d
- and seen = 1 order by date desc limit %d",
- intval(local_channel()),
- intval(50 - intval($t[0]['total']))
- );
- $z = array_merge($z1,$z2);
- }
-
- if(count($z)) {
- foreach($z as $zz) {
- $notifs[] = array(
- 'notify_link' => z_root() . '/notify/view/' . $zz['id'],
- 'name' => $zz['name'],
- 'url' => $zz['url'],
- 'photo' => $zz['photo'],
- 'when' => relative_date($zz['date']),
- 'hclass' => (($zz['seen']) ? 'notify-seen' : 'notify-unseen'),
- 'message' => strip_tags(bbcode($zz['msg']))
- );
- }
- }
-
- echo json_encode(array('notify' => $notifs));
- killme();
- }
-
- if(argc() > 1 && argv(1) === 'messages') {
- $channel = App::get_channel();
- $t = q("select mail.*, xchan.* from mail left join xchan on xchan_hash = from_xchan
- where channel_id = %d and mail_seen = 0 and mail_deleted = 0
- and from_xchan != '%s' order by created desc limit 50",
- intval(local_channel()),
- dbesc($channel['channel_hash'])
- );
-
- if($t) {
- foreach($t as $zz) {
- $notifs[] = array(
- 'notify_link' => z_root() . '/mail/' . $zz['id'],
- 'name' => $zz['xchan_name'],
- 'url' => $zz['xchan_url'],
- 'photo' => $zz['xchan_photo_s'],
- 'when' => relative_date($zz['created']),
- 'hclass' => (intval($zz['mail_seen']) ? 'notify-seen' : 'notify-unseen'),
- 'message' => t('sent you a private message'),
- );
- }
- }
-
- echo json_encode(array('notify' => $notifs));
- killme();
- }
-
- if(argc() > 1 && (argv(1) === 'network' || argv(1) === 'home')) {
- $result = array();
-
- $r = q("SELECT * FROM item
- WHERE item_unseen = 1 and uid = %d $item_normal
- and author_xchan != '%s' ORDER BY created DESC limit 300",
- intval(local_channel()),
- dbesc($ob_hash)
- );
-
- if($r) {
- xchan_query($r);
- foreach($r as $item) {
- if((argv(1) === 'home') && (! intval($item['item_wall'])))
- continue;
- $result[] = format_notification($item);
- }
- }
-// logger('ping (network||home): ' . print_r($result, true), LOGGER_DATA);
- echo json_encode(array('notify' => $result));
- killme();
- }
-
- if(argc() > 1 && (argv(1) === 'intros')) {
- $result = array();
-
- $r = q("SELECT * FROM abook left join xchan on abook.abook_xchan = xchan.xchan_hash where abook_channel = %d and abook_pending = 1 and abook_self = 0 and abook_ignored = 0 and xchan_deleted = 0 and xchan_orphan = 0 ORDER BY abook_created DESC LIMIT 50",
- intval(local_channel())
- );
-
- if($r) {
- foreach($r as $rr) {
- $result[] = array(
- 'notify_link' => z_root() . '/connections/ifpending',
- 'name' => $rr['xchan_name'],
- 'url' => $rr['xchan_url'],
- 'photo' => $rr['xchan_photo_s'],
- 'when' => relative_date($rr['abook_created']),
- 'hclass' => ('notify-unseen'),
- 'message' => t('added your channel')
- );
- }
- }
- logger('ping (intros): ' . print_r($result, true), LOGGER_DATA);
- echo json_encode(array('notify' => $result));
- killme();
- }
-
- if(argc() > 1 && (argv(1) === 'all_events')) {
- $bd_format = t('g A l F d') ; // 8 AM Friday January 18
-
- $result = array();
-
- $r = q("SELECT * FROM event left join xchan on event_xchan = xchan_hash
- WHERE `event`.`uid` = %d AND start < '%s' AND start > '%s' and `ignore` = 0
- and type in ( 'event', 'birthday' )
- ORDER BY `start` DESC LIMIT 1000",
- intval(local_channel()),
- dbesc(datetime_convert('UTC', date_default_timezone_get(), 'now + ' . intval($evdays) . ' days')),
- dbesc(datetime_convert('UTC', date_default_timezone_get(), 'now - 1 days'))
- );
-
- if($r) {
- foreach($r as $rr) {
- if($rr['adjust'])
- $md = datetime_convert('UTC', date_default_timezone_get(), $rr['start'], 'Y/m');
- else
- $md = datetime_convert('UTC', 'UTC', $rr['start'], 'Y/m');
-
- $strt = datetime_convert('UTC', (($rr['adjust']) ? date_default_timezone_get() : 'UTC'), $rr['start']);
- $today = ((substr($strt, 0, 10) === datetime_convert('UTC', date_default_timezone_get(), 'now', 'Y-m-d')) ? true : false);
-
- $when = day_translate(datetime_convert('UTC', (($rr['adjust']) ? date_default_timezone_get() : 'UTC'), $rr['start'], $bd_format)) . (($today) ? ' ' . t('[today]') : '');
-
- $result[] = array(
- 'notify_link' => z_root() . '/events', // FIXME this takes you to an edit page and it may not be yours, we really want to just view the single event --> '/events/event/' . $rr['event_hash'],
- 'name' => $rr['xchan_name'],
- 'url' => $rr['xchan_url'],
- 'photo' => $rr['xchan_photo_s'],
- 'when' => $when,
- 'hclass' => ('notify-unseen'),
- 'message' => t('posted an event')
- );
- }
- }
- logger('ping (all_events): ' . print_r($result, true), LOGGER_DATA);
- echo json_encode(array('notify' => $result));
- killme();
- }
-
-
-
- /**
- * Normal ping - just the counts, no detail
- */
-
- if($vnotify & VNOTIFY_SYSTEM) {
- $t = q("select count(*) as total from notify where uid = %d and seen = 0",
- intval(local_channel())
- );
- if($t)
- $result['notify'] = intval($t[0]['total']);
- }
-
- $t1 = dba_timer();
-
- if($vnotify & (VNOTIFY_NETWORK|VNOTIFY_CHANNEL)) {
- $r = q("SELECT id, item_wall FROM item
- WHERE item_unseen = 1 and uid = %d
- $item_normal
- and author_xchan != '%s'",
- intval(local_channel()),
- dbesc($ob_hash)
- );
-
- if($r) {
- $arr = array('items' => $r);
- call_hooks('network_ping', $arr);
-
- foreach ($r as $it) {
- if(intval($it['item_wall']))
- $result['home'] ++;
- else
- $result['network'] ++;
- }
- }
- }
- if(! ($vnotify & VNOTIFY_NETWORK))
- $result['network'] = 0;
- if(! ($vnotify & VNOTIFY_CHANNEL))
- $result['home'] = 0;
-
-
- $t2 = dba_timer();
-
- if($vnotify & VNOTIFY_INTRO) {
- $intr = q("SELECT COUNT(abook.abook_id) AS total FROM abook left join xchan on abook.abook_xchan = xchan.xchan_hash where abook_channel = %d and abook_pending = 1 and abook_self = 0 and abook_ignored = 0 and xchan_deleted = 0 and xchan_orphan = 0 ",
- intval(local_channel())
- );
-
- $t3 = dba_timer();
-
- if($intr)
- $result['intros'] = intval($intr[0]['total']);
- }
-
- $t4 = dba_timer();
- $channel = App::get_channel();
-
- if($vnotify & VNOTIFY_MAIL) {
- $mails = q("SELECT count(id) as total from mail
- WHERE channel_id = %d AND mail_seen = 0 and from_xchan != '%s' ",
- intval(local_channel()),
- dbesc($channel['channel_hash'])
- );
- if($mails)
- $result['mail'] = intval($mails[0]['total']);
- }
-
- if($vnotify & VNOTIFY_REGISTER) {
- if (App::$config['system']['register_policy'] == REGISTER_APPROVE && is_site_admin()) {
- $regs = q("SELECT count(account_id) as total from account where (account_flags & %d) > 0",
- intval(ACCOUNT_PENDING)
- );
- if($regs)
- $result['register'] = intval($regs[0]['total']);
- }
- }
-
- $t5 = dba_timer();
-
- if($vnotify & (VNOTIFY_EVENT|VNOTIFY_EVENTTODAY|VNOTIFY_BIRTHDAY)) {
- $events = q("SELECT type, start, adjust FROM `event`
- WHERE `event`.`uid` = %d AND start < '%s' AND start > '%s' and `ignore` = 0
- and type in ( 'event', 'birthday' )
- ORDER BY `start` ASC ",
- intval(local_channel()),
- dbesc(datetime_convert('UTC', date_default_timezone_get(), 'now + ' . intval($evdays) . ' days')),
- dbesc(datetime_convert('UTC', date_default_timezone_get(), 'now - 1 days'))
- );
-
- if($events) {
- $result['all_events'] = count($events);
-
- if($result['all_events']) {
- $str_now = datetime_convert('UTC', date_default_timezone_get(), 'now', 'Y-m-d');
- foreach($events as $x) {
- $bd = false;
- if($x['type'] === 'birthday') {
- $result['birthdays'] ++;
- $bd = true;
- }
- else {
- $result['events'] ++;
- }
- if(datetime_convert('UTC', ((intval($x['adjust'])) ? date_default_timezone_get() : 'UTC'), $x['start'], 'Y-m-d') === $str_now) {
- $result['all_events_today'] ++;
- if($bd)
- $result['birthdays_today'] ++;
- else
- $result['events_today'] ++;
- }
- }
- }
- }
- }
- if(! ($vnotify & VNOTIFY_EVENT))
- $result['all_events'] = $result['events'] = 0;
- if(! ($vnotify & VNOTIFY_EVENTTODAY))
- $result['all_events_today'] = $result['events_today'] = 0;
- if(! ($vnotify & VNOTIFY_BIRTHDAY))
- $result['birthdays'] = 0;
-
-
- $x = json_encode($result);
-
- $t6 = dba_timer();
-
-// logger('ping timer: ' . sprintf('%01.4f %01.4f %01.4f %01.4f %01.4f %01.4f',$t6 - $t5, $t5 - $t4, $t4 - $t3, $t3 - $t2, $t2 - $t1, $t1 - $t0));
-
- echo $x;
- killme();
-}
diff --git a/mod/poco.php b/mod/poco.php
deleted file mode 100644
index 098c9a240..000000000
--- a/mod/poco.php
+++ /dev/null
@@ -1,7 +0,0 @@
-<?php
-
-require_once('include/socgraph.php');
-
-function poco_init(&$a) {
- poco($a,false);
-}
diff --git a/mod/poke.php b/mod/poke.php
deleted file mode 100755
index 7245ceee7..000000000
--- a/mod/poke.php
+++ /dev/null
@@ -1,189 +0,0 @@
-<?php /** @file */
-
-/**
- *
- * Poke, prod, finger, or otherwise do unspeakable things to somebody - who must be a connection in your address book
- * This function can be invoked with the required arguments (verb and cid and private and possibly parent) silently via ajax or
- * other web request. You must be logged in and connected to a channel.
- * If the required arguments aren't present, we'll display a simple form to choose a recipient and a verb.
- * parent is a special argument which let's you attach this activity as a comment to an existing conversation, which
- * may have started with somebody else poking (etc.) somebody, but this isn't necessary. This can be used in the adult
- * plugin version to have entire conversations where Alice poked Bob, Bob fingered Alice, Alice hugged Bob, etc.
- *
- * private creates a private conversation with the recipient. Otherwise your channel's default post privacy is used.
- *
- */
-
-require_once('include/items.php');
-
-function poke_init(&$a) {
-
- if(! local_channel())
- return;
-
- $uid = local_channel();
- $channel = App::get_channel();
-
- $verb = notags(trim($_REQUEST['verb']));
-
- if(! $verb)
- return;
-
- $verbs = get_poke_verbs();
-
- if(! array_key_exists($verb,$verbs))
- return;
-
- $activity = ACTIVITY_POKE . '#' . urlencode($verbs[$verb][0]);
-
- $contact_id = intval($_REQUEST['cid']);
- if(! $contact_id)
- return;
-
- $parent = ((x($_REQUEST,'parent')) ? intval($_REQUEST['parent']) : 0);
-
- logger('poke: verb ' . $verb . ' contact ' . $contact_id, LOGGER_DEBUG);
-
-
- $r = q("SELECT * FROM abook left join xchan on xchan_hash = abook_xchan where abook_id = %d and abook_channel = %d LIMIT 1",
- intval($contact_id),
- intval($uid)
- );
-
- if(! $r) {
- logger('poke: no target ' . $contact_id);
- return;
- }
-
- $target = $r[0];
- $parent_item = null;
-
- if($parent) {
- $r = q("select mid, item_private, owner_xchan, allow_cid, allow_gid, deny_cid, deny_gid
- from item where id = %d and parent = %d and uid = %d limit 1",
- intval($parent),
- intval($parent),
- intval($uid)
- );
- if($r) {
- $parent_item = $r[0];
- $parent_mid = $r[0]['mid'];
- $item_private = $r[0]['item_private'];
- $allow_cid = $r[0]['allow_cid'];
- $allow_gid = $r[0]['allow_gid'];
- $deny_cid = $r[0]['deny_cid'];
- $deny_gid = $r[0]['deny_gid'];
- }
- }
- else {
-
- $item_private = ((x($_GET,'private')) ? intval($_GET['private']) : 0);
-
- $allow_cid = (($item_private) ? '<' . $target['abook_xchan']. '>' : $channel['channel_allow_cid']);
- $allow_gid = (($item_private) ? '' : $channel['channel_allow_gid']);
- $deny_cid = (($item_private) ? '' : $channel['channel_deny_cid']);
- $deny_gid = (($item_private) ? '' : $channel['channel_deny_gid']);
- }
-
-
- $arr = array();
-
- $arr['item_wall'] = 1;
- $arr['owner_xchan'] = (($parent_item) ? $parent_item['owner_xchan'] : $channel['channel_hash']);
- $arr['parent_mid'] = (($parent_mid) ? $parent_mid : $mid);
- $arr['title'] = '';
- $arr['allow_cid'] = $allow_cid;
- $arr['allow_gid'] = $allow_gid;
- $arr['deny_cid'] = $deny_cid;
- $arr['deny_gid'] = $deny_gid;
- $arr['verb'] = $activity;
- $arr['item_private'] = $item_private;
- $arr['obj_type'] = ACTIVITY_OBJ_PERSON;
- $arr['body'] = '[zrl=' . $channel['xchan_url'] . ']' . $channel['xchan_name'] . '[/zrl]' . ' ' . t($verbs[$verb][0]) . ' ' . '[zrl=' . $target['xchan_url'] . ']' . $target['xchan_name'] . '[/zrl]';
-
- $obj = array(
- 'type' => ACTIVITY_OBJ_PERSON,
- 'title' => $target['xchan_name'],
- 'id' => $target['xchan_hash'],
- 'link' => array(
- array('rel' => 'alternate', 'type' => 'text/html', 'href' => $target['xchan_url']),
- array('rel' => 'photo', 'type' => $target['xchan_photo_mimetype'], 'href' => $target['xchan_photo_l'])
- ),
- );
-
- $arr['object'] = json_encode($obj);
-
- $arr['item_origin'] = 1;
- $arr['item_wall'] = 1;
- $arr['item_unseen'] = 1;
- if(! $parent_item)
- $item['item_thread_top'] = 1;
-
-
- post_activity_item($arr);
-
- return;
-}
-
-
-
-function poke_content(&$a) {
-
- if(! local_channel()) {
- notice( t('Permission denied.') . EOL);
- return;
- }
-
- $name = '';
- $id = '';
-
- if(intval($_REQUEST['c'])) {
- $r = q("select abook_id, xchan_name from abook left join xchan on abook_xchan = xchan_hash
- where abook_id = %d and abook_channel = %d limit 1",
- intval($_REQUEST['c']),
- intval(local_channel())
- );
- if($r) {
- $name = $r[0]['xchan_name'];
- $id = $r[0]['abook_id'];
- }
- }
-
- $parent = ((x($_REQUEST,'parent')) ? intval($_REQUEST['parent']) : '0');
-
- $verbs = get_poke_verbs();
-
- $shortlist = array();
- foreach($verbs as $k => $v)
- if($v[1] !== 'NOTRANSLATION')
- $shortlist[] = array($k,$v[1]);
-
-
- $poke_basic = get_config('system','poke_basic');
- if($poke_basic) {
- $title = t('Poke');
- $desc = t('Poke somebody');
- }
- else {
- $title = t('Poke/Prod');
- $desc = t('Poke, prod or do other things to somebody');
- }
-
- $o = replace_macros(get_markup_template('poke_content.tpl'),array(
- '$title' => $title,
- '$poke_basic' => $poke_basic,
- '$desc' => $desc,
- '$clabel' => t('Recipient'),
- '$choice' => t('Choose what you wish to do to recipient'),
- '$verbs' => $shortlist,
- '$parent' => $parent,
- '$prv_desc' => t('Make this post private'),
- '$private' => array('private', t('Make this post private'), false, ''),
- '$submit' => t('Submit'),
- '$name' => $name,
- '$id' => $id
- ));
-
- return $o;
-
-} \ No newline at end of file
diff --git a/mod/post.php b/mod/post.php
deleted file mode 100644
index 481a4a896..000000000
--- a/mod/post.php
+++ /dev/null
@@ -1,30 +0,0 @@
-<?php
-
-/**
- * @file mod/post.php
- *
- * @brief Zot endpoint.
- *
- */
-
-require_once('include/zot.php');
-
-function post_init(&$a) {
-
- if (array_key_exists('auth', $_REQUEST)) {
- $x = new Zotlabs\Zot\Auth($_REQUEST);
- exit;
- }
-
-}
-
-
-function post_post(&$a) {
-
- $z = new Zotlabs\Zot\Receiver($_REQUEST['data'],get_config('system','prvkey'), new Zotlabs\Zot\ZotHandler());
-
- // notreached;
-
- exit;
-
-}
diff --git a/mod/prate.php b/mod/prate.php
deleted file mode 100644
index 2da6855dd..000000000
--- a/mod/prate.php
+++ /dev/null
@@ -1,99 +0,0 @@
-<?php
-
-function prate_init(&$a) {
- if($_SERVER['REQUEST_METHOD'] === 'post')
- return;
-
- if(! local_channel())
- return;
-
- $channel = App::get_channel();
-
- $target = argv(1);
- if(! $target)
- return;
-
- $r = q("select * from xlink where xlink_xchan = '%s' and xlink_link = '%s' and xlink_static = 1",
- dbesc($channel['channel_hash']),
- dbesc($target)
- );
- if($r)
- json_return_and_die(array('rating' => $r[0]['xlink_rating'],'rating_text' => $r[0]['xlink_rating_text']));
- killme();
-}
-
-function prate_post(&$a) {
-
- if(! local_channel())
- return;
-
- $channel = App::get_channel();
-
- $target = trim($_REQUEST['target']);
- if(! $target)
- return;
-
- if($target === $channel['channel_hash'])
- return;
-
- $rating = intval($_POST['rating']);
- if($rating < (-10))
- $rating = (-10);
- if($rating > 10)
- $rating = 10;
-
- $rating_text = trim(escape_tags($_REQUEST['rating_text']));
-
- $signed = $target . '.' . $rating . '.' . $rating_text;
-
- $sig = base64url_encode(rsa_sign($signed,$channel['channel_prvkey']));
-
-
- $z = q("select * from xlink where xlink_xchan = '%s' and xlink_link = '%s' and xlink_static = 1 limit 1",
- dbesc($channel['channel_hash']),
- dbesc($target)
- );
- if($z) {
- $record = $z[0]['xlink_id'];
- $w = q("update xlink set xlink_rating = '%d', xlink_rating_text = '%s', xlink_sig = '%s', xlink_updated = '%s'
- where xlink_id = %d",
- intval($rating),
- dbesc($rating_text),
- dbesc($sig),
- dbesc(datetime_convert()),
- intval($record)
- );
- }
- else {
- $w = q("insert into xlink ( xlink_xchan, xlink_link, xlink_rating, xlink_rating_text, xlink_sig, xlink_updated, xlink_static ) values ( '%s', '%s', %d, '%s', '%s', '%s', 1 ) ",
- dbesc($channel['channel_hash']),
- dbesc($target),
- intval($rating),
- dbesc($rating_text),
- dbesc($sig),
- dbesc(datetime_convert())
- );
- $z = q("select * from xlink where xlink_xchan = '%s' and xlink_link = '%s' and xlink_static = 1 limit 1",
- dbesc($channel['channel_hash']),
- dbesc($orig_record[0]['abook_xchan'])
- );
- if($z)
- $record = $z[0]['xlink_id'];
- }
- if($record) {
- proc_run('php','include/ratenotif.php','rating',$record);
- }
-
- json_return_and_die(array('result' => true));;
-}
-
-
-
-
-
-
-
-
-
-
-
diff --git a/mod/pretheme.php b/mod/pretheme.php
deleted file mode 100644
index 1974f5f00..000000000
--- a/mod/pretheme.php
+++ /dev/null
@@ -1,22 +0,0 @@
-<?php
-
-function pretheme_init(&$a) {
-
- if($_REQUEST['theme']) {
- $theme = $_REQUEST['theme'];
- $info = get_theme_info($theme);
- if($info) {
- // unfortunately there will be no translation for this string
- $desc = $info['description'];
- $version = $info['version'];
- $credits = $info['credits'];
- }
- else {
- $desc = '';
- $version = '';
- $credits = '';
- }
- echo json_encode(array('img' => get_theme_screenshot($theme), 'desc' => $desc, 'version' => $version, 'credits' => $credits));
- }
- killme();
-}
diff --git a/mod/probe.php b/mod/probe.php
deleted file mode 100644
index 6408a8c4f..000000000
--- a/mod/probe.php
+++ /dev/null
@@ -1,41 +0,0 @@
-<?php
-
-require_once('include/zot.php');
-
-function probe_content(&$a) {
-
- $o .= '<h3>Probe Diagnostic</h3>';
-
- $o .= '<form action="probe" method="get">';
- $o .= 'Lookup address: <input type="text" style="width: 250px;" name="addr" value="' . $_GET['addr'] .'" />';
- $o .= '<input type="submit" name="submit" value="Submit" /></form>';
-
- $o .= '<br /><br />';
-
- if(x($_GET,'addr')) {
- $channel = App::get_channel();
- $addr = trim($_GET['addr']);
- $do_import = ((intval($_GET['import']) && is_site_admin()) ? true : false);
- $res = zot_finger($addr,$channel,false);
- $o .= '<pre>';
- if($res['success'])
- $j = json_decode($res['body'],true);
- else {
- $o .= sprintf( t('Fetching URL returns error: %1$s'),$res['error'] . "\r\n\r\n");
- $o .= "<strong>https connection failed. Trying again with auto failover to http.</strong>\r\n\r\n";
- $res = zot_finger($addr,$channel,true);
- if($res['success'])
- $j = json_decode($res['body'],true);
- else
- $o .= sprintf( t('Fetching URL returns error: %1$s'),$res['error'] . "\r\n\r\n");
-
- }
- if($do_import && $j)
- $x = import_xchan($j);
- if($j && $j['permissions'] && $j['permissions']['iv'])
- $j['permissions'] = json_decode(crypto_unencapsulate($j['permissions'],$channel['channel_prvkey']),true);
- $o .= str_replace("\n",'<br />',print_r($j,true));
- $o .= '</pre>';
- }
- return $o;
-}
diff --git a/mod/profile.php b/mod/profile.php
deleted file mode 100644
index 09bcfd56a..000000000
--- a/mod/profile.php
+++ /dev/null
@@ -1,84 +0,0 @@
-<?php /** @file */
-
-require_once('include/contact_widgets.php');
-require_once('include/items.php');
-require_once("include/bbcode.php");
-require_once('include/security.php');
-require_once('include/conversation.php');
-require_once('include/acl_selectors.php');
-
-
-function profile_init(&$a) {
-
- if(argc() > 1)
- $which = argv(1);
- else {
- notice( t('Requested profile is not available.') . EOL );
- App::$error = 404;
- return;
- }
-
- $profile = '';
- $channel = App::get_channel();
-
- if((local_channel()) && (argc() > 2) && (argv(2) === 'view')) {
- $which = $channel['channel_address'];
- $profile = argv(1);
- $r = q("select profile_guid from profile where id = %d and uid = %d limit 1",
- intval($profile),
- intval(local_channel())
- );
- if(! $r)
- $profile = '';
- $profile = $r[0]['profile_guid'];
- }
-
- App::$page['htmlhead'] .= '<link rel="alternate" type="application/atom+xml" href="' . z_root() . '/feed/' . $which .'" />' . "\r\n" ;
-
- if(! $profile) {
- $x = q("select channel_id as profile_uid from channel where channel_address = '%s' limit 1",
- dbesc(argv(1))
- );
- if($x) {
- App::$profile = $x[0];
- }
- }
-
- profile_load($a,$which,$profile);
-
-
-}
-
-function profile_content(&$a, $update = 0) {
-
- if(get_config('system','block_public') && (! get_account_id()) && (! remote_channel())) {
- return login();
- }
-
- $groups = array();
-
- $tab = 'profile';
- $o = '';
-
- if(! (perm_is_allowed(App::$profile['profile_uid'],get_observer_hash(), 'view_profile'))) {
- notice( t('Permission denied.') . EOL);
- return;
- }
-
-
- $is_owner = ((local_channel()) && (local_channel() == App::$profile['profile_uid']) ? true : false);
-
- if(App::$profile['hidewall'] && (! $is_owner) && (! remote_channel())) {
- notice( t('Permission denied.') . EOL);
- return;
- }
-
- $o .= profile_tabs($a, $is_owner, App::$profile['channel_address']);
-
- App::$page['htmlhead'] .= "\r\n" . '<link rel="alternate" type="application/json+oembed" href="' . z_root() . '/oep?f=&url=' . urlencode(z_root() . '/' . App::$query_string) . '" title="oembed" />' . "\r\n";
-
- $o .= advanced_profile($a);
- call_hooks('profile_advanced',$o);
- return $o;
-
-}
diff --git a/mod/profile_photo.php b/mod/profile_photo.php
deleted file mode 100644
index bac93555f..000000000
--- a/mod/profile_photo.php
+++ /dev/null
@@ -1,467 +0,0 @@
-<?php
-
-/* @file profile_photo.php
- @brief Module-file with functions for handling of profile-photos
-
-*/
-
-require_once('include/photo/photo_driver.php');
-require_once('include/identity.php');
-
-/* @brief Function for sync'ing permissions of profile-photos and their profile
-*
-* @param $profileid The id number of the profile to sync
-* @return void
-*/
-
-function profile_photo_set_profile_perms($profileid = '') {
-
- $allowcid = '';
- if (x($profileid)) {
-
- $r = q("SELECT photo, profile_guid, id, is_default, uid FROM profile WHERE profile.id = %d OR profile.profile_guid = '%s' LIMIT 1", intval($profileid), dbesc($profileid));
-
- } else {
-
- logger('Resetting permissions on default-profile-photo for user'.local_channel());
- $r = q("SELECT photo, profile_guid, id, is_default, uid FROM profile WHERE profile.uid = %d AND is_default = 1 LIMIT 1", intval(local_channel()) ); //If no profile is given, we update the default profile
- }
-
- $profile = $r[0];
- if(x($profile['id']) && x($profile['photo'])) {
- preg_match("@\w*(?=-\d*$)@i", $profile['photo'], $resource_id);
- $resource_id = $resource_id[0];
-
- if (intval($profile['is_default']) != 1) {
- $r0 = q("SELECT channel_hash FROM channel WHERE channel_id = %d LIMIT 1", intval(local_channel()) );
- $r1 = q("SELECT abook.abook_xchan FROM abook WHERE abook_profile = '%d' ", intval($profile['id'])); //Should not be needed in future. Catches old int-profile-ids.
- $r2 = q("SELECT abook.abook_xchan FROM abook WHERE abook_profile = '%s'", dbesc($profile['profile_guid']));
- $allowcid = "<" . $r0[0]['channel_hash'] . ">";
- foreach ($r1 as $entry) {
- $allowcid .= "<" . $entry['abook_xchan'] . ">";
- }
- foreach ($r2 as $entry) {
- $allowcid .= "<" . $entry['abook_xchan'] . ">";
- }
-
- q("UPDATE `photo` SET allow_cid = '%s' WHERE resource_id = '%s' AND uid = %d",dbesc($allowcid),dbesc($resource_id),intval($profile['uid']));
-
- } else {
- q("UPDATE `photo` SET allow_cid = '' WHERE profile = 1 AND uid = %d",intval($profile['uid'])); //Reset permissions on default profile picture to public
- }
- }
-
- return;
-}
-
-/* @brief Initalize the profile-photo edit view
- *
- * @param $a Current application
- * @return void
- *
- */
-
-function profile_photo_init(&$a) {
-
- if(! local_channel()) {
- return;
- }
-
- $channel = App::get_channel();
- profile_load($a,$channel['channel_address']);
-
-}
-
-/* @brief Evaluate posted values
- *
- * @param $a Current application
- * @return void
- *
- */
-
-function profile_photo_post(&$a) {
-
- if(! local_channel()) {
- return;
- }
-
- check_form_security_token_redirectOnErr('/profile_photo', 'profile_photo');
-
- if((x($_POST,'cropfinal')) && ($_POST['cropfinal'] == 1)) {
-
- // unless proven otherwise
- $is_default_profile = 1;
-
- if($_REQUEST['profile']) {
- $r = q("select id, profile_guid, is_default, gender from profile where id = %d and uid = %d limit 1",
- intval($_REQUEST['profile']),
- intval(local_channel())
- );
- if($r) {
- $profile = $r[0];
- if(! intval($profile['is_default']))
- $is_default_profile = 0;
- }
- }
-
-
-
- // phase 2 - we have finished cropping
-
- if(argc() != 2) {
- notice( t('Image uploaded but image cropping failed.') . EOL );
- return;
- }
-
- $image_id = argv(1);
-
- if(substr($image_id,-2,1) == '-') {
- $scale = substr($image_id,-1,1);
- $image_id = substr($image_id,0,-2);
- }
-
-
- $srcX = $_POST['xstart'];
- $srcY = $_POST['ystart'];
- $srcW = $_POST['xfinal'] - $srcX;
- $srcH = $_POST['yfinal'] - $srcY;
-
- $r = q("SELECT * FROM photo WHERE resource_id = '%s' AND uid = %d AND scale = %d LIMIT 1",
- dbesc($image_id),
- dbesc(local_channel()),
- intval($scale));
-
- if($r) {
-
- $base_image = $r[0];
- $base_image['data'] = (($r[0]['os_storage']) ? @file_get_contents($base_image['data']) : dbunescbin($base_image['data']));
-
- $im = photo_factory($base_image['data'], $base_image['type']);
- if($im->is_valid()) {
-
- $im->cropImage(300,$srcX,$srcY,$srcW,$srcH);
-
- $aid = get_account_id();
-
- $p = array('aid' => $aid, 'uid' => local_channel(), 'resource_id' => $base_image['resource_id'],
- 'filename' => $base_image['filename'], 'album' => t('Profile Photos'));
-
- $p['scale'] = 4;
- $p['photo_usage'] = (($is_default_profile) ? PHOTO_PROFILE : PHOTO_NORMAL);
-
- $r1 = $im->save($p);
-
- $im->scaleImage(80);
- $p['scale'] = 5;
-
- $r2 = $im->save($p);
-
- $im->scaleImage(48);
- $p['scale'] = 6;
-
- $r3 = $im->save($p);
-
- if($r1 === false || $r2 === false || $r3 === false) {
- // if one failed, delete them all so we can start over.
- notice( t('Image resize failed.') . EOL );
- $x = q("delete from photo where resource_id = '%s' and uid = %d and scale >= 4 ",
- dbesc($base_image['resource_id']),
- local_channel()
- );
- return;
- }
-
- $channel = App::get_channel();
-
- // If setting for the default profile, unset the profile photo flag from any other photos I own
-
- if($is_default_profile) {
- $r = q("UPDATE photo SET photo_usage = %d WHERE photo_usage = %d
- AND resource_id != '%s' AND `uid` = %d",
- intval(PHOTO_NORMAL),
- intval(PHOTO_PROFILE),
- dbesc($base_image['resource_id']),
- intval(local_channel())
- );
-
- send_profile_photo_activity($channel,$base_image,$profile);
-
- }
- else {
- $r = q("update profile set photo = '%s', thumb = '%s' where id = %d and uid = %d",
- dbesc(z_root() . '/photo/' . $base_image['resource_id'] . '-4'),
- dbesc(z_root() . '/photo/' . $base_image['resource_id'] . '-5'),
- intval($_REQUEST['profile']),
- intval(local_channel())
- );
- }
-
- profiles_build_sync(local_channel());
-
- // We'll set the updated profile-photo timestamp even if it isn't the default profile,
- // so that browsers will do a cache update unconditionally
-
-
- $r = q("UPDATE xchan set xchan_photo_mimetype = '%s', xchan_photo_date = '%s'
- where xchan_hash = '%s'",
- dbesc($im->getType()),
- dbesc(datetime_convert()),
- dbesc($channel['xchan_hash'])
- );
-
- info( t('Shift-reload the page or clear browser cache if the new photo does not display immediately.') . EOL);
-
- // Update directory in background
- proc_run('php',"include/directory.php",$channel['channel_id']);
-
- // Now copy profile-permissions to pictures, to prevent privacyleaks by automatically created folder 'Profile Pictures'
-
- profile_photo_set_profile_perms($_REQUEST['profile']);
-
-
-
- }
- else
- notice( t('Unable to process image') . EOL);
- }
-
- goaway(z_root() . '/profiles');
- return; // NOTREACHED
- }
-
-
-
- $hash = photo_new_resource();
- $smallest = 0;
-
- require_once('include/attach.php');
-
- $res = attach_store(App::get_channel(), get_observer_hash(), '', array('album' => t('Profile Photos'), 'hash' => $hash));
-
- logger('attach_store: ' . print_r($res,true));
-
- if($res && intval($res['data']['is_photo'])) {
- $i = q("select * from photo where resource_id = '%s' and uid = %d order by scale",
- dbesc($hash),
- intval(local_channel())
- );
-
- if(! $i) {
- notice( t('Image upload failed.') . EOL );
- return;
- }
- $os_storage = false;
-
- foreach($i as $ii) {
- if(intval($ii['scale']) < 2) {
- $smallest = intval($ii['scale']);
- $os_storage = intval($ii['os_storage']);
- $imagedata = $ii['data'];
- $filetype = $ii['type'];
- }
- }
- }
-
- $imagedata = (($os_storage) ? @file_get_contents($imagedata) : $imagedata);
- $ph = photo_factory($imagedata, $filetype);
-
- if(! $ph->is_valid()) {
- notice( t('Unable to process image.') . EOL );
- return;
- }
-
- return profile_photo_crop_ui_head($a, $ph, $hash, $smallest);
-
-}
-
-
-/* @brief Generate content of profile-photo view
- *
- * @param $a Current application
- * @return void
- *
- */
-
-
-function profile_photo_content(&$a) {
-
- if(! local_channel()) {
- notice( t('Permission denied.') . EOL );
- return;
- }
-
- $channel = App::get_channel();
-
- $newuser = false;
-
- if(argc() == 2 && argv(1) === 'new')
- $newuser = true;
-
- if(argv(1) === 'use') {
- if (argc() < 3) {
- notice( t('Permission denied.') . EOL );
- return;
- };
-
-// check_form_security_token_redirectOnErr('/profile_photo', 'profile_photo');
-
- $resource_id = argv(2);
-
-
- $r = q("SELECT id, album, scale FROM photo WHERE uid = %d AND resource_id = '%s' ORDER BY scale ASC",
- intval(local_channel()),
- dbesc($resource_id)
- );
- if(! $r) {
- notice( t('Photo not available.') . EOL );
- return;
- }
- $havescale = false;
- foreach($r as $rr) {
- if($rr['scale'] == 5)
- $havescale = true;
- }
-
- // set an already loaded photo as profile photo
-
- if(($r[0]['album'] == t('Profile Photos')) && ($havescale)) {
- // unset any existing profile photos
- $r = q("UPDATE photo SET photo_usage = %d WHERE photo_usage = %d AND uid = %d",
- intval(PHOTO_NORMAL),
- intval(PHOTO_PROFILE),
- intval(local_channel()));
-
- $r = q("UPDATE photo SET photo_usage = %d WHERE uid = %d AND resource_id = '%s'",
- intval(PHOTO_PROFILE),
- intval(local_channel()),
- dbesc($resource_id)
- );
-
- $r = q("UPDATE xchan set xchan_photo_date = '%s'
- where xchan_hash = '%s'",
- dbesc(datetime_convert()),
- dbesc($channel['xchan_hash'])
- );
-
- profile_photo_set_profile_perms(); //Reset default photo permissions to public
- proc_run('php','include/directory.php',local_channel());
- goaway(z_root() . '/profiles');
- }
-
- $r = q("SELECT `data`, `type`, resource_id, os_storage FROM photo WHERE id = %d and uid = %d limit 1",
- intval($r[0]['id']),
- intval(local_channel())
-
- );
- if(! $r) {
- notice( t('Photo not available.') . EOL );
- return;
- }
-
- if(intval($r[0]['os_storage']))
- $data = @file_get_contents($r[0]['data']);
- else
- $data = dbunescbin($r[0]['data']);
-
- $ph = photo_factory($data, $r[0]['type']);
- $smallest = 0;
- if($ph->is_valid()) {
- // go ahead as if we have just uploaded a new photo to crop
- $i = q("select resource_id, scale from photo where resource_id = '%s' and uid = %d order by scale",
- dbesc($r[0]['resource_id']),
- intval(local_channel())
- );
-
- if($i) {
- $hash = $i[0]['resource_id'];
- foreach($i as $ii) {
- if(intval($ii['scale']) < 2) {
- $smallest = intval($ii['scale']);
- }
- }
- }
- }
-
- profile_photo_crop_ui_head($a, $ph, $hash, $smallest);
- }
-
- $profiles = q("select id, profile_name as name, is_default from profile where uid = %d",
- intval(local_channel())
- );
-
- if(! x(App::$data,'imagecrop')) {
-
- $tpl = get_markup_template('profile_photo.tpl');
-
- $o .= replace_macros($tpl,array(
- '$user' => App::$channel['channel_address'],
- '$lbl_upfile' => t('Upload File:'),
- '$lbl_profiles' => t('Select a profile:'),
- '$title' => t('Upload Profile Photo'),
- '$submit' => t('Upload'),
- '$profiles' => $profiles,
- '$single' => ((count($profiles) == 1) ? true : false),
- '$profile0' => $profiles[0],
- '$form_security_token' => get_form_security_token("profile_photo"),
-// FIXME - yuk
- '$select' => sprintf('%s %s', t('or'), ($newuser) ? '<a href="' . z_root() . '">' . t('skip this step') . '</a>' : '<a href="'. z_root() . '/photos/' . App::$channel['channel_address'] . '">' . t('select a photo from your photo albums') . '</a>')
- ));
-
- call_hooks('profile_photo_content_end', $o);
-
- return $o;
- }
- else {
- $filename = App::$data['imagecrop'] . '-' . App::$data['imagecrop_resolution'];
- $resolution = App::$data['imagecrop_resolution'];
- $tpl = get_markup_template("cropbody.tpl");
- $o .= replace_macros($tpl,array(
- '$filename' => $filename,
- '$profile' => intval($_REQUEST['profile']),
- '$resource' => App::$data['imagecrop'] . '-' . App::$data['imagecrop_resolution'],
- '$image_url' => z_root() . '/photo/' . $filename,
- '$title' => t('Crop Image'),
- '$desc' => t('Please adjust the image cropping for optimum viewing.'),
- '$form_security_token' => get_form_security_token("profile_photo"),
- '$done' => t('Done Editing')
- ));
- return $o;
- }
-
- return; // NOTREACHED
-}
-
-/* @brief Generate the UI for photo-cropping
- *
- * @param $a Current application
- * @param $ph Photo-Factory
- * @return void
- *
- */
-
-
-
-function profile_photo_crop_ui_head(&$a, $ph, $hash, $smallest){
-
- $max_length = get_config('system','max_image_length');
- if(! $max_length)
- $max_length = MAX_IMAGE_LENGTH;
- if($max_length > 0)
- $ph->scaleImage($max_length);
-
- $width = $ph->getWidth();
- $height = $ph->getHeight();
-
- if($width < 500 || $height < 500) {
- $ph->scaleImageUp(400);
- $width = $ph->getWidth();
- $height = $ph->getHeight();
- }
-
-
- App::$data['imagecrop'] = $hash;
- App::$data['imagecrop_resolution'] = $smallest;
- App::$page['htmlhead'] .= replace_macros(get_markup_template("crophead.tpl"), array());
- return;
-}
-
diff --git a/mod/profiles.php b/mod/profiles.php
deleted file mode 100644
index 75c05b634..000000000
--- a/mod/profiles.php
+++ /dev/null
@@ -1,789 +0,0 @@
-<?php
-
-require_once('include/identity.php');
-
-function profiles_init(&$a) {
-
- nav_set_selected('profiles');
-
- if(! local_channel()) {
- return;
- }
-
- if((argc() > 2) && (argv(1) === "drop") && intval(argv(2))) {
- $r = q("SELECT * FROM `profile` WHERE `id` = %d AND `uid` = %d AND `is_default` = 0 LIMIT 1",
- intval(argv(2)),
- intval(local_channel())
- );
- if(! count($r)) {
- notice( t('Profile not found.') . EOL);
- goaway(z_root() . '/profiles');
- return; // NOTREACHED
- }
- $profile_guid = $r['profile_guid'];
-
- check_form_security_token_redirectOnErr('/profiles', 'profile_drop', 't');
-
- // move every contact using this profile as their default to the user default
-
- $r = q("UPDATE abook SET abook_profile = (SELECT profile_guid AS FROM profile WHERE is_default = 1 AND uid = %d LIMIT 1) WHERE abook_profile = '%s' AND abook_channel = %d ",
- intval(local_channel()),
- dbesc($profile_guid),
- intval(local_channel())
- );
- $r = q("DELETE FROM `profile` WHERE `id` = %d AND `uid` = %d",
- intval(argv(2)),
- intval(local_channel())
- );
- if($r)
- info( t('Profile deleted.') . EOL);
-
- // @fixme this is a much more complicated sync - add any changed abook entries and
- // also add deleted flag to profile structure
- // profiles_build_sync is just here as a placeholder - it doesn't work at all here
-
- // profiles_build_sync(local_channel());
-
- goaway(z_root() . '/profiles');
- return; // NOTREACHED
- }
-
-
-
-
-
- if((argc() > 1) && (argv(1) === 'new')) {
-
-// check_form_security_token_redirectOnErr('/profiles', 'profile_new', 't');
-
- $r0 = q("SELECT `id` FROM `profile` WHERE `uid` = %d",
- intval(local_channel()));
- $num_profiles = count($r0);
-
- $name = t('Profile-') . ($num_profiles + 1);
-
- $r1 = q("SELECT `name`, `photo`, `thumb` FROM `profile` WHERE `uid` = %d AND `is_default` = 1 LIMIT 1",
- intval(local_channel()));
-
- $r2 = q("INSERT INTO `profile` (`aid`, `uid` , `profile_guid`, `profile_name` , `name`, `photo`, `thumb`)
- VALUES ( %d, '%s', '%s', '%s', '%s', '%s', '%s' )",
- intval(get_account_id()),
- intval(local_channel()),
- dbesc(random_string()),
- dbesc($name),
- dbesc($r1[0]['name']),
- dbesc($r1[0]['photo']),
- dbesc($r1[0]['thumb'])
- );
-
- $r3 = q("SELECT `id` FROM `profile` WHERE `uid` = %d AND `profile_name` = '%s' LIMIT 1",
- intval(local_channel()),
- dbesc($name)
- );
-
- info( t('New profile created.') . EOL);
- if(count($r3) == 1)
- goaway(z_root() . '/profiles/' . $r3[0]['id']);
-
- goaway(z_root() . '/profiles');
- }
-
- if((argc() > 2) && (argv(1) === 'clone')) {
-
- check_form_security_token_redirectOnErr('/profiles', 'profile_clone', 't');
-
- $r0 = q("SELECT `id` FROM `profile` WHERE `uid` = %d",
- intval(local_channel()));
- $num_profiles = count($r0);
-
- $name = t('Profile-') . ($num_profiles + 1);
- $r1 = q("SELECT * FROM `profile` WHERE `uid` = %d AND `id` = %d LIMIT 1",
- intval(local_channel()),
- intval(App::$argv[2])
- );
- if(! count($r1)) {
- notice( t('Profile unavailable to clone.') . EOL);
- App::$error = 404;
- return;
- }
- unset($r1[0]['id']);
- $r1[0]['is_default'] = 0;
- $r1[0]['publish'] = 0;
- $r1[0]['profile_name'] = dbesc($name);
- $r1[0]['profile_guid'] = dbesc(random_string());
-
- dbesc_array($r1[0]);
-
- $r2 = dbq("INSERT INTO `profile` (`"
- . implode("`, `", array_keys($r1[0]))
- . "`) VALUES ('"
- . implode("', '", array_values($r1[0]))
- . "')" );
-
- $r3 = q("SELECT `id` FROM `profile` WHERE `uid` = %d AND `profile_name` = '%s' LIMIT 1",
- intval(local_channel()),
- dbesc($name)
- );
- info( t('New profile created.') . EOL);
-
- profiles_build_sync(local_channel());
-
- if(($r3) && (count($r3) == 1))
- goaway(z_root() . '/profiles/' . $r3[0]['id']);
-
- goaway(z_root() . '/profiles');
-
- return; // NOTREACHED
- }
-
- if((argc() > 2) && (argv(1) === 'export')) {
-
- $r1 = q("SELECT * FROM `profile` WHERE `uid` = %d AND `id` = %d LIMIT 1",
- intval(local_channel()),
- intval(argv(2))
- );
- if(! $r1) {
- notice( t('Profile unavailable to export.') . EOL);
- App::$error = 404;
- return;
- }
- header('content-type: application/octet_stream');
- header('content-disposition: attachment; filename="' . $r1[0]['profile_name'] . '.json"' );
-
- unset($r1[0]['id']);
- unset($r1[0]['aid']);
- unset($r1[0]['uid']);
- unset($r1[0]['is_default']);
- unset($r1[0]['publish']);
- unset($r1[0]['profile_name']);
- unset($r1[0]['profile_guid']);
- echo json_encode($r1[0]);
- killme();
- }
-
-
-
-
- // Run profile_load() here to make sure the theme is set before
- // we start loading content
- if(((argc() > 1) && (intval(argv(1)))) || !feature_enabled(local_channel(),'multi_profiles')) {
- if(feature_enabled(local_channel(),'multi_profiles'))
- $id = App::$argv[1];
- else {
- $x = q("select id from profile where uid = %d and is_default = 1",
- intval(local_channel())
- );
- if($x)
- $id = $x[0]['id'];
- }
- $r = q("SELECT * FROM `profile` WHERE `id` = %d AND `uid` = %d LIMIT 1",
- intval($id),
- intval(local_channel())
- );
- if(! count($r)) {
- notice( t('Profile not found.') . EOL);
- App::$error = 404;
- return;
- }
-
- $chan = App::get_channel();
-
- profile_load($a,$chan['channel_address'],$r[0]['id']);
- }
-}
-
-function profiles_post(&$a) {
-
- if(! local_channel()) {
- notice( t('Permission denied.') . EOL);
- return;
- }
-
- require_once('include/activities.php');
-
- $namechanged = false;
-
-
- // import from json export file.
- // Only import fields that are allowed on this hub
-
- if(x($_FILES,'userfile')) {
- $src = $_FILES['userfile']['tmp_name'];
- $filesize = intval($_FILES['userfile']['size']);
- if($filesize) {
- $j = @json_decode(@file_get_contents($src),true);
- @unlink($src);
- if($j) {
- $fields = get_profile_fields_advanced();
- if($fields) {
- foreach($j as $jj => $v) {
- foreach($fields as $f => $n) {
- if($jj == $f) {
- $_POST[$f] = $v;
- break;
- }
- }
- }
- }
- }
- }
- }
-
- call_hooks('profile_post', $_POST);
-
-
- if((argc() > 1) && (argv(1) !== "new") && intval(argv(1))) {
- $orig = q("SELECT * FROM `profile` WHERE `id` = %d AND `uid` = %d LIMIT 1",
- intval(App::$argv[1]),
- intval(local_channel())
- );
- if(! count($orig)) {
- notice( t('Profile not found.') . EOL);
- return;
- }
-
- check_form_security_token_redirectOnErr('/profiles', 'profile_edit');
-
- $is_default = (($orig[0]['is_default']) ? 1 : 0);
-
- $profile_name = notags(trim($_POST['profile_name']));
- if(! strlen($profile_name)) {
- notice( t('Profile Name is required.') . EOL);
- return;
- }
-
- $dob = $_POST['dob'] ? escape_tags(trim($_POST['dob'])) : '0000-00-00'; // FIXME: Needs to be validated?
-
- $y = substr($dob,0,4);
- if((! ctype_digit($y)) || ($y < 1900))
- $ignore_year = true;
- else
- $ignore_year = false;
-
- if($dob != '0000-00-00') {
- if(strpos($dob,'0000-') === 0) {
- $ignore_year = true;
- $dob = substr($dob,5);
- }
- $dob = datetime_convert('UTC','UTC',(($ignore_year) ? '1900-' . $dob : $dob),(($ignore_year) ? 'm-d' : 'Y-m-d'));
- if($ignore_year)
- $dob = '0000-' . $dob;
- }
-
- $name = escape_tags(trim($_POST['name']));
-
- if($orig[0]['name'] != $name) {
- $namechanged = true;
-
- $v = validate_channelname($name);
- if($v) {
- notice($v);
- $namechanged = false;
- $name = $orig[0]['name'];
- }
- }
-
- $pdesc = escape_tags(trim($_POST['pdesc']));
- $gender = escape_tags(trim($_POST['gender']));
- $address = escape_tags(trim($_POST['address']));
- $locality = escape_tags(trim($_POST['locality']));
- $region = escape_tags(trim($_POST['region']));
- $postal_code = escape_tags(trim($_POST['postal_code']));
- $country_name = escape_tags(trim($_POST['country_name']));
- $keywords = escape_tags(trim($_POST['keywords']));
- $marital = escape_tags(trim($_POST['marital']));
- $howlong = escape_tags(trim($_POST['howlong']));
- $sexual = escape_tags(trim($_POST['sexual']));
- $homepage = escape_tags(trim($_POST['homepage']));
- $hometown = escape_tags(trim($_POST['hometown']));
- $politic = escape_tags(trim($_POST['politic']));
- $religion = escape_tags(trim($_POST['religion']));
-
- $likes = fix_mce_lf(escape_tags(trim($_POST['likes'])));
- $dislikes = fix_mce_lf(escape_tags(trim($_POST['dislikes'])));
-
- $about = fix_mce_lf(escape_tags(trim($_POST['about'])));
- $interest = fix_mce_lf(escape_tags(trim($_POST['interest'])));
- $contact = fix_mce_lf(escape_tags(trim($_POST['contact'])));
- $channels = fix_mce_lf(escape_tags(trim($_POST['channels'])));
- $music = fix_mce_lf(escape_tags(trim($_POST['music'])));
- $book = fix_mce_lf(escape_tags(trim($_POST['book'])));
- $tv = fix_mce_lf(escape_tags(trim($_POST['tv'])));
- $film = fix_mce_lf(escape_tags(trim($_POST['film'])));
- $romance = fix_mce_lf(escape_tags(trim($_POST['romance'])));
- $work = fix_mce_lf(escape_tags(trim($_POST['work'])));
- $education = fix_mce_lf(escape_tags(trim($_POST['education'])));
-
- $hide_friends = ((intval($_POST['hide_friends'])) ? 1: 0);
-
- require_once('include/text.php');
- linkify_tags($a, $likes, local_channel());
- linkify_tags($a, $dislikes, local_channel());
- linkify_tags($a, $about, local_channel());
- linkify_tags($a, $interest, local_channel());
- linkify_tags($a, $interest, local_channel());
- linkify_tags($a, $contact, local_channel());
- linkify_tags($a, $channels, local_channel());
- linkify_tags($a, $music, local_channel());
- linkify_tags($a, $book, local_channel());
- linkify_tags($a, $tv, local_channel());
- linkify_tags($a, $film, local_channel());
- linkify_tags($a, $romance, local_channel());
- linkify_tags($a, $work, local_channel());
- linkify_tags($a, $education, local_channel());
-
-
- $with = ((x($_POST,'with')) ? escape_tags(trim($_POST['with'])) : '');
-
- if(! strlen($howlong))
- $howlong = NULL_DATE;
- else
- $howlong = datetime_convert(date_default_timezone_get(),'UTC',$howlong);
-
- // linkify the relationship target if applicable
-
- $withchanged = false;
-
- if(strlen($with)) {
- if($with != strip_tags($orig[0]['with'])) {
- $withchanged = true;
- $prf = '';
- $lookup = $with;
- if(strpos($lookup,'@') === 0)
- $lookup = substr($lookup,1);
- $lookup = str_replace('_',' ', $lookup);
- $newname = $lookup;
-
- $r = q("SELECT * FROM abook left join xchan on abook_xchan = xchan_hash WHERE xchan_name = '%s' AND abook_channel = %d LIMIT 1",
- dbesc($newname),
- intval(local_channel())
- );
- if(! $r) {
- $r = q("SELECT * FROM abook left join xchan on abook_xchan = xchan_hash WHERE xchan_addr = '%s' AND abook_channel = %d LIMIT 1",
- dbesc($lookup . '@%'),
- intval(local_channel())
- );
- }
- if($r) {
- $prf = $r[0]['xchan_url'];
- $newname = $r[0]['xchan_name'];
- }
-
-
- if($prf) {
- $with = str_replace($lookup,'<a href="' . $prf . '">' . $newname . '</a>', $with);
- if(strpos($with,'@') === 0)
- $with = substr($with,1);
- }
- }
- else
- $with = $orig[0]['with'];
- }
-
- $profile_fields_basic = get_profile_fields_basic();
- $profile_fields_advanced = get_profile_fields_advanced();
- $advanced = ((feature_enabled(local_channel(),'advanced_profiles')) ? true : false);
- if($advanced)
- $fields = $profile_fields_advanced;
- else
- $fields = $profile_fields_basic;
-
- $z = q("select * from profdef where true");
- if($z) {
- foreach($z as $zz) {
- if(array_key_exists($zz['field_name'],$fields)) {
- $w = q("select * from profext where channel_id = %d and hash = '%s' and k = '%s' limit 1",
- intval(local_channel()),
- dbesc($orig[0]['profile_guid']),
- dbesc($zz['field_name'])
- );
- if($w) {
- q("update profext set v = '%s' where id = %d",
- dbesc(escape_tags(trim($_POST[$zz['field_name']]))),
- intval($w[0]['id'])
- );
- }
- else {
- q("insert into profext ( channel_id, hash, k, v ) values ( %d, '%s', '%s', '%s') ",
- intval(local_channel()),
- dbesc($orig[0]['profile_guid']),
- dbesc($zz['field_name']),
- dbesc(escape_tags(trim($_POST[$zz['field_name']])))
- );
- }
- }
- }
- }
-
- $changes = array();
- $value = '';
- if($is_default) {
- if($marital != $orig[0]['marital']) {
- $changes[] = '[color=#ff0000]&hearts;[/color] ' . t('Marital Status');
- $value = $marital;
- }
- if($withchanged) {
- $changes[] = '[color=#ff0000]&hearts;[/color] ' . t('Romantic Partner');
- $value = strip_tags($with);
- }
- if($likes != $orig[0]['likes']) {
- $changes[] = t('Likes');
- $value = $likes;
- }
- if($dislikes != $orig[0]['dislikes']) {
- $changes[] = t('Dislikes');
- $value = $dislikes;
- }
- if($work != $orig[0]['work']) {
- $changes[] = t('Work/Employment');
- }
- if($religion != $orig[0]['religion']) {
- $changes[] = t('Religion');
- $value = $religion;
- }
- if($politic != $orig[0]['politic']) {
- $changes[] = t('Political Views');
- $value = $politic;
- }
- if($gender != $orig[0]['gender']) {
- $changes[] = t('Gender');
- $value = $gender;
- }
- if($sexual != $orig[0]['sexual']) {
- $changes[] = t('Sexual Preference');
- $value = $sexual;
- }
- if($homepage != $orig[0]['homepage']) {
- $changes[] = t('Homepage');
- $value = $homepage;
- }
- if($interest != $orig[0]['interest']) {
- $changes[] = t('Interests');
- $value = $interest;
- }
- if($address != $orig[0]['address']) {
- $changes[] = t('Address');
- // New address not sent in notifications, potential privacy issues
- // in case this leaks to unintended recipients. Yes, it's in the public
- // profile but that doesn't mean we have to broadcast it to everybody.
- }
- if($locality != $orig[0]['locality'] || $region != $orig[0]['region']
- || $country_name != $orig[0]['country_name']) {
- $changes[] = t('Location');
- $comma1 = ((($locality) && ($region || $country_name)) ? ', ' : ' ');
- $comma2 = (($region && $country_name) ? ', ' : '');
- $value = $locality . $comma1 . $region . $comma2 . $country_name;
- }
-
- profile_activity($changes,$value);
-
- }
-
- $r = q("UPDATE `profile`
- SET `profile_name` = '%s',
- `name` = '%s',
- `pdesc` = '%s',
- `gender` = '%s',
- `dob` = '%s',
- `address` = '%s',
- `locality` = '%s',
- `region` = '%s',
- `postal_code` = '%s',
- `country_name` = '%s',
- `marital` = '%s',
- `with` = '%s',
- `howlong` = '%s',
- `sexual` = '%s',
- `homepage` = '%s',
- `hometown` = '%s',
- `politic` = '%s',
- `religion` = '%s',
- `keywords` = '%s',
- `likes` = '%s',
- `dislikes` = '%s',
- `about` = '%s',
- `interest` = '%s',
- `contact` = '%s',
- `channels` = '%s',
- `music` = '%s',
- `book` = '%s',
- `tv` = '%s',
- `film` = '%s',
- `romance` = '%s',
- `work` = '%s',
- `education` = '%s',
- `hide_friends` = %d
- WHERE `id` = %d AND `uid` = %d",
- dbesc($profile_name),
- dbesc($name),
- dbesc($pdesc),
- dbesc($gender),
- dbesc($dob),
- dbesc($address),
- dbesc($locality),
- dbesc($region),
- dbesc($postal_code),
- dbesc($country_name),
- dbesc($marital),
- dbesc($with),
- dbesc($howlong),
- dbesc($sexual),
- dbesc($homepage),
- dbesc($hometown),
- dbesc($politic),
- dbesc($religion),
- dbesc($keywords),
- dbesc($likes),
- dbesc($dislikes),
- dbesc($about),
- dbesc($interest),
- dbesc($contact),
- dbesc($channels),
- dbesc($music),
- dbesc($book),
- dbesc($tv),
- dbesc($film),
- dbesc($romance),
- dbesc($work),
- dbesc($education),
- intval($hide_friends),
- intval(argv(1)),
- intval(local_channel())
- );
-
- if($r)
- info( t('Profile updated.') . EOL);
-
- $r = q("select * from profile where id = %d and uid = %d limit 1",
- intval(argv(1)),
- intval(local_channel())
- );
- if($r) {
- require_once('include/zot.php');
- build_sync_packet(local_channel(),array('profile' => $r));
- }
-
- $channel = App::get_channel();
-
- if($namechanged && $is_default) {
- $r = q("UPDATE xchan SET xchan_name = '%s', xchan_name_date = '%s' WHERE xchan_hash = '%s'",
- dbesc($name),
- dbesc(datetime_convert()),
- dbesc($channel['xchan_hash'])
- );
- $r = q("UPDATE channel SET channel_name = '%s' WHERE channel_hash = '%s'",
- dbesc($name),
- dbesc($channel['xchan_hash'])
- );
- }
-
- if($is_default) {
- // reload the info for the sidebar widget - why does this not work?
- profile_load($a,$channel['channel_address']);
- proc_run('php','include/directory.php',local_channel());
- }
- }
-}
-
-
-function profiles_content(&$a) {
-
- $o = '';
-
- $channel = App::get_channel();
-
- if(! local_channel()) {
- notice( t('Permission denied.') . EOL);
- return;
- }
-
- require_once('include/identity.php');
-
- $profile_fields_basic = get_profile_fields_basic();
- $profile_fields_advanced = get_profile_fields_advanced();
-
- if(((argc() > 1) && (intval(argv(1)))) || !feature_enabled(local_channel(),'multi_profiles')) {
- if(feature_enabled(local_channel(),'multi_profiles'))
- $id = App::$argv[1];
- else {
- $x = q("select id from profile where uid = %d and is_default = 1",
- intval(local_channel())
- );
- if($x)
- $id = $x[0]['id'];
- }
- $r = q("SELECT * FROM `profile` WHERE `id` = %d AND `uid` = %d LIMIT 1",
- intval($id),
- intval(local_channel())
- );
- if(! count($r)) {
- notice( t('Profile not found.') . EOL);
- return;
- }
-
- require_once('include/profile_selectors.php');
-
-
- $editselect = 'none';
-// if(feature_enabled(local_channel(),'richtext'))
-// $editselect = 'textareas';
-
- App::$page['htmlhead'] .= replace_macros(get_markup_template('profed_head.tpl'), array(
- '$baseurl' => z_root(),
- '$editselect' => $editselect,
- ));
-
- $advanced = ((feature_enabled(local_channel(),'advanced_profiles')) ? true : false);
- if($advanced)
- $fields = $profile_fields_advanced;
- else
- $fields = $profile_fields_basic;
-
- $hide_friends = array(
- 'hide_friends',
- t('Hide your connections list from viewers of this profile'),
- $r[0]['hide_friends'],
- '',
- array(t('No'),t('Yes'))
- );
-
- $q = q("select * from profdef where true");
- if($q) {
- $extra_fields = array();
-
- foreach($q as $qq) {
- $mine = q("select v from profext where k = '%s' and hash = '%s' and channel_id = %d limit 1",
- dbesc($qq['field_name']),
- dbesc($r[0]['profile_guid']),
- intval(local_channel())
- );
-
- if(array_key_exists($qq['field_name'],$fields)) {
- $extra_fields[] = array($qq['field_name'],$qq['field_desc'],(($mine) ? $mine[0]['v'] : ''), $qq['field_help']);
- }
- }
- }
-
-//logger('extra_fields: ' . print_r($extra_fields,true));
-
- $f = get_config('system','birthday_input_format');
- if(! $f)
- $f = 'ymd';
-
- $is_default = (($r[0]['is_default']) ? 1 : 0);
-
- $tpl = get_markup_template("profile_edit.tpl");
- $o .= replace_macros($tpl,array(
-
- '$form_security_token' => get_form_security_token("profile_edit"),
- '$profile_clone_link' => ((feature_enabled(local_channel(),'multi_profiles')) ? 'profiles/clone/' . $r[0]['id'] . '?t='
- . get_form_security_token("profile_clone") : ''),
- '$profile_drop_link' => 'profiles/drop/' . $r[0]['id'] . '?t='
- . get_form_security_token("profile_drop"),
-
- '$fields' => $fields,
- '$guid' => $r[0]['profile_guid'],
- '$banner' => t('Edit Profile Details'),
- '$submit' => t('Submit'),
- '$viewprof' => t('View this profile'),
- '$editvis' => t('Edit visibility'),
- '$coverpic' => t('Change cover photo'),
- '$profpic' => t('Change profile photo'),
- '$cr_prof' => t('Create a new profile using these settings'),
- '$cl_prof' => t('Clone this profile'),
- '$del_prof' => t('Delete this profile'),
- '$addthing' => t('Add profile things'),
- '$personal' => t('Personal'),
- '$location' => t('Location'),
- '$relation' => t('Relation'),
- '$miscellaneous'=> t('Miscellaneous'),
- '$exportable' => feature_enabled(local_channel(),'profile_export'),
- '$lbl_import' => t('Import profile from file'),
- '$lbl_export' => t('Export profile to file'),
- '$lbl_gender' => t('Your gender'),
- '$lbl_marital' => t('Marital status'),
- '$lbl_sexual' => t('Sexual preference'),
- '$baseurl' => z_root(),
- '$profile_id' => $r[0]['id'],
- '$profile_name' => array('profile_name', t('Profile name'), $r[0]['profile_name'], t('Required'), '*'),
- '$is_default' => $is_default,
- '$default' => t('This is your default profile.') . EOL . translate_scope(map_scope($channel['channel_r_profile'])),
- '$advanced' => $advanced,
- '$name' => array('name', t('Your full name'), $r[0]['name'], t('Required'), '*'),
- '$pdesc' => array('pdesc', t('Title/Description'), $r[0]['pdesc']),
- '$dob' => dob($r[0]['dob']),
- '$hide_friends' => $hide_friends,
- '$address' => array('address', t('Street address'), $r[0]['address']),
- '$locality' => array('locality', t('Locality/City'), $r[0]['locality']),
- '$region' => array('region', t('Region/State'), $r[0]['region']),
- '$postal_code' => array('postal_code', t('Postal/Zip code'), $r[0]['postal_code']),
- '$country_name' => array('country_name', t('Country'), $r[0]['country_name']),
- '$gender' => gender_selector($r[0]['gender']),
- '$gender_min' => gender_selector_min($r[0]['gender']),
- '$marital' => marital_selector($r[0]['marital']),
- '$marital_min' => marital_selector_min($r[0]['marital']),
- '$with' => array('with', t("Who (if applicable)"), $r[0]['with'], t('Examples: cathy123, Cathy Williams, cathy@example.com')),
- '$howlong' => array('howlong', t('Since (date)'), ($r[0]['howlong'] === NULL_DATE ? '' : datetime_convert('UTC',date_default_timezone_get(),$r[0]['howlong']))),
- '$sexual' => sexpref_selector($r[0]['sexual']),
- '$sexual_min' => sexpref_selector_min($r[0]['sexual']),
- '$about' => array('about', t('Tell us about yourself'), $r[0]['about']),
- '$homepage' => array('homepage', t('Homepage URL'), $r[0]['homepage']),
- '$hometown' => array('hometown', t('Hometown'), $r[0]['hometown']),
- '$politic' => array('politic', t('Political views'), $r[0]['politic']),
- '$religion' => array('religion', t('Religious views'), $r[0]['religion']),
- '$keywords' => array('keywords', t('Keywords used in directory listings'), $r[0]['keywords'], t('Example: fishing photography software')),
- '$likes' => array('likes', t('Likes'), $r[0]['likes']),
- '$dislikes' => array('dislikes', t('Dislikes'), $r[0]['dislikes']),
- '$music' => array('music', t('Musical interests'), $r[0]['music']),
- '$book' => array('book', t('Books, literature'), $r[0]['book']),
- '$tv' => array('tv', t('Television'), $r[0]['tv']),
- '$film' => array('film', t('Film/Dance/Culture/Entertainment'), $r[0]['film']),
- '$interest' => array('interest', t('Hobbies/Interests'), $r[0]['interest']),
- '$romance' => array('romance',t('Love/Romance'), $r[0]['romance']),
- '$work' => array('work', t('Work/Employment'), $r[0]['work']),
- '$education' => array('education', t('School/Education'), $r[0]['education']),
- '$contact' => array('contact', t('Contact information and social networks'), $r[0]['contact']),
- '$channels' => array('channels', t('My other channels'), $r[0]['channels']),
- '$extra_fields' => $extra_fields,
- ));
-
- $arr = array('profile' => $r[0], 'entry' => $o);
- call_hooks('profile_edit', $arr);
-
- return $o;
- }
- else {
-
- $r = q("SELECT * FROM `profile` WHERE `uid` = %d",
- local_channel());
- if(count($r)) {
-
- $tpl = get_markup_template('profile_entry.tpl');
- foreach($r as $rr) {
- $profiles .= replace_macros($tpl, array(
- '$photo' => $rr['thumb'],
- '$id' => $rr['id'],
- '$alt' => t('Profile Image'),
- '$profile_name' => $rr['profile_name'],
- '$visible' => (($rr['is_default'])
- ? '<strong>' . translate_scope(map_scope($channel['channel_r_profile'])) . '</strong>'
- : '<a href="' . z_root() . '/profperm/' . $rr['id'] . '" />' . t('Edit visibility') . '</a>')
- ));
- }
-
- $tpl_header = get_markup_template('profile_listing_header.tpl');
- $o .= replace_macros($tpl_header,array(
- '$header' => t('Edit Profiles'),
- '$cr_new' => t('Create New'),
- '$cr_new_link' => 'profiles/new?t=' . get_form_security_token("profile_new"),
- '$profiles' => $profiles
- ));
-
-
-
-
- }
- return $o;
- }
-
-}
diff --git a/mod/profperm.php b/mod/profperm.php
deleted file mode 100644
index 2e3f708c8..000000000
--- a/mod/profperm.php
+++ /dev/null
@@ -1,165 +0,0 @@
-<?php
-
-require_once('include/Contact.php');
-
-function profperm_init(&$a) {
-
- if(! local_channel())
- return;
-
- $channel = App::get_channel();
- $which = $channel['channel_address'];
-
- $profile = App::$argv[1];
-
- profile_load($a,$which,$profile);
-
-}
-
-
-function profperm_content(&$a) {
-
- if(! local_channel()) {
- notice( t('Permission denied') . EOL);
- return;
- }
-
-
- if(argc() < 2) {
- notice( t('Invalid profile identifier.') . EOL );
- return;
- }
-
- // Switch to text mod interface if we have more than 'n' contacts or group members
-
- $switchtotext = get_pconfig(local_channel(),'system','groupedit_image_limit');
- if($switchtotext === false)
- $switchtotext = get_config('system','groupedit_image_limit');
- if($switchtotext === false)
- $switchtotext = 400;
-
-
- if((argc() > 2) && intval(argv(1)) && intval(argv(2))) {
- $r = q("SELECT abook_id FROM abook WHERE abook_id = %d and abook_channel = %d limit 1",
- intval(argv(2)),
- intval(local_channel())
- );
- if($r)
- $change = intval(argv(2));
- }
-
-
- if((argc() > 1) && (intval(argv(1)))) {
- $r = q("SELECT * FROM `profile` WHERE `id` = %d AND `uid` = %d AND `is_default` = 0 LIMIT 1",
- intval(argv(1)),
- intval(local_channel())
- );
- if(! $r) {
- notice( t('Invalid profile identifier.') . EOL );
- return;
- }
-
- $profile = $r[0];
-
- $r = q("SELECT * FROM abook left join xchan on abook_xchan = xchan_hash WHERE abook_channel = %d AND abook_profile = '%s'",
- intval(local_channel()),
- dbesc($profile['profile_guid'])
- );
-
- $ingroup = array();
- if($r)
- foreach($r as $member)
- $ingroup[] = $member['abook_id'];
-
- $members = $r;
-
- if($change) {
- if(in_array($change,$ingroup)) {
- q("UPDATE abook SET abook_profile = '' WHERE abook_id = %d AND abook_channel = %d",
- intval($change),
- intval(local_channel())
- );
- }
- else {
- q("UPDATE abook SET abook_profile = '%s' WHERE abook_id = %d AND abook_channel = %d",
- dbesc($profile['profile_guid']),
- intval($change),
- intval(local_channel())
- );
-
- }
-
-
- //Time to update the permissions on the profile-pictures as well
- require_once('mod/profile_photo.php');
- profile_photo_set_profile_perms($profile['id']);
-
- $r = q("SELECT * FROM abook left join xchan on abook_xchan = xchan_hash WHERE abook_channel = %d AND abook_profile = '%s'",
- intval(local_channel()),
- dbesc($profile['profile_guid'])
- );
-
- $members = $r;
-
- $ingroup = array();
- if(count($r))
- foreach($r as $member)
- $ingroup[] = $member['abook_id'];
- }
-
- $o .= '<h2>' . t('Profile Visibility Editor') . '</h2>';
-
- $o .= '<h3>' . t('Profile') . ' \'' . $profile['profile_name'] . '\'</h3>';
-
- $o .= '<div id="prof-edit-desc">' . t('Click on a contact to add or remove.') . '</div>';
-
- }
-
- $o .= '<div id="prof-update-wrapper">';
- if($change)
- $o = '';
-
- $o .= '<div id="prof-members-title">';
- $o .= '<h3>' . t('Visible To') . '</h3>';
- $o .= '</div>';
- $o .= '<div id="prof-members">';
-
- $textmode = (($switchtotext && (count($members) > $switchtotext)) ? true : false);
-
- foreach($members as $member) {
- if($member['xchan_url']) {
- $member['click'] = 'profChangeMember(' . $profile['id'] . ',' . $member['abook_id'] . '); return false;';
- $o .= micropro($member,true,'mpprof', $textmode);
- }
- }
- $o .= '</div><div id="prof-members-end"></div>';
- $o .= '<hr id="prof-separator" />';
-
- $o .= '<div id="prof-all-contcts-title">';
- $o .= '<h3>' . t("All Connections") . '</h3>';
- $o .= '</div>';
- $o .= '<div id="prof-all-contacts">';
-
- $r = abook_connections(local_channel());
-
- if($r) {
- $textmode = (($switchtotext && (count($r) > $switchtotext)) ? true : false);
- foreach($r as $member) {
- if(! in_array($member['abook_id'],$ingroup)) {
- $member['click'] = 'profChangeMember(' . $profile['id'] . ',' . $member['abook_id'] . '); return false;';
- $o .= micropro($member,true,'mpprof',$textmode);
- }
- }
- }
-
- $o .= '</div><div id="prof-all-contacts-end"></div>';
-
- if($change) {
- echo $o;
- killme();
- }
- $o .= '</div>';
- return $o;
-
-}
-
diff --git a/mod/public.php b/mod/public.php
deleted file mode 100644
index fd89e0776..000000000
--- a/mod/public.php
+++ /dev/null
@@ -1,163 +0,0 @@
-<?php
-
-require_once('include/conversation.php');
-
-function public_content(&$a, $update = 0, $load = false) {
-
- if($load)
- $_SESSION['loadtime'] = datetime_convert();
-
-
- if(get_config('system','block_public') && (! get_account_id()) && (! remote_channel())) {
- return login();
- }
-
-
- if(get_config('system','disable_discover_tab'))
- return;
-
- $item_normal = item_normal();
-
- if(! $update) {
-
- $maxheight = get_config('system','home_divmore_height');
- if(! $maxheight)
- $maxheight = 400;
-
- $o .= '<div id="live-public"></div>' . "\r\n";
- $o .= "<script> var profile_uid = " . ((intval(local_channel())) ? local_channel() : (-1))
- . "; var profile_page = " . App::$pager['page']
- . "; divmore_height = " . intval($maxheight) . "; </script>\r\n";
-
- App::$page['htmlhead'] .= replace_macros(get_markup_template("build_query.tpl"),array(
- '$baseurl' => z_root(),
- '$pgtype' => 'public',
- '$uid' => ((local_channel()) ? local_channel() : '0'),
- '$gid' => '0',
- '$cid' => '0',
- '$cmin' => '0',
- '$cmax' => '99',
- '$star' => '0',
- '$liked' => '0',
- '$conv' => '0',
- '$spam' => '0',
- '$fh' => '1',
- '$nouveau' => '0',
- '$wall' => '0',
- '$list' => '0',
- '$page' => ((App::$pager['page'] != 1) ? App::$pager['page'] : 1),
- '$search' => '',
- '$order' => 'comment',
- '$file' => '',
- '$cats' => '',
- '$tags' => '',
- '$dend' => '',
- '$mid' => '',
- '$verb' => '',
- '$dbegin' => ''
- ));
- }
-
- if($update && ! $load) {
- // only setup pagination on initial page view
- $pager_sql = '';
- }
- else {
- App::set_pager_itemspage(20);
- $pager_sql = sprintf(" LIMIT %d OFFSET %d ", intval(App::$pager['itemspage']), intval(App::$pager['start']));
- }
-
- require_once('include/identity.php');
- require_once('include/security.php');
-
- if(get_config('system','site_firehose')) {
- $uids = " and item.uid in ( " . stream_perms_api_uids(PERMS_PUBLIC) . " ) and item_private = 0 and item_wall = 1 ";
- }
- else {
- $sys = get_sys_channel();
- $uids = " and item.uid = " . intval($sys['channel_id']) . " ";
- $sql_extra = item_permissions_sql($sys['channel_id']);
- App::$data['firehose'] = intval($sys['channel_id']);
- }
-
- if(get_config('system','public_list_mode'))
- $page_mode = 'list';
- else
- $page_mode = 'client';
-
-
- $simple_update = (($update) ? " and item.item_unseen = 1 " : '');
-
- if($update && $_SESSION['loadtime'])
- $simple_update = " AND (( item_unseen = 1 AND item.changed > '" . datetime_convert('UTC','UTC',$_SESSION['loadtime']) . "' ) OR item.changed > '" . datetime_convert('UTC','UTC',$_SESSION['loadtime']) . "' ) ";
- if($load)
- $simple_update = '';
-
- //logger('update: ' . $update . ' load: ' . $load);
-
- if($update) {
-
- $ordering = "commented";
-
- if($load) {
-
- // Fetch a page full of parent items for this page
-
- $r = q("SELECT distinct item.id AS item_id, $ordering FROM item
- left join abook on item.author_xchan = abook.abook_xchan
- WHERE true $uids $item_normal
- AND item.parent = item.id
- and (abook.abook_blocked = 0 or abook.abook_flags is null)
- $sql_extra3 $sql_extra $sql_nets
- ORDER BY $ordering DESC $pager_sql "
- );
-
-
- }
- elseif($update) {
-
- $r = q("SELECT distinct item.id AS item_id, $ordering FROM item
- left join abook on item.author_xchan = abook.abook_xchan
- WHERE true $uids $item_normal
- AND item.parent = item.id $simple_update
- and (abook.abook_blocked = 0 or abook.abook_flags is null)
- $sql_extra3 $sql_extra $sql_nets"
- );
- $_SESSION['loadtime'] = datetime_convert();
- }
- // Then fetch all the children of the parents that are on this page
- $parents_str = '';
- $update_unseen = '';
-
- if($r) {
-
- $parents_str = ids_to_querystr($r,'item_id');
-
- $items = q("SELECT item.*, item.id AS item_id FROM item
- WHERE true $uids $item_normal
- AND item.parent IN ( %s )
- $sql_extra ",
- dbesc($parents_str)
- );
-
- xchan_query($items,true,(-1));
- $items = fetch_post_tags($items,true);
- $items = conv_sort($items,$ordering);
- }
- else {
- $items = array();
- }
-
- }
-
- // fake it
- $mode = ('network');
-
- $o .= conversation($a,$items,$mode,$update,$page_mode);
-
- if(($items) && (! $update))
- $o .= alt_pager($a,count($items));
-
- return $o;
-
-} \ No newline at end of file
diff --git a/mod/pubsites.php b/mod/pubsites.php
deleted file mode 100644
index dc6b09d9b..000000000
--- a/mod/pubsites.php
+++ /dev/null
@@ -1,53 +0,0 @@
-<?php
-
-function pubsites_content(&$a) {
- require_once('include/dir_fns.php');
- $dirmode = intval(get_config('system','directory_mode'));
-
- if(($dirmode == DIRECTORY_MODE_PRIMARY) || ($dirmode == DIRECTORY_MODE_STANDALONE)) {
- $url = z_root() . '/dirsearch';
- }
- if(! $url) {
- $directory = find_upstream_directory($dirmode);
- $url = $directory['url'] . '/dirsearch';
- }
- $url .= '/sites';
-
- $o .= '<div class="generic-content-wrapper">';
-
- $o .= '<div class="section-title-wrapper"><h2>' . t('Public Hubs') . '</h2></div>';
-
- $o .= '<div class="section-content-tools-wrapper"><div class="descriptive-text">' .
- t('The listed hubs allow public registration for the $Projectname network. All hubs in the network are interlinked so membership on any of them conveys membership in the network as a whole. Some hubs may require subscription or provide tiered service plans. The hub itself <strong>may</strong> provide additional details.') . '</div>' . EOL;
-
- $ret = z_fetch_url($url);
- if($ret['success']) {
- $j = json_decode($ret['body'],true);
- if($j) {
- $o .= '<table class="table table-striped table-hover"><tr><td>' . t('Hub URL') . '</td><td>' . t('Access Type') . '</td><td>' . t('Registration Policy') . '</td><td colspan="2">' . t('Ratings') . '</td></tr>';
- if($j['sites']) {
- foreach($j['sites'] as $jj) {
- if($jj['project'] !== Zotlabs\Project\System::get_platform_name())
- continue;
- $host = strtolower(substr($jj['url'],strpos($jj['url'],'://')+3));
- $rate_links = ((local_channel()) ? '<td><a href="rate?f=&target=' . $host . '" class="btn-btn-default"><i class="icon-check"></i> ' . t('Rate') . '</a></td>' : '');
- $location = '';
- if(!empty($jj['location'])) {
- $location = '<p title="' . t('Location') . '" style="margin: 5px 5px 0 0; text-align: right"><i class="icon-globe"></i> ' . $jj['location'] . '</p>';
- }
- else {
- $location = '<br />&nbsp;';
- }
- $urltext = str_replace(array('https://'), '', $jj['url']);
- $o .= '<tr><td><a href="'. (($jj['sellpage']) ? $jj['sellpage'] : $jj['url'] . '/register' ) . '" ><i class="icon-link"></i> ' . $urltext . '</a>' . $location . '</td><td>' . $jj['access'] . '</td><td>' . $jj['register'] . '</td><td><a href="ratings/' . $host . '" class="btn-btn-default"><i class="icon-eye-open"></i> ' . t('View') . '</a></td>' . $rate_links . '</tr>';
- }
- }
-
- $o .= '</table>';
-
- $o .= '</div></div>';
-
- }
- }
- return $o;
-}
diff --git a/mod/randprof.php b/mod/randprof.php
deleted file mode 100644
index 124117e96..000000000
--- a/mod/randprof.php
+++ /dev/null
@@ -1,12 +0,0 @@
-<?php
-
-
-function randprof_init(&$a) {
- require_once('include/Contact.php');
- $x = random_profile();
- if($x)
- goaway(chanlink_url($x));
-
- /** FIXME this doesn't work at the moment as a fallback */
- goaway(z_root() . '/profile');
-}
diff --git a/mod/rate.php b/mod/rate.php
deleted file mode 100644
index 41e06e794..000000000
--- a/mod/rate.php
+++ /dev/null
@@ -1,173 +0,0 @@
-<?php
-
-
-function rate_init(&$a) {
-
- if(! local_channel())
- return;
-
- $channel = App::get_channel();
-
- $target = $_REQUEST['target'];
- if(! $target)
- return;
-
- App::$data['target'] = $target;
-
- if($target) {
- $r = q("SELECT * FROM xchan where xchan_hash like '%s' LIMIT 1",
- dbesc($target)
- );
- if($r) {
- App::$poi = $r[0];
- }
- else {
- $r = q("select * from site where site_url like '%s' and site_type = %d",
- dbesc('%' . $target),
- intval(SITE_TYPE_ZOT)
- );
- if($r) {
- App::$data['site'] = $r[0];
- App::$data['site']['site_url'] = strtolower($r[0]['site_url']);
- }
- }
- }
-
-
- return;
-
-}
-
-
-function rate_post(&$a) {
-
- if(! local_channel())
- return;
-
- if(! App::$data['target'])
- return;
-
- if(! $_REQUEST['execute'])
- return;
-
- $channel = App::get_channel();
-
- $rating = intval($_POST['rating']);
- if($rating < (-10))
- $rating = (-10);
- if($rating > 10)
- $rating = 10;
-
- $rating_text = trim(escape_tags($_REQUEST['rating_text']));
-
- $signed = App::$data['target'] . '.' . $rating . '.' . $rating_text;
-
- $sig = base64url_encode(rsa_sign($signed,$channel['channel_prvkey']));
-
- $z = q("select * from xlink where xlink_xchan = '%s' and xlink_link = '%s' and xlink_static = 1 limit 1",
- dbesc($channel['channel_hash']),
- dbesc(App::$data['target'])
- );
-
- if($z) {
- $record = $z[0]['xlink_id'];
- $w = q("update xlink set xlink_rating = '%d', xlink_rating_text = '%s', xlink_sig = '%s', xlink_updated = '%s'
- where xlink_id = %d",
- intval($rating),
- dbesc($rating_text),
- dbesc($sig),
- dbesc(datetime_convert()),
- intval($record)
- );
- }
- else {
- $w = q("insert into xlink ( xlink_xchan, xlink_link, xlink_rating, xlink_rating_text, xlink_sig, xlink_updated, xlink_static ) values ( '%s', '%s', %d, '%s', '%s', '%s', 1 ) ",
- dbesc($channel['channel_hash']),
- dbesc(App::$data['target']),
- intval($rating),
- dbesc($rating_text),
- dbesc($sig),
- dbesc(datetime_convert())
- );
- $z = q("select * from xlink where xlink_xchan = '%s' and xlink_link = '%s' and xlink_static = 1 limit 1",
- dbesc($channel['channel_hash']),
- dbesc(App::$data['target'])
- );
- if($z)
- $record = $z[0]['xlink_id'];
- }
-
- if($record) {
- proc_run('php','include/ratenotif.php','rating',$record);
- }
-
-}
-
-
-
-function rate_content(&$a) {
-
- if(! local_channel()) {
- notice( t('Permission denied.') . EOL);
- return;
- }
-
-// if(! App::$data['target']) {
-// notice( t('No recipients.') . EOL);
-// return;
-// }
-
- $poco_rating = get_config('system','poco_rating_enable');
- if((! $poco_rating) && ($poco_rating !== false)) {
- notice('Ratings are disabled on this site.');
- return;
- }
-
- $channel = App::get_channel();
-
- $r = q("select * from xlink where xlink_xchan = '%s' and xlink_link = '%s' and xlink_static = 1",
- dbesc($channel['channel_hash']),
- dbesc(App::$data['target'])
- );
- if($r) {
- App::$data['xlink'] = $r[0];
- $rating_val = $r[0]['xlink_rating'];
- $rating_text = $r[0]['xlink_rating_text'];
- }
- else {
- $rating_val = 0;
- $rating_text = '';
- }
-
- // if unset default to enabled
- if($poco_rating === false)
- $poco_rating = true;
-
- if($poco_rating) {
- $rating = replace_macros(get_markup_template('rating_slider.tpl'),array(
- '$min' => -10,
- '$val' => $rating_val
- ));
- }
- else {
- $rating = false;
- }
-
- $o = replace_macros(get_markup_template('rating_form.tpl'),array(
- '$header' => t('Rating'),
- '$website' => t('Website:'),
- '$site' => ((App::$data['site']) ? '<a href="' . App::$data['site']['site_url'] . '" >' . App::$data['site']['site_url'] . '</a>' : ''),
- 'target' => App::$data['target'],
- '$tgt_name' => ((App::$poi && App::$poi['xchan_name']) ? App::$poi['xchan_name'] : sprintf( t('Remote Channel [%s] (not yet known on this site)'), substr(App::$data['target'],0,16))),
- '$lbl_rating' => t('Rating (this information is public)'),
- '$lbl_rating_txt' => t('Optionally explain your rating (this information is public)'),
- '$rating_txt' => $rating_text,
- '$rating' => $rating,
- '$rating_val' => $rating_val,
- '$slide' => $slide,
- '$submit' => t('Submit')
- ));
-
- return $o;
-
-} \ No newline at end of file
diff --git a/mod/ratings.php b/mod/ratings.php
deleted file mode 100644
index d99be974c..000000000
--- a/mod/ratings.php
+++ /dev/null
@@ -1,110 +0,0 @@
-<?php
-
-require_once('include/dir_fns.php');
-
-function ratings_init(&$a) {
-
- if((get_config('system','block_public')) && (! local_channel()) && (! remote_channel())) {
- return;
- }
-
- if(local_channel())
- load_contact_links(local_channel());
-
- $dirmode = intval(get_config('system','directory_mode'));
-
- $x = find_upstream_directory($dirmode);
- if($x)
- $url = $x['url'];
-
- $poco_rating = get_config('system','poco_rating_enable');
- // if unset default to enabled
- if($poco_rating === false)
- $poco_rating = true;
-
- if(! $poco_rating)
- return;
-
- if(argc() > 1)
- $hash = argv(1);
-
- if(! $hash) {
- notice('Must supply a channel identififier.');
- return;
- }
-
- $results = false;
-
- $x = z_fetch_url($url . '/ratingsearch/' . urlencode($hash));
-
-
- if($x['success'])
- $results = json_decode($x['body'],true);
-
-
- if((! $results) || (! $results['success'])) {
-
- notice('No results.');
- return;
- }
-
- if(array_key_exists('xchan_hash',$results['target']))
- App::$poi = $results['target'];
-
- $friends = array();
- $others = array();
-
- if($results['ratings']) {
- foreach($results['ratings'] as $n) {
- if(is_array(App::$contacts) && array_key_exists($n['xchan_hash'],App::$contacts))
- $friends[] = $n;
- else
- $others[] = $n;
- }
- }
-
- App::$data = array('target' => $results['target'], 'results' => array_merge($friends,$others));
-
- if(! App::$data['results']) {
- notice( t('No ratings') . EOL);
- }
-
- return;
-}
-
-
-
-
-
-function ratings_content(&$a) {
-
- if((get_config('system','block_public')) && (! local_channel()) && (! remote_channel())) {
- notice( t('Public access denied.') . EOL);
- return;
- }
-
- $poco_rating = get_config('system','poco_rating_enable');
- // if unset default to enabled
- if($poco_rating === false)
- $poco_rating = true;
-
- if(! $poco_rating)
- return;
-
- $site_target = ((array_key_exists('target',App::$data) && array_key_exists('site_url',App::$data['target'])) ?
- '<a href="' . App::$data['target']['site_url'] . '" >' . App::$data['target']['site_url'] . '</a>' : '');
-
-
- $o = replace_macros(get_markup_template('prep.tpl'),array(
- '$header' => t('Ratings'),
- '$rating_lbl' => t('Rating: ' ),
- '$website' => t('Website: '),
- '$site' => $site_target,
- '$rating_text_lbl' => t('Description: '),
- '$raters' => App::$data['results']
- ));
-
- return $o;
-}
-
- \ No newline at end of file
diff --git a/mod/ratingsearch.php b/mod/ratingsearch.php
deleted file mode 100644
index 173dd39ff..000000000
--- a/mod/ratingsearch.php
+++ /dev/null
@@ -1,70 +0,0 @@
-<?php
-
-
-function ratingsearch_init(&$a) {
-
- $ret = array('success' => false);
-
- $dirmode = intval(get_config('system','directory_mode'));
-
- if($dirmode == DIRECTORY_MODE_NORMAL) {
- $ret['message'] = 'This site is not a directory server.';
- json_return_and_die($ret);
- }
-
- if(argc() > 1)
- $hash = argv(1);
-
- if(! $hash) {
- $ret['message'] = 'No channel identifier';
- json_return_and_die($ret);
- }
-
- if(strpos($hash,'@')) {
- $r = q("select * from hubloc where hubloc_addr = '%s' limit 1",
- dbesc($hash)
- );
- if($r)
- $hash = $r[0]['hubloc_hash'];
- }
-
- $p = q("select * from xchan where xchan_hash like '%s'",
- dbesc($hash . '%')
- );
-
- if($p)
- $target = $p[0]['xchan_hash'];
- else {
- $p = q("select * from site where site_url like '%s' and site_type = %d ",
- dbesc('%' . $hash),
- intval(SITE_TYPE_ZOT)
- );
- if($p) {
- $target = strtolower($hash);
- }
- else {
- $ret['message'] = 'Rating target not found';
- json_return_and_die($ret);
- }
- }
-
- if($p)
- $ret['target'] = $p[0];
-
- $ret['success'] = true;
-
- $r = q("select * from xlink left join xchan on xlink_xchan = xchan_hash
- where xlink_link = '%s' and xlink_rating != 0 and xlink_static = 1 order by xchan_name asc",
- dbesc($target)
- );
-
- if($r) {
- $ret['ratings'] = $r;
- }
- else
- $ret['ratings'] = array();
-
- json_return_and_die($ret);
-
-}
-
diff --git a/mod/rbmark.php b/mod/rbmark.php
deleted file mode 100644
index 979f96f85..000000000
--- a/mod/rbmark.php
+++ /dev/null
@@ -1,115 +0,0 @@
-<?php /** @file */
-
-require_once('include/acl_selectors.php');
-require_once('include/crypto.php');
-require_once('include/items.php');
-require_once('include/taxonomy.php');
-require_once('include/conversation.php');
-require_once('include/zot.php');
-require_once('include/bookmarks.php');
-
-/**
- * remote bookmark
- *
- * https://yoursite/rbmark?f=&title=&url=&private=&remote_return=
- *
- * This can be called via either GET or POST, use POST for long body content as suhosin often limits GET parameter length
- *
- * f= placeholder, often required
- * title= link text
- * url= URL to bookmark
- * ischat=1 if this bookmark is a chatroom
- * private= Don't share this link
- * remote_return= absolute URL to return after posting is finished
- *
- */
-
-function rbmark_post(&$a) {
- if($_POST['submit'] !== t('Save'))
- return;
-
- logger('rbmark_post: ' . print_r($_REQUEST,true));
-
- $channel = App::get_channel();
-
- $t = array('url' => escape_tags($_REQUEST['url']),'term' => escape_tags($_REQUEST['title']));
- bookmark_add($channel,$channel,$t,((x($_REQUEST,'private')) ? intval($_REQUEST['private']) : 0),
- array('menu_id' => ((x($_REQUEST,'menu_id')) ? intval($_REQUEST['menu_id']) : 0),
- 'menu_name' => ((x($_REQUEST,'menu_name')) ? escape_tags($_REQUEST['menu_name']) : ''),
- 'ischat' => ((x($_REQUEST['ischat'])) ? intval($_REQUEST['ischat']) : 0)
- ));
-
- goaway(z_root() . '/bookmarks');
-
-}
-
-
-function rbmark_content(&$a) {
-
- $o = '';
-
- if(! local_channel()) {
-
- // The login procedure is going to bugger our $_REQUEST variables
- // so save them in the session.
-
- if(array_key_exists('url',$_REQUEST)) {
- $_SESSION['bookmark'] = $_REQUEST;
- }
- return login();
- }
-
- // If we have saved rbmark session variables, but nothing in the current $_REQUEST, recover the saved variables
-
- if((! array_key_exists('url',$_REQUEST)) && (array_key_exists('bookmark',$_SESSION))) {
- $_REQUEST = $_SESSION['bookmark'];
- unset($_SESSION['bookmark']);
- }
-
- if($_REQUEST['remote_return']) {
- $_SESSION['remote_return'] = $_REQUEST['remote_return'];
- }
- if(argc() > 1 && argv(1) === 'return') {
- if($_SESSION['remote_return'])
- goaway($_SESSION['remote_return']);
- goaway(z_root() . '/bookmarks');
- }
-
- $channel = App::get_channel();
-
-
- $m = menu_list($channel['channel_id'],'',MENU_BOOKMARK);
-
- $menus = array();
- if($m) {
- $menus = array(0 => '');
- foreach($m as $n) {
- $menus[$n['menu_id']] = $n['menu_name'];
- }
- }
- $menu_select = array('menu_id',t('Select a bookmark folder'),false,'',$menus);
-
-
- $o .= replace_macros(get_markup_template('rbmark.tpl'), array(
-
- '$header' => t('Save Bookmark'),
- '$url' => array('url',t('URL of bookmark'),escape_tags($_REQUEST['url'])),
- '$title' => array('title',t('Description'),escape_tags($_REQUEST['title'])),
- '$ischat' => ((x($_REQUEST,'ischat')) ? intval($_REQUEST['ischat']) : 0),
- '$private' => ((x($_REQUEST,'private')) ? intval($_REQUEST['private']) : 0),
- '$submit' => t('Save'),
- '$menu_name' => array('menu_name',t('Or enter new bookmark folder name'),'',''),
- '$menus' => $menu_select
-
- ));
-
-
-
-
-
-
- return $o;
-
-}
-
-
diff --git a/mod/regdir.php b/mod/regdir.php
deleted file mode 100644
index 7168c3373..000000000
--- a/mod/regdir.php
+++ /dev/null
@@ -1,104 +0,0 @@
-<?php
-
-/**
- * With args, register a directory server for this realm.
- * With no args, return a JSON array of directory servers for this realm.
- *
- * @FIXME Not yet implemented: Some realms may require authentication to join their realm.
- * The RED_GLOBAL realm does not require authentication.
- * We would then need a flag in the site table to indicate that they've been
- * validated by the PRIMARY directory for that realm. Sites claiming to be PRIMARY
- * but are not the realm PRIMARY will be marked invalid.
- *
- * @param App &$a
- */
-function regdir_init(&$a) {
-
- $result = array('success' => false);
-
- $url = $_REQUEST['url'];
- $access_token = $_REQUEST['t'];
- $valid = 0;
-
- // we probably don't need the realm as we will find out in the probe.
- // What we may want to die is throw an error if you're trying to register in a different realm
- // so this configuration issue can be discovered.
-
- $realm = $_REQUEST['realm'];
- if(! $realm)
- $realm = DIRECTORY_REALM;
-
- if($realm === DIRECTORY_REALM) {
- $valid = 1;
- } else {
- $token = get_config('system','realm_token');
- if($token && $access_token != $token) {
- $result['message'] = 'This realm requires an access token';
- return;
- }
- $valid = 1;
- }
-
- $dirmode = intval(get_config('system','directory_mode'));
-
- if ($dirmode == DIRECTORY_MODE_NORMAL) {
- $ret['message'] = t('This site is not a directory server');
- json_return_and_die($ret);
- }
-
- $m = null;
- if ($url) {
- $m = parse_url($url);
-
- if ((! $m) || ((! @dns_get_record($m['host'], DNS_A + DNS_CNAME + DNS_PTR)) && (! filter_var($m['host'], FILTER_VALIDATE_IP) ))) {
-
- $result['message'] = 'unparseable url';
- json_return_and_die($result);
- }
-
- $f = zot_finger('[system]@' . $m['host']);
- if($f['success']) {
- $j = json_decode($f['body'],true);
- if($j['success'] && $j['guid']) {
- $x = import_xchan($j);
- if($x['success']) {
- $result['success'] = true;
- }
- }
- }
-
- if(! $result['success'])
- $valid = 0;
-
- q("update site set site_valid = %d where site_url = '%s' limit 1",
- intval($valid),
- strtolower($url)
- );
-
- json_return_and_die($result);
- } else {
-
- // We can put this in the sql without the condition after 31 august 2015 assuming
- // most directory servers will have updated by then
- // This just makes sure it happens if I forget
-
- $sql_extra = ((datetime_convert() > datetime_convert('UTC','UTC','2015-08-31')) ? ' and site_valid = 1 ' : '' );
- if ($dirmode == DIRECTORY_MODE_STANDALONE) {
- $r = array(array('site_url' => z_root()));
- } else {
- $r = q("select site_url from site where site_flags in ( 1, 2 ) and site_realm = '%s' and site_type = %d $sql_extra ",
- dbesc(get_directory_realm()),
- intval(SITE_TYPE_ZOT)
- );
- }
- if ($r) {
- $result['success'] = true;
- $result['directories'] = array();
- foreach ($r as $rr)
- $result['directories'][] = $rr['site_url'];
-
- json_return_and_die($result);
- }
- }
- json_return_and_die($result);
-} \ No newline at end of file
diff --git a/mod/register.php b/mod/register.php
deleted file mode 100644
index 712691547..000000000
--- a/mod/register.php
+++ /dev/null
@@ -1,264 +0,0 @@
-<?php
-
-require_once('include/identity.php');
-
-function register_init(&$a) {
-
- $result = null;
- $cmd = ((argc() > 1) ? argv(1) : '');
-
- // Provide a stored request for somebody desiring a connection
- // when they first need to register someplace. Once they've
- // created a channel, we'll try to revive the connection request
- // and process it.
-
- if($_REQUEST['connect'])
- $_SESSION['connect'] = $_REQUEST['connect'];
-
- switch($cmd) {
- case 'invite_check.json':
- $result = check_account_invite($_REQUEST['invite_code']);
- break;
- case 'email_check.json':
- $result = check_account_email($_REQUEST['email']);
- break;
- case 'password_check.json':
- $result = check_account_password($_REQUEST['password']);
- break;
- default:
- break;
- }
- if($result) {
- json_return_and_die($result);
- }
-}
-
-
-function register_post(&$a) {
-
- $max_dailies = intval(get_config('system','max_daily_registrations'));
- if($max_dailies) {
- $r = q("select count(account_id) as total from account where account_created > %s - INTERVAL %s",
- db_utcnow(), db_quoteinterval('1 day')
- );
- if($r && $r[0]['total'] >= $max_dailies) {
- notice( t('Maximum daily site registrations exceeded. Please try again tomorrow.') . EOL);
- return;
- }
- }
-
- if(! x($_POST,'tos')) {
- notice( t('Please indicate acceptance of the Terms of Service. Registration failed.') . EOL);
- return;
- }
-
- $policy = get_config('system','register_policy');
-
- $email_verify = get_config('system','verify_email');
-
-
- switch($policy) {
-
- case REGISTER_OPEN:
- $flags = ACCOUNT_OK;
- break;
-
- case REGISTER_APPROVE:
- $flags = ACCOUNT_BLOCKED | ACCOUNT_PENDING;
- break;
-
- default:
- case REGISTER_CLOSED:
- if(! is_site_admin()) {
- notice( t('Permission denied.') . EOL );
- return;
- }
- $flags = ACCOUNT_BLOCKED;
- break;
- }
-
- if($email_verify && $policy == REGISTER_OPEN)
- $flags = $flags | ACCOUNT_UNVERIFIED;
-
-
- if((! $_POST['password']) || ($_POST['password'] !== $_POST['password2'])) {
- notice( t('Passwords do not match.') . EOL);
- return;
- }
-
- $arr = $_POST;
- $arr['account_flags'] = $flags;
-
- $result = create_account($arr);
-
- if(! $result['success']) {
- notice($result['message']);
- return;
- }
- require_once('include/security.php');
-
-
- if($_REQUEST['name'])
- set_aconfig($result['account']['account_id'],'register','channel_name',$_REQUEST['name']);
- if($_REQUEST['nickname'])
- set_aconfig($result['account']['account_id'],'register','channel_address',$_REQUEST['nickname']);
- if($_REQUEST['permissions_role'])
- set_aconfig($result['account']['account_id'],'register','permissions_role',$_REQUEST['permissions_role']);
-
-
- $using_invites = intval(get_config('system','invitation_only'));
- $num_invites = intval(get_config('system','number_invites'));
- $invite_code = ((x($_POST,'invite_code')) ? notags(trim($_POST['invite_code'])) : '');
-
- if($using_invites && $invite_code) {
- q("delete * from register where hash = '%s'", dbesc($invite_code));
- // @FIXME - this also needs to be considered when using 'invites_remaining' in mod/invite.php
- set_aconfig($result['account']['account_id'],'system','invites_remaining',$num_invites);
- }
-
- if($policy == REGISTER_OPEN ) {
- if($email_verify) {
- $res = verify_email_address($result);
- }
- else {
- $res = send_register_success_email($result['email'],$result['password']);
- }
- if($res) {
- info( t('Registration successful. Please check your email for validation instructions.') . EOL ) ;
- }
- }
- elseif($policy == REGISTER_APPROVE) {
- $res = send_reg_approval_email($result);
- if($res) {
- info( t('Your registration is pending approval by the site owner.') . EOL ) ;
- }
- else {
- notice( t('Your registration can not be processed.') . EOL);
- }
- goaway(z_root());
- }
-
- if($email_verify) {
- goaway(z_root());
- }
-
- authenticate_success($result['account'],true,false,true);
-
- $new_channel = false;
- $next_page = 'new_channel';
-
- if(get_config('system','auto_channel_create') || UNO) {
- $new_channel = auto_channel_create($result['account']['account_id']);
- if($new_channel['success']) {
- $channel_id = $new_channel['channel']['channel_id'];
- change_channel($channel_id);
- $next_page = '~';
- }
- else
- $new_channel = false;
- }
-
- $x = get_config('system','workflow_register_next');
- if($x) {
- $next_page = $x;
- $_SESSION['workflow'] = true;
- }
-
- goaway(z_root() . '/' . $next_page);
-
-}
-
-
-
-function register_content(&$a) {
-
- $registration_is = '';
- $other_sites = '';
-
- if(get_config('system','register_policy') == REGISTER_CLOSED) {
- if(get_config('system','directory_mode') == DIRECTORY_MODE_STANDALONE) {
- notice( t('Registration on this hub is disabled.') . EOL);
- return;
- }
-
- require_once('mod/pubsites.php');
- return pubsites_content($a);
- }
-
- if(get_config('system','register_policy') == REGISTER_APPROVE) {
- $registration_is = t('Registration on this hub is by approval only.');
- $other_sites = t('<a href="pubsites">Register at another affiliated hub.</a>');
- }
-
- $max_dailies = intval(get_config('system','max_daily_registrations'));
- if($max_dailies) {
- $r = q("select count(account_id) as total from account where account_created > %s - INTERVAL %s",
- db_utcnow(), db_quoteinterval('1 day')
- );
- if($r && $r[0]['total'] >= $max_dailies) {
- logger('max daily registrations exceeded.');
- notice( t('This site has exceeded the number of allowed daily account registrations. Please try again tomorrow.') . EOL);
- return;
- }
- }
-
- // Configurable terms of service link
-
- $tosurl = get_config('system','tos_url');
- if(! $tosurl)
- $tosurl = z_root() . '/help/TermsOfService';
-
- $toslink = '<a href="' . $tosurl . '" target="_blank">' . t('Terms of Service') . '</a>';
-
- // Configurable whether to restrict age or not - default is based on international legal requirements
- // This can be relaxed if you are on a restricted server that does not share with public servers
-
- if(get_config('system','no_age_restriction'))
- $label_tos = sprintf( t('I accept the %s for this website'), $toslink);
- else
- $label_tos = sprintf( t('I am over 13 years of age and accept the %s for this website'), $toslink);
-
- $enable_tos = 1 - intval(get_config('system','no_termsofservice'));
-
- $email = array('email', t('Your email address'), ((x($_REQUEST,'email')) ? strip_tags(trim($_REQUEST['email'])) : ""));
- $password = array('password', t('Choose a password'), ((x($_REQUEST,'password')) ? trim($_REQUEST['password']) : ""));
- $password2 = array('password2', t('Please re-enter your password'), ((x($_REQUEST,'password2')) ? trim($_REQUEST['password2']) : ""));
- $invite_code = array('invite_code', t('Please enter your invitation code'), ((x($_REQUEST,'invite_code')) ? strip_tags(trim($_REQUEST['invite_code'])) : ""));
- $name = array('name', t('Name or caption'), ((x($_REQUEST,'name')) ? $_REQUEST['name'] : ''), t('Examples: "Bob Jameson", "Lisa and her Horses", "Soccer", "Aviation Group"'));
- $nickhub = '@' . str_replace(array('http://','https://','/'), '', get_config('system','baseurl'));
- $nickname = array('nickname', t('Choose a short nickname'), ((x($_REQUEST,'nickname')) ? $_REQUEST['nickname'] : ''), sprintf( t('Your nickname will be used to create an easy to remember channel address e.g. nickname%s'), $nickhub));
- $privacy_role = ((x($_REQUEST,'permissions_role')) ? $_REQUEST['permissions_role'] : "");
- $role = array('permissions_role' , t('Channel role and privacy'), ($privacy_role) ? $privacy_role : 'social', t('Select a channel role with your privacy requirements.') . ' <a href="help/roles" target="_blank">' . t('Read more about roles') . '</a>',get_roles());
- $tos = array('tos', $label_tos, '', '', array(t('no'),t('yes')));
-
- $auto_create = ((UNO) || (get_config('system','auto_channel_create')) ? true : false);
- $default_role = ((UNO) ? 'social' : get_config('system','default_permissions_role'));
-
- require_once('include/bbcode.php');
-
- $o = replace_macros(get_markup_template('register.tpl'), array(
-
- '$title' => t('Registration'),
- '$reg_is' => $registration_is,
- '$registertext' => bbcode(get_config('system','register_text')),
- '$other_sites' => $other_sites,
- '$invitations' => get_config('system','invitation_only'),
- '$invite_desc' => t('Membership on this site is by invitation only.'),
- '$invite_code' => $invite_code,
- '$auto_create' => $auto_create,
- '$name' => $name,
- '$role' => $role,
- '$default_role' => $default_role,
- '$nickname' => $nickname,
- '$enable_tos' => $enable_tos,
- '$tos' => $tos,
- '$email' => $email,
- '$pass1' => $password,
- '$pass2' => $password2,
- '$submit' => ((UNO || $auto_create || $registration_is) ? t('Register') : t('Proceed to create your first channel'))
- ));
-
- return $o;
-
-}
-
diff --git a/mod/regmod.php b/mod/regmod.php
deleted file mode 100644
index d500de0dc..000000000
--- a/mod/regmod.php
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php
-
-
-function regmod_content(&$a) {
-
- global $lang;
-
- $_SESSION['return_url'] = App::$cmd;
-
- if(! local_channel()) {
- info( t('Please login.') . EOL);
- $o .= '<br /><br />' . login((App::$config['system']['register_policy'] == REGISTER_CLOSED) ? 0 : 1);
- return $o;
- }
-
- if(! is_site_admin()) {
- notice( t('Permission denied.') . EOL);
- return '';
- }
-
- if(argc() != 3)
- killme();
-
- $cmd = argv(1);
- $hash = argv(2);
-
- if($cmd === 'deny') {
- if (! account_deny($hash)) killme();
- }
-
- if($cmd === 'allow') {
- if (! account_allow($hash)) killme();
- }
-}
diff --git a/mod/regver.php b/mod/regver.php
deleted file mode 100644
index a26843376..000000000
--- a/mod/regver.php
+++ /dev/null
@@ -1,22 +0,0 @@
-<?php
-
-function regver_content(&$a) {
-
- global $lang;
-
- $_SESSION['return_url'] = App::$cmd;
-
- if(argc() != 3)
- killme();
-
- $cmd = argv(1);
- $hash = argv(2);
-
- if($cmd === 'deny') {
- if (! account_deny($hash)) killme();
- }
-
- if($cmd === 'allow') {
- if (! account_approve($hash)) killme();
- }
-}
diff --git a/mod/removeaccount.php b/mod/removeaccount.php
deleted file mode 100644
index b4c2bad33..000000000
--- a/mod/removeaccount.php
+++ /dev/null
@@ -1,66 +0,0 @@
-<?php
-
-function removeaccount_post(&$a) {
-
- if(! local_channel())
- return;
-
- if($_SESSION['delegate'])
- return;
-
- if((! x($_POST,'qxz_password')) || (! strlen(trim($_POST['qxz_password']))))
- return;
-
- if((! x($_POST,'verify')) || (! strlen(trim($_POST['verify']))))
- return;
-
- if($_POST['verify'] !== $_SESSION['remove_account_verify'])
- return;
-
-
- $account = App::get_account();
- $account_id = get_account_id();
-
- if(! account_verify_password($account['account_email'],$_POST['qxz_password']))
- return;
-
- if($account['account_password_changed'] != NULL_DATE) {
- $d1 = datetime_convert('UTC','UTC','now - 48 hours');
- if($account['account_password_changed'] > d1) {
- notice( t('Account removals are not allowed within 48 hours of changing the account password.') . EOL);
- return;
- }
- }
-
- require_once('include/Contact.php');
-
- $global_remove = intval($_POST['global']);
-
- account_remove($account_id,true);
-
-}
-
-
-
-function removeaccount_content(&$a) {
-
- if(! local_channel())
- goaway(z_root());
-
- $hash = random_string();
-
- $_SESSION['remove_account_verify'] = $hash;
- $tpl = get_markup_template('removeaccount.tpl');
- $o .= replace_macros($tpl, array(
- '$basedir' => z_root(),
- '$hash' => $hash,
- '$title' => t('Remove This Account'),
- '$desc' => array(t('WARNING: '), t('This account and all its channels will be completely removed from the network. '), t('This action is permanent and can not be undone!')),
- '$passwd' => t('Please enter your password for verification:'),
- '$global' => array('global', t('Remove this account, all its channels and all its channel clones from the network'), false, t('By default only the instances of the channels located on this hub will be removed from the network')),
- '$submit' => t('Remove Account')
- ));
-
- return $o;
-
-}
diff --git a/mod/removeme.php b/mod/removeme.php
deleted file mode 100644
index ab1d5fe4f..000000000
--- a/mod/removeme.php
+++ /dev/null
@@ -1,66 +0,0 @@
-<?php
-
-function removeme_post(&$a) {
-
- if(! local_channel())
- return;
-
- if($_SESSION['delegate'])
- return;
-
- if((! x($_POST,'qxz_password')) || (! strlen(trim($_POST['qxz_password']))))
- return;
-
- if((! x($_POST,'verify')) || (! strlen(trim($_POST['verify']))))
- return;
-
- if($_POST['verify'] !== $_SESSION['remove_account_verify'])
- return;
-
-
- $account = App::get_account();
-
- if(! account_verify_password($account['account_email'],$_POST['qxz_password']))
- return;
-
- if($account['account_password_changed'] != NULL_DATE) {
- $d1 = datetime_convert('UTC','UTC','now - 48 hours');
- if($account['account_password_changed'] > d1) {
- notice( t('Channel removals are not allowed within 48 hours of changing the account password.') . EOL);
- return;
- }
- }
-
- require_once('include/Contact.php');
-
- $global_remove = intval($_POST['global']);
-
- channel_remove(local_channel(),1 - $global_remove,true);
-
-}
-
-
-
-function removeme_content(&$a) {
-
- if(! local_channel())
- goaway(z_root());
-
- $hash = random_string();
-
- $_SESSION['remove_account_verify'] = $hash;
-
- $tpl = get_markup_template('removeme.tpl');
- $o .= replace_macros($tpl, array(
- '$basedir' => z_root(),
- '$hash' => $hash,
- '$title' => t('Remove This Channel'),
- '$desc' => array(t('WARNING: '), t('This channel will be completely removed from the network. '), t('This action is permanent and can not be undone!')),
- '$passwd' => t('Please enter your password for verification:'),
- '$global' => array('global', t('Remove this channel and all its clones from the network'), false, t('By default only the instance of the channel located on this hub will be removed from the network'), array(t('No'),t('Yes'))),
- '$submit' => t('Remove Channel')
- ));
-
- return $o;
-
-}
diff --git a/mod/rmagic.php b/mod/rmagic.php
deleted file mode 100644
index 6a47b495a..000000000
--- a/mod/rmagic.php
+++ /dev/null
@@ -1,90 +0,0 @@
-<?php
-
-
-function rmagic_init(&$a) {
-
- if(local_channel())
- goaway(z_root());
-
- $me = get_my_address();
- if($me) {
- $r = q("select hubloc_url from hubloc where hubloc_addr = '%s' limit 1",
- dbesc($me)
- );
- if($r) {
- if($r[0]['hubloc_url'] === z_root())
- goaway(z_root() . '/login');
- $dest = z_root() . '/' . str_replace('zid=','zid_=',App::$query_string);
- goaway($r[0]['hubloc_url'] . '/magic' . '?f=&dest=' . $dest);
- }
- }
-}
-
-function rmagic_post(&$a) {
-
- $address = trim($_REQUEST['address']);
-
- if(strpos($address,'@') === false) {
- $arr = array('address' => $address);
- call_hooks('reverse_magic_auth', $arr);
-
- try {
- require_once('library/openid/openid.php');
- $openid = new LightOpenID(z_root());
- $openid->identity = $address;
- $openid->returnUrl = z_root() . '/openid';
- $openid->required = array('namePerson/friendly', 'namePerson');
- $openid->optional = array('namePerson/first','media/image/aspect11','media/image/default');
- goaway($openid->authUrl());
- } catch (Exception $e) {
- notice( t('We encountered a problem while logging in with the OpenID you provided. Please check the correct spelling of the ID.').'<br /><br >'. t('The error message was:').' '.$e->getMessage());
- }
-
- // if they're still here...
- notice( t('Authentication failed.') . EOL);
- return;
- }
- else {
-
- // Presumed Red identity. Perform reverse magic auth
-
- if(strpos($address,'@') === false) {
- notice('Invalid address.');
- return;
- }
-
- $r = null;
- if($address) {
- $r = q("select hubloc_url from hubloc where hubloc_addr = '%s' limit 1",
- dbesc($address)
- );
- }
- if($r) {
- $url = $r[0]['hubloc_url'];
- }
- else {
- $url = 'https://' . substr($address,strpos($address,'@')+1);
- }
-
- if($url) {
- if($_SESSION['return_url'])
- $dest = urlencode(z_root() . '/' . str_replace('zid=','zid_=',$_SESSION['return_url']));
- else
- $dest = urlencode(z_root() . '/' . str_replace('zid=','zid_=',App::$query_string));
-
- goaway($url . '/magic' . '?f=&dest=' . $dest);
- }
- }
-}
-
-
-function rmagic_content(&$a) {
-
- $o = replace_macros(get_markup_template('rmagic.tpl'),array(
- '$title' => t('Remote Authentication'),
- '$desc' => t('Enter your channel address (e.g. channel@example.com)'),
- '$submit' => t('Authenticate')
- ));
- return $o;
-
-} \ No newline at end of file
diff --git a/mod/rpost.php b/mod/rpost.php
deleted file mode 100644
index 3e036cac6..000000000
--- a/mod/rpost.php
+++ /dev/null
@@ -1,138 +0,0 @@
-<?php /** @file */
-
-require_once('include/acl_selectors.php');
-require_once('include/crypto.php');
-require_once('include/items.php');
-require_once('include/taxonomy.php');
-require_once('include/conversation.php');
-require_once('include/zot.php');
-
-/**
- * remote post
- *
- * https://yoursite/rpost?f=&title=&body=&remote_return=
- *
- * This can be called via either GET or POST, use POST for long body content as suhosin often limits GET parameter length
- *
- * f= placeholder, often required
- * title= Title of post
- * body= Body of post
- * url= URL which will be parsed and the results appended to the body
- * source= Source application
- * remote_return= absolute URL to return after posting is finished
- * type= choices are 'html' or 'bbcode', default is 'bbcode'
- *
- */
-
-
-
-function rpost_content(&$a) {
-
- $o = '';
-
- if(! local_channel()) {
- if(remote_channel()) {
- // redirect to your own site.
- // We can only do this with a GET request so you'll need to keep the text short or risk getting truncated
- // by the wretched beast called 'suhosin'. All the browsers now allow long GET requests, but suhosin
- // blocks them.
-
- $url = get_rpost_path(App::get_observer());
- // make sure we're not looping to our own hub
- if(($url) && (! stristr($url, App::get_hostname()))) {
- foreach($_REQUEST as $key => $arg) {
- $url .= '&' . $key . '=' . $arg;
- }
- goaway($url);
- }
- }
-
- // The login procedure is going to bugger our $_REQUEST variables
- // so save them in the session.
-
- if(array_key_exists('body',$_REQUEST)) {
- $_SESSION['rpost'] = $_REQUEST;
- }
- return login();
- }
-
- // If we have saved rpost session variables, but nothing in the current $_REQUEST, recover the saved variables
-
- if((! array_key_exists('body',$_REQUEST)) && (array_key_exists('rpost',$_SESSION))) {
- $_REQUEST = $_SESSION['rpost'];
- unset($_SESSION['rpost']);
- }
-
- if(array_key_exists('channel',$_REQUEST)) {
- $r = q("select channel_id from channel where channel_account_id = %d and channel_address = '%s' limit 1",
- intval(get_account_id()),
- dbesc($_REQUEST['channel'])
- );
- if($r) {
- require_once('include/security.php');
- $change = change_channel($r[0]['channel_id']);
- }
- }
-
- if($_REQUEST['remote_return']) {
- $_SESSION['remote_return'] = $_REQUEST['remote_return'];
- }
- if(argc() > 1 && argv(1) === 'return') {
- if($_SESSION['remote_return'])
- goaway($_SESSION['remote_return']);
- goaway(z_root() . '/network');
- }
-
- $plaintext = true;
-// if(feature_enabled(local_channel(),'richtext'))
-// $plaintext = false;
-
- if(array_key_exists('type', $_REQUEST) && $_REQUEST['type'] === 'html') {
- require_once('include/html2bbcode.php');
- $_REQUEST['body'] = html2bbcode($_REQUEST['body']);
- }
-
- $channel = App::get_channel();
-
-
- $acl = new Zotlabs\Access\AccessList($channel);
-
- $channel_acl = $acl->get();
-
- if($_REQUEST['url']) {
- $x = z_fetch_url(z_root() . '/linkinfo?f=&url=' . urlencode($_REQUEST['url']));
- if($x['success'])
- $_REQUEST['body'] = $_REQUEST['body'] . $x['body'];
- }
-
- $x = array(
- 'is_owner' => true,
- 'allow_location' => ((intval(get_pconfig($channel['channel_id'],'system','use_browser_location'))) ? '1' : ''),
- 'default_location' => $channel['channel_location'],
- 'nickname' => $channel['channel_address'],
- 'lockstate' => (($acl->is_private()) ? 'lock' : 'unlock'),
- 'acl' => populate_acl($channel_acl,true,(($channel['channel_r_stream'] & PERMS_PUBLIC) ? t('Public') : '')),
- 'bang' => '',
- 'visitor' => true,
- 'profile_uid' => local_channel(),
- 'title' => $_REQUEST['title'],
- 'body' => $_REQUEST['body'],
- 'attachment' => $_REQUEST['attachment'],
- 'source' => ((x($_REQUEST,'source')) ? strip_tags($_REQUEST['source']) : ''),
- 'return_path' => 'rpost/return',
- 'bbco_autocomplete' => 'bbcode',
- 'bbcode' => true
- );
-
- $editor = status_editor($a,$x);
-
- $o .= replace_macros(get_markup_template('edpost_head.tpl'), array(
- '$title' => t('Edit post'),
- '$editor' => $editor
- ));
-
- return $o;
-
-}
-
-
diff --git a/mod/rsd_xml.php b/mod/rsd_xml.php
deleted file mode 100644
index 4ce82dbe0..000000000
--- a/mod/rsd_xml.php
+++ /dev/null
@@ -1,24 +0,0 @@
-<?php
-
-// What do we need this for?
-
-function rsd_xml_content(&$a) {
- header ("Content-Type: text/xml");
- echo '<?xml version="1.0" encoding="UTF-8"?>
- <rsd version="1.0" xmlns="http://archipelago.phrasewise.com/rsd">
- <service>
- <engineName>Red</engineName>
- <engineLink>http://friendica.com/</engineLink>
- <apis>
- <api name="Twitter" preferred="true" apiLink="'.z_root().'/api/" blogID="">
- <settings>
- <docs>http://status.net/wiki/TwitterCompatibleAPI</docs>
- <setting name="OAuth">false</setting>
- </settings>
- </api>
- </apis>
- </service>
- </rsd>
- ';
-die();
-} \ No newline at end of file
diff --git a/mod/search.php b/mod/search.php
deleted file mode 100644
index 37bd00a66..000000000
--- a/mod/search.php
+++ /dev/null
@@ -1,222 +0,0 @@
-<?php
-
-function search_init(&$a) {
- if(x($_REQUEST,'search'))
- App::$data['search'] = $_REQUEST['search'];
-}
-
-
-function search_content(&$a,$update = 0, $load = false) {
-
- if((get_config('system','block_public')) || (get_config('system','block_public_search'))) {
- if ((! local_channel()) && (! remote_channel())) {
- notice( t('Public access denied.') . EOL);
- return;
- }
- }
-
- if($load)
- $_SESSION['loadtime'] = datetime_convert();
-
- nav_set_selected('search');
-
- require_once("include/bbcode.php");
- require_once('include/security.php');
- require_once('include/conversation.php');
- require_once('include/items.php');
-
- $format = (($_REQUEST['format']) ? $_REQUEST['format'] : '');
- if($format !== '') {
- $update = $load = 1;
- }
-
- $observer = App::get_observer();
- $observer_hash = (($observer) ? $observer['xchan_hash'] : '');
-
- $o = '<div id="live-search"></div>' . "\r\n";
-
- $o = '<div class="generic-content-wrapper-styled">' . "\r\n";
-
- $o .= '<h3>' . t('Search') . '</h3>';
-
- if(x(App::$data,'search'))
- $search = trim(App::$data['search']);
- else
- $search = ((x($_GET,'search')) ? trim(rawurldecode($_GET['search'])) : '');
-
- $tag = false;
- if(x($_GET,'tag')) {
- $tag = true;
- $search = ((x($_GET,'tag')) ? trim(rawurldecode($_GET['tag'])) : '');
- }
-
- if((! local_channel()) || (! feature_enabled(local_channel(),'savedsearch')))
- $o .= search($search,'search-box','/search',((local_channel()) ? true : false));
-
- if(strpos($search,'#') === 0) {
- $tag = true;
- $search = substr($search,1);
- }
- if(strpos($search,'@') === 0) {
- $search = substr($search,1);
- goaway(z_root() . '/directory' . '?f=1&navsearch=1&search=' . $search);
- }
- if(strpos($search,'?') === 0) {
- $search = substr($search,1);
- goaway(z_root() . '/help' . '?f=1&navsearch=1&search=' . $search);
- }
-
- // look for a naked webbie
- if(strpos($search,'@') !== false) {
- goaway(z_root() . '/directory' . '?f=1&navsearch=1&search=' . $search);
- }
-
- if(! $search)
- return $o;
-
- if($tag) {
- $sql_extra = sprintf(" AND `item`.`id` IN (select `oid` from term where otype = %d and type in ( %d , %d) and term = '%s') ",
- intval(TERM_OBJ_POST),
- intval(TERM_HASHTAG),
- intval(TERM_COMMUNITYTAG),
- dbesc(protect_sprintf($search))
- );
- }
- else {
- $regstr = db_getfunc('REGEXP');
- $sql_extra = sprintf(" AND `item`.`body` $regstr '%s' ", dbesc(protect_sprintf(preg_quote($search))));
- }
-
- // Here is the way permissions work in the search module...
- // Only public posts can be shown
- // OR your own posts if you are a logged in member
- // No items will be shown if the member has a blocked profile wall.
-
- if((! $update) && (! $load)) {
-
- // This is ugly, but we can't pass the profile_uid through the session to the ajax updater,
- // because browser prefetching might change it on us. We have to deliver it with the page.
-
- $o .= '<div id="live-search"></div>' . "\r\n";
- $o .= "<script> var profile_uid = " . ((intval(local_channel())) ? local_channel() : (-1))
- . "; var netargs = '?f='; var profile_page = " . App::$pager['page'] . "; </script>\r\n";
-
- App::$page['htmlhead'] .= replace_macros(get_markup_template("build_query.tpl"),array(
- '$baseurl' => z_root(),
- '$pgtype' => 'search',
- '$uid' => ((App::$profile['profile_uid']) ? App::$profile['profile_uid'] : '0'),
- '$gid' => '0',
- '$cid' => '0',
- '$cmin' => '0',
- '$cmax' => '0',
- '$star' => '0',
- '$liked' => '0',
- '$conv' => '0',
- '$spam' => '0',
- '$fh' => '0',
- '$nouveau' => '0',
- '$wall' => '0',
- '$list' => ((x($_REQUEST,'list')) ? intval($_REQUEST['list']) : 0),
- '$page' => ((App::$pager['page'] != 1) ? App::$pager['page'] : 1),
- '$search' => (($tag) ? urlencode('#') : '') . $search,
- '$order' => '',
- '$file' => '',
- '$cats' => '',
- '$tags' => '',
- '$mid' => '',
- '$verb' => '',
- '$dend' => '',
- '$dbegin' => ''
- ));
-
-
- }
-
- $item_normal = item_normal();
- $pub_sql = public_permissions_sql($observer_hash);
-
- require_once('include/identity.php');
-
- $sys = get_sys_channel();
-
- if(($update) && ($load)) {
- $itemspage = get_pconfig(local_channel(),'system','itemspage');
- App::set_pager_itemspage(((intval($itemspage)) ? $itemspage : 20));
- $pager_sql = sprintf(" LIMIT %d OFFSET %d ", intval(App::$pager['itemspage']), intval(App::$pager['start']));
-
- // in case somebody turned off public access to sys channel content with permissions
-
- if(! perm_is_allowed($sys['channel_id'],$observer_hash,'view_stream'))
- $sys['xchan_hash'] .= 'disabled';
-
- if($load) {
- $r = null;
-
- if(ACTIVE_DBTYPE == DBTYPE_POSTGRES) {
- $prefix = 'distinct on (created, mid)';
- $suffix = 'ORDER BY created DESC, mid';
- } else {
- $prefix = 'distinct';
- $suffix = 'group by mid ORDER BY created DESC';
- }
- if(local_channel()) {
- $r = q("SELECT $prefix mid, item.id as item_id, item.* from item
- WHERE ((( `item`.`allow_cid` = '' AND `item`.`allow_gid` = '' AND `item`.`deny_cid` = '' AND `item`.`deny_gid` = '' AND item_private = 0 )
- OR ( `item`.`uid` = %d )) OR item.owner_xchan = '%s' )
- $item_normal
- $sql_extra
- $suffix $pager_sql ",
- intval(local_channel()),
- dbesc($sys['xchan_hash'])
- );
- }
- if($r === null) {
- $r = q("SELECT $prefix mid, item.id as item_id, item.* from item
- WHERE (((( `item`.`allow_cid` = '' AND `item`.`allow_gid` = '' AND `item`.`deny_cid` = ''
- AND `item`.`deny_gid` = '' AND item_private = 0 )
- and owner_xchan in ( " . stream_perms_xchans(($observer) ? (PERMS_NETWORK|PERMS_PUBLIC) : PERMS_PUBLIC) . " ))
- $pub_sql ) OR owner_xchan = '%s')
- $item_normal
- $sql_extra
- $suffix $pager_sql",
- dbesc($sys['xchan_hash'])
- );
- }
- }
- else {
- $r = array();
- }
- }
-
- if($r) {
- xchan_query($r);
- $items = fetch_post_tags($r,true);
- } else {
- $items = array();
- }
-
-
- if($format == 'json') {
- $result = array();
- require_once('include/conversation.php');
- foreach($items as $item) {
- $item['html'] = bbcode($item['body']);
- $x = encode_item($item);
- $x['html'] = prepare_text($item['body'],$item['mimetype']);
- $result[] = $x;
- }
- json_return_and_die(array('success' => true,'messages' => $result));
- }
-
- if($tag)
- $o .= '<h2>' . sprintf( t('Items tagged with: %s'),htmlspecialchars($search, ENT_COMPAT,'UTF-8')) . '</h2>';
- else
- $o .= '<h2>' . sprintf( t('Search results for: %s'),htmlspecialchars($search, ENT_COMPAT,'UTF-8')) . '</h2>';
-
- $o .= conversation($a,$items,'search',$update,'client');
-
- $o .= '</div>';
-
- return $o;
-}
-
diff --git a/mod/search_ac.php b/mod/search_ac.php
deleted file mode 100644
index 6ffdc6ed5..000000000
--- a/mod/search_ac.php
+++ /dev/null
@@ -1,76 +0,0 @@
-<?php
-
-// Autocomplete for saved searches. Should probably be put in the same place as the other autocompletes
-function search_ac_init(&$a){
- if(!local_channel())
- killme();
-
-
- $start = (x($_REQUEST,'start')?$_REQUEST['start']:0);
- $count = (x($_REQUEST,'count')?$_REQUEST['count']:100);
- $search = (x($_REQUEST,'search')?$_REQUEST['search']:"");
-
- if(x($_REQUEST,'query') && strlen($_REQUEST['query'])) {
- $search = $_REQUEST['query'];
- }
-
- // Priority to people searches
-
- if ($search) {
- $people_sql_extra = protect_sprintf(" AND `xchan_name` LIKE '%". dbesc($search) . "%' ");
- $tag_sql_extra = protect_sprintf(" AND term LIKE '%". dbesc($search) . "%' ");
- }
-
-
- $r = q("SELECT `abook_id`, `xchan_name`, `xchan_photo_s`, `xchan_url`, `xchan_addr` FROM `abook` left join xchan on abook_xchan = xchan_hash WHERE abook_channel = %d
- $people_sql_extra
- ORDER BY `xchan_name` ASC ",
- intval(local_channel())
- );
-
- $results = array();
- if($r) {
- foreach($r as $g) {
- $results[] = array(
- "photo" => $g['xchan_photo_s'],
- "name" => '@'.$g['xchan_name'],
- "id" => $g['abook_id'],
- "link" => $g['xchan_url'],
- "label" => '',
- "nick" => '',
- );
- }
- }
-
- $r = q("select distinct term, tid, url from term where type in ( %d, %d ) $tag_sql_extra group by term order by term asc",
- intval(TERM_HASHTAG),
- intval(TERM_COMMUNITYTAG)
- );
-
- if(count($r)) {
- foreach($r as $g) {
- $results[] = array(
- "photo" => z_root() . '/images/hashtag.png',
- "name" => '#'.$g['term'],
- "id" => $g['tid'],
- "link" => $g['url'],
- "label" => '',
- "nick" => '',
- );
- }
- }
-
- header("content-type: application/json");
- $o = array(
- 'start' => $start,
- 'count' => $count,
- 'items' => $results,
- );
- echo json_encode($o);
-
- logger('search_ac: ' . print_r($x,true));
-
- killme();
-}
-
-
diff --git a/mod/service_limits.php b/mod/service_limits.php
deleted file mode 100644
index 8ce410ab6..000000000
--- a/mod/service_limits.php
+++ /dev/null
@@ -1,23 +0,0 @@
-<?php /** @file */
-
-
-function service_limits_content(&$a) {
-
- if(! local_channel()) {
- notice( t('Permission denied.') . EOL);
- return;
- }
-
- $account = App::get_account();
- if($account['account_service_class']) {
- $x = get_config('service_class',$account['account_service_class']);
- if($x) {
- $o = print_r($x,true);
- return $o;
- }
- }
- return t('No service class restrictions found.');
-}
-
-
- \ No newline at end of file
diff --git a/mod/settings.php b/mod/settings.php
deleted file mode 100644
index dbb381191..000000000
--- a/mod/settings.php
+++ /dev/null
@@ -1,1144 +0,0 @@
-<?php /** @file */
-
-require_once('include/zot.php');
-
-function get_theme_config_file($theme){
-
- $base_theme = App::$theme_info['extends'];
-
- if (file_exists("view/theme/$theme/php/config.php")){
- return "view/theme/$theme/php/config.php";
- }
- if (file_exists("view/theme/$base_theme/php/config.php")){
- return "view/theme/$base_theme/php/config.php";
- }
- return null;
-}
-
-function settings_init(&$a) {
- if(! local_channel())
- return;
-
- if($_SESSION['delegate'])
- return;
-
- App::$profile_uid = local_channel();
-
- // default is channel settings in the absence of other arguments
-
- if(argc() == 1) {
- // We are setting these values - don't use the argc(), argv() functions here
- App::$argc = 2;
- App::$argv[] = 'channel';
- }
-
-
-
-}
-
-
-function settings_post(&$a) {
-
- if(! local_channel())
- return;
-
- if($_SESSION['delegate'])
- return;
-
- $channel = App::get_channel();
-
- logger('mod_settings: ' . print_r($_REQUEST,true));
-
-
- if((argc() > 1) && (argv(1) === 'oauth') && x($_POST,'remove')){
- check_form_security_token_redirectOnErr('/settings/oauth', 'settings_oauth');
-
- $key = $_POST['remove'];
- q("DELETE FROM tokens WHERE id='%s' AND uid=%d",
- dbesc($key),
- local_channel());
- goaway(z_root()."/settings/oauth/");
- return;
- }
-
- if((argc() > 2) && (argv(1) === 'oauth') && (argv(2) === 'edit'||(argv(2) === 'add')) && x($_POST,'submit')) {
-
- check_form_security_token_redirectOnErr('/settings/oauth', 'settings_oauth');
-
- $name = ((x($_POST,'name')) ? $_POST['name'] : '');
- $key = ((x($_POST,'key')) ? $_POST['key'] : '');
- $secret = ((x($_POST,'secret')) ? $_POST['secret'] : '');
- $redirect = ((x($_POST,'redirect')) ? $_POST['redirect'] : '');
- $icon = ((x($_POST,'icon')) ? $_POST['icon'] : '');
- $ok = true;
- if($name == '') {
- $ok = false;
- notice( t('Name is required') . EOL);
- }
- if($key == '' || $secret == '') {
- $ok = false;
- notice( t('Key and Secret are required') . EOL);
- }
-
- if($ok) {
- if ($_POST['submit']==t("Update")){
- $r = q("UPDATE clients SET
- client_id='%s',
- pw='%s',
- name='%s',
- redirect_uri='%s',
- icon='%s',
- uid=%d
- WHERE client_id='%s'",
- dbesc($key),
- dbesc($secret),
- dbesc($name),
- dbesc($redirect),
- dbesc($icon),
- intval(local_channel()),
- dbesc($key));
- } else {
- $r = q("INSERT INTO clients (client_id, pw, name, redirect_uri, icon, uid)
- VALUES ('%s','%s','%s','%s','%s',%d)",
- dbesc($key),
- dbesc($secret),
- dbesc($name),
- dbesc($redirect),
- dbesc($icon),
- intval(local_channel())
- );
- $r = q("INSERT INTO xperm (xp_client, xp_channel, xp_perm) VALUES ('%s', %d, '%s') ",
- dbesc($key),
- intval(local_channel()),
- dbesc('all')
- );
- }
- }
- goaway(z_root()."/settings/oauth/");
- return;
- }
-
- if((argc() > 1) && (argv(1) == 'featured')) {
- check_form_security_token_redirectOnErr('/settings/featured', 'settings_featured');
-
- call_hooks('feature_settings_post', $_POST);
-
- build_sync_packet();
- return;
- }
-
-
-
- if((argc() > 1) && (argv(1) === 'features')) {
- check_form_security_token_redirectOnErr('/settings/features', 'settings_features');
-
- // Build list of features and check which are set
- $features = get_features();
- $all_features = array();
- foreach($features as $k => $v) {
- foreach($v as $f)
- $all_features[] = $f[0];
- }
- foreach($all_features as $k) {
- if(x($_POST,"feature_$k"))
- set_pconfig(local_channel(),'feature',$k, 1);
- else
- set_pconfig(local_channel(),'feature',$k, 0);
- }
- build_sync_packet();
- return;
- }
-
- if((argc() > 1) && (argv(1) == 'display')) {
-
- check_form_security_token_redirectOnErr('/settings/display', 'settings_display');
-
- $theme = ((x($_POST,'theme')) ? notags(trim($_POST['theme'])) : App::$channel['channel_theme']);
- $mobile_theme = ((x($_POST,'mobile_theme')) ? notags(trim($_POST['mobile_theme'])) : '');
- $preload_images = ((x($_POST,'preload_images')) ? intval($_POST['preload_images']) : 0);
- $user_scalable = ((x($_POST,'user_scalable')) ? intval($_POST['user_scalable']) : 0);
- $nosmile = ((x($_POST,'nosmile')) ? intval($_POST['nosmile']) : 0);
- $title_tosource = ((x($_POST,'title_tosource')) ? intval($_POST['title_tosource']) : 0);
- $channel_list_mode = ((x($_POST,'channel_list_mode')) ? intval($_POST['channel_list_mode']) : 0);
- $network_list_mode = ((x($_POST,'network_list_mode')) ? intval($_POST['network_list_mode']) : 0);
-
- $channel_divmore_height = ((x($_POST,'channel_divmore_height')) ? intval($_POST['channel_divmore_height']) : 400);
- if($channel_divmore_height < 50)
- $channel_divmore_height = 50;
- $network_divmore_height = ((x($_POST,'network_divmore_height')) ? intval($_POST['network_divmore_height']) : 400);
- if($network_divmore_height < 50)
- $network_divmore_height = 50;
-
- $browser_update = ((x($_POST,'browser_update')) ? intval($_POST['browser_update']) : 0);
- $browser_update = $browser_update * 1000;
- if($browser_update < 10000)
- $browser_update = 10000;
-
- $itemspage = ((x($_POST,'itemspage')) ? intval($_POST['itemspage']) : 20);
- if($itemspage > 100)
- $itemspage = 100;
-
-
- if ($mobile_theme == "---")
- del_pconfig(local_channel(),'system','mobile_theme');
- else {
- set_pconfig(local_channel(),'system','mobile_theme',$mobile_theme);
- }
-
- set_pconfig(local_channel(),'system','preload_images',$preload_images);
- set_pconfig(local_channel(),'system','user_scalable',$user_scalable);
- set_pconfig(local_channel(),'system','update_interval', $browser_update);
- set_pconfig(local_channel(),'system','itemspage', $itemspage);
- set_pconfig(local_channel(),'system','no_smilies',1-intval($nosmile));
- set_pconfig(local_channel(),'system','title_tosource',$title_tosource);
- set_pconfig(local_channel(),'system','channel_list_mode', $channel_list_mode);
- set_pconfig(local_channel(),'system','network_list_mode', $network_list_mode);
- set_pconfig(local_channel(),'system','channel_divmore_height', $channel_divmore_height);
- set_pconfig(local_channel(),'system','network_divmore_height', $network_divmore_height);
-
- if ($theme == App::$channel['channel_theme']){
- // call theme_post only if theme has not been changed
- if( ($themeconfigfile = get_theme_config_file($theme)) != null){
- require_once($themeconfigfile);
- theme_post($a);
- }
- }
-
- $r = q("UPDATE channel SET channel_theme = '%s' WHERE channel_id = %d",
- dbesc($theme),
- intval(local_channel())
- );
-
- call_hooks('display_settings_post', $_POST);
- build_sync_packet();
- goaway(z_root() . '/settings/display' );
- return; // NOTREACHED
- }
-
-
- if(argc() > 1 && argv(1) === 'account') {
-
- check_form_security_token_redirectOnErr('/settings/account', 'settings_account');
-
- call_hooks('account_settings_post', $_POST);
-// call_hooks('settings_account', $_POST);
-
- $errs = array();
-
- $email = ((x($_POST,'email')) ? trim(notags($_POST['email'])) : '');
- $account = App::get_account();
- if($email != $account['account_email']) {
- if(! valid_email($email))
- $errs[] = t('Not valid email.');
- $adm = trim(get_config('system','admin_email'));
- if(($adm) && (strcasecmp($email,$adm) == 0)) {
- $errs[] = t('Protected email address. Cannot change to that email.');
- $email = App::$user['email'];
- }
- if(! $errs) {
- $r = q("update account set account_email = '%s' where account_id = %d",
- dbesc($email),
- intval($account['account_id'])
- );
- if(! $r)
- $errs[] = t('System failure storing new email. Please try again.');
- }
- }
-
- if($errs) {
- foreach($errs as $err)
- notice($err . EOL);
- $errs = array();
- }
-
-
- if((x($_POST,'npassword')) || (x($_POST,'confirm'))) {
-
- $origpass = trim($_POST['origpass']);
-
- require_once('include/auth.php');
- if(! account_verify_password($email,$origpass)) {
- $errs[] = t('Password verification failed.');
- }
-
- $newpass = trim($_POST['npassword']);
- $confirm = trim($_POST['confirm']);
-
- if($newpass != $confirm ) {
- $errs[] = t('Passwords do not match. Password unchanged.');
- }
-
- if((! x($newpass)) || (! x($confirm))) {
- $errs[] = t('Empty passwords are not allowed. Password unchanged.');
- }
-
- if(! $errs) {
- $salt = random_string(32);
- $password_encoded = hash('whirlpool', $salt . $newpass);
- $r = q("update account set account_salt = '%s', account_password = '%s', account_password_changed = '%s'
- where account_id = %d",
- dbesc($salt),
- dbesc($password_encoded),
- dbesc(datetime_convert()),
- intval(get_account_id())
- );
- if($r)
- info( t('Password changed.') . EOL);
- else
- $errs[] = t('Password update failed. Please try again.');
- }
- }
-
-
- if($errs) {
- foreach($errs as $err)
- notice($err . EOL);
- }
- goaway(z_root() . '/settings/account' );
- }
-
-
- check_form_security_token_redirectOnErr('/settings', 'settings');
-
- call_hooks('settings_post', $_POST);
-
- $set_perms = '';
-
- $role = ((x($_POST,'permissions_role')) ? notags(trim($_POST['permissions_role'])) : '');
- $oldrole = get_pconfig(local_channel(),'system','permissions_role');
-
- if(($role != $oldrole) || ($role === 'custom')) {
-
- if($role === 'custom') {
- $hide_presence = (((x($_POST,'hide_presence')) && (intval($_POST['hide_presence']) == 1)) ? 1: 0);
- $publish = (((x($_POST,'profile_in_directory')) && (intval($_POST['profile_in_directory']) == 1)) ? 1: 0);
- $def_group = ((x($_POST,'group-selection')) ? notags(trim($_POST['group-selection'])) : '');
- $r = q("update channel set channel_default_group = '%s' where channel_id = %d",
- dbesc($def_group),
- intval(local_channel())
- );
-
- $global_perms = get_perms();
-
- foreach($global_perms as $k => $v) {
- $set_perms .= ', ' . $v[0] . ' = ' . intval($_POST[$k]) . ' ';
- }
- $acl = new Zotlabs\Access\AccessList($channel);
- $acl->set_from_array($_POST);
- $x = $acl->get();
-
- $r = q("update channel set channel_allow_cid = '%s', channel_allow_gid = '%s',
- channel_deny_cid = '%s', channel_deny_gid = '%s' where channel_id = %d",
- dbesc($x['allow_cid']),
- dbesc($x['allow_gid']),
- dbesc($x['deny_cid']),
- dbesc($x['deny_gid']),
- intval(local_channel())
- );
- }
- else {
- $role_permissions = get_role_perms($_POST['permissions_role']);
- if(! $role_permissions) {
- notice('Permissions category could not be found.');
- return;
- }
- $hide_presence = 1 - (intval($role_permissions['online']));
- if($role_permissions['default_collection']) {
- $r = q("select hash from groups where uid = %d and name = '%s' limit 1",
- intval(local_channel()),
- dbesc( t('Friends') )
- );
- if(! $r) {
- require_once('include/group.php');
- group_add(local_channel(), t('Friends'));
- group_add_member(local_channel(),t('Friends'),$channel['channel_hash']);
- $r = q("select hash from groups where uid = %d and name = '%s' limit 1",
- intval(local_channel()),
- dbesc( t('Friends') )
- );
- }
- if($r) {
- q("update channel set channel_default_group = '%s', channel_allow_gid = '%s', channel_allow_cid = '', channel_deny_gid = '', channel_deny_cid = '' where channel_id = %d",
- dbesc($r[0]['hash']),
- dbesc('<' . $r[0]['hash'] . '>'),
- intval(local_channel())
- );
- }
- else {
- notice( sprintf('Default privacy group \'%s\' not found. Please create and re-submit permission change.', t('Friends')) . EOL);
- return;
- }
- }
- // no default collection
- else {
- q("update channel set channel_default_group = '', channel_allow_gid = '', channel_allow_cid = '', channel_deny_gid = '',
- channel_deny_cid = '' where channel_id = %d",
- intval(local_channel())
- );
- }
-
- $r = q("update abook set abook_my_perms = %d where abook_channel = %d and abook_self = 1",
- intval((array_key_exists('perms_accept',$role_permissions)) ? $role_permissions['perms_accept'] : 0),
- intval(local_channel())
- );
- set_pconfig(local_channel(),'system','autoperms',(($role_permissions['perms_auto']) ? intval($role_permissions['perms_accept']) : 0));
-
- foreach($role_permissions as $p => $v) {
- if(strpos($p,'channel_') !== false) {
- $set_perms .= ', ' . $p . ' = ' . intval($v) . ' ';
- }
- if($p === 'directory_publish') {
- $publish = intval($v);
- }
- }
- }
-
- set_pconfig(local_channel(),'system','hide_online_status',$hide_presence);
- set_pconfig(local_channel(),'system','permissions_role',$role);
- }
-
- $username = ((x($_POST,'username')) ? notags(trim($_POST['username'])) : '');
- $timezone = ((x($_POST,'timezone_select')) ? notags(trim($_POST['timezone_select'])) : '');
- $defloc = ((x($_POST,'defloc')) ? notags(trim($_POST['defloc'])) : '');
- $openid = ((x($_POST,'openid_url')) ? notags(trim($_POST['openid_url'])) : '');
- $maxreq = ((x($_POST,'maxreq')) ? intval($_POST['maxreq']) : 0);
- $expire = ((x($_POST,'expire')) ? intval($_POST['expire']) : 0);
- $evdays = ((x($_POST,'evdays')) ? intval($_POST['evdays']) : 3);
- $photo_path = ((x($_POST,'photo_path')) ? escape_tags(trim($_POST['photo_path'])) : '');
- $attach_path = ((x($_POST,'attach_path')) ? escape_tags(trim($_POST['attach_path'])) : '');
-
- $channel_menu = ((x($_POST['channel_menu'])) ? htmlspecialchars_decode(trim($_POST['channel_menu']),ENT_QUOTES) : '');
-
- $expire_items = ((x($_POST,'expire_items')) ? intval($_POST['expire_items']) : 0);
- $expire_starred = ((x($_POST,'expire_starred')) ? intval($_POST['expire_starred']) : 0);
- $expire_photos = ((x($_POST,'expire_photos'))? intval($_POST['expire_photos']) : 0);
- $expire_network_only = ((x($_POST,'expire_network_only'))? intval($_POST['expire_network_only']) : 0);
-
- $allow_location = (((x($_POST,'allow_location')) && (intval($_POST['allow_location']) == 1)) ? 1: 0);
-
- $blocktags = (((x($_POST,'blocktags')) && (intval($_POST['blocktags']) == 1)) ? 0: 1); // this setting is inverted!
- $unkmail = (((x($_POST,'unkmail')) && (intval($_POST['unkmail']) == 1)) ? 1: 0);
- $cntunkmail = ((x($_POST,'cntunkmail')) ? intval($_POST['cntunkmail']) : 0);
- $suggestme = ((x($_POST,'suggestme')) ? intval($_POST['suggestme']) : 0);
-
- $post_newfriend = (($_POST['post_newfriend'] == 1) ? 1: 0);
- $post_joingroup = (($_POST['post_joingroup'] == 1) ? 1: 0);
- $post_profilechange = (($_POST['post_profilechange'] == 1) ? 1: 0);
- $adult = (($_POST['adult'] == 1) ? 1 : 0);
-
- $cal_first_day = (((x($_POST,'first_day')) && (intval($_POST['first_day']) == 1)) ? 1: 0);
-
- $channel = App::get_channel();
- $pageflags = $channel['channel_pageflags'];
- $existing_adult = (($pageflags & PAGE_ADULT) ? 1 : 0);
- if($adult != $existing_adult)
- $pageflags = ($pageflags ^ PAGE_ADULT);
-
-
- $notify = 0;
-
- if(x($_POST,'notify1'))
- $notify += intval($_POST['notify1']);
- if(x($_POST,'notify2'))
- $notify += intval($_POST['notify2']);
- if(x($_POST,'notify3'))
- $notify += intval($_POST['notify3']);
- if(x($_POST,'notify4'))
- $notify += intval($_POST['notify4']);
- if(x($_POST,'notify5'))
- $notify += intval($_POST['notify5']);
- if(x($_POST,'notify6'))
- $notify += intval($_POST['notify6']);
- if(x($_POST,'notify7'))
- $notify += intval($_POST['notify7']);
- if(x($_POST,'notify8'))
- $notify += intval($_POST['notify8']);
-
-
- $vnotify = 0;
-
- if(x($_POST,'vnotify1'))
- $vnotify += intval($_POST['vnotify1']);
- if(x($_POST,'vnotify2'))
- $vnotify += intval($_POST['vnotify2']);
- if(x($_POST,'vnotify3'))
- $vnotify += intval($_POST['vnotify3']);
- if(x($_POST,'vnotify4'))
- $vnotify += intval($_POST['vnotify4']);
- if(x($_POST,'vnotify5'))
- $vnotify += intval($_POST['vnotify5']);
- if(x($_POST,'vnotify6'))
- $vnotify += intval($_POST['vnotify6']);
- if(x($_POST,'vnotify7'))
- $vnotify += intval($_POST['vnotify7']);
- if(x($_POST,'vnotify8'))
- $vnotify += intval($_POST['vnotify8']);
- if(x($_POST,'vnotify9'))
- $vnotify += intval($_POST['vnotify9']);
- if(x($_POST,'vnotify10'))
- $vnotify += intval($_POST['vnotify10']);
- if(x($_POST,'vnotify11'))
- $vnotify += intval($_POST['vnotify11']);
-
- $always_show_in_notices = x($_POST,'always_show_in_notices') ? 1 : 0;
-
- $channel = App::get_channel();
-
- $err = '';
-
- $name_change = false;
-
- if($username != $channel['channel_name']) {
- $name_change = true;
- require_once('include/identity.php');
- $err = validate_channelname($username);
- if($err) {
- notice($err);
- return;
- }
- }
-
- if($timezone != $channel['channel_timezone']) {
- if(strlen($timezone))
- date_default_timezone_set($timezone);
- }
-
- set_pconfig(local_channel(),'system','use_browser_location',$allow_location);
- set_pconfig(local_channel(),'system','suggestme', $suggestme);
- set_pconfig(local_channel(),'system','post_newfriend', $post_newfriend);
- set_pconfig(local_channel(),'system','post_joingroup', $post_joingroup);
- set_pconfig(local_channel(),'system','post_profilechange', $post_profilechange);
- set_pconfig(local_channel(),'system','blocktags',$blocktags);
- set_pconfig(local_channel(),'system','channel_menu',$channel_menu);
- set_pconfig(local_channel(),'system','vnotify',$vnotify);
- set_pconfig(local_channel(),'system','always_show_in_notices',$always_show_in_notices);
- set_pconfig(local_channel(),'system','evdays',$evdays);
- set_pconfig(local_channel(),'system','photo_path',$photo_path);
- set_pconfig(local_channel(),'system','attach_path',$attach_path);
- set_pconfig(local_channel(),'system','cal_first_day',$cal_first_day);
-
- $r = q("update channel set channel_name = '%s', channel_pageflags = %d, channel_timezone = '%s', channel_location = '%s', channel_notifyflags = %d, channel_max_anon_mail = %d, channel_max_friend_req = %d, channel_expire_days = %d $set_perms where channel_id = %d",
- dbesc($username),
- intval($pageflags),
- dbesc($timezone),
- dbesc($defloc),
- intval($notify),
- intval($unkmail),
- intval($maxreq),
- intval($expire),
- intval(local_channel())
- );
- if($r)
- info( t('Settings updated.') . EOL);
-
- if(! is_null($publish)) {
- $r = q("UPDATE profile SET publish = %d WHERE is_default = 1 AND uid = %d",
- intval($publish),
- intval(local_channel())
- );
- }
-
- if($name_change) {
- $r = q("update xchan set xchan_name = '%s', xchan_name_date = '%s' where xchan_hash = '%s'",
- dbesc($username),
- dbesc(datetime_convert()),
- dbesc($channel['channel_hash'])
- );
- $r = q("update profile set name = '%s' where uid = %d and is_default = 1",
- dbesc($username),
- intval($channel['channel_id'])
- );
- }
-
- proc_run('php','include/directory.php',local_channel());
-
- build_sync_packet();
-
-
- //$_SESSION['theme'] = $theme;
- if($email_changed && App::$config['system']['register_policy'] == REGISTER_VERIFY) {
-
- // FIXME - set to un-verified, blocked and redirect to logout
- // Why? Are we verifying people or email addresses?
-
- }
-
- goaway(z_root() . '/settings' );
- return; // NOTREACHED
-}
-
-
-
-function settings_content(&$a) {
-
- $o = '';
- nav_set_selected('settings');
-
-
- if((! local_channel()) || ($_SESSION['delegate'])) {
- notice( t('Permission denied.') . EOL );
- return login();
- }
-
-
- $channel = App::get_channel();
- if($channel)
- head_set_icon($channel['xchan_photo_s']);
-
- $yes_no = array(t('No'),t('Yes'));
-
- if((argc() > 1) && (argv(1) === 'oauth')) {
-
- if((argc() > 2) && (argv(2) === 'add')) {
- $tpl = get_markup_template("settings_oauth_edit.tpl");
- $o .= replace_macros($tpl, array(
- '$form_security_token' => get_form_security_token("settings_oauth"),
- '$title' => t('Add application'),
- '$submit' => t('Submit'),
- '$cancel' => t('Cancel'),
- '$name' => array('name', t('Name'), '', t('Name of application')),
- '$key' => array('key', t('Consumer Key'), random_string(16), t('Automatically generated - change if desired. Max length 20')),
- '$secret' => array('secret', t('Consumer Secret'), random_string(16), t('Automatically generated - change if desired. Max length 20')),
- '$redirect' => array('redirect', t('Redirect'), '', t('Redirect URI - leave blank unless your application specifically requires this')),
- '$icon' => array('icon', t('Icon url'), '', t('Optional')),
- ));
- return $o;
- }
-
- if((argc() > 3) && (argv(2) === 'edit')) {
- $r = q("SELECT * FROM clients WHERE client_id='%s' AND uid=%d",
- dbesc(argv(3)),
- local_channel());
-
- if (!count($r)){
- notice(t('Application not found.'));
- return;
- }
- $app = $r[0];
-
- $tpl = get_markup_template("settings_oauth_edit.tpl");
- $o .= replace_macros($tpl, array(
- '$form_security_token' => get_form_security_token("settings_oauth"),
- '$title' => t('Add application'),
- '$submit' => t('Update'),
- '$cancel' => t('Cancel'),
- '$name' => array('name', t('Name'), $app['name'] , ''),
- '$key' => array('key', t('Consumer Key'), $app['client_id'], ''),
- '$secret' => array('secret', t('Consumer Secret'), $app['pw'], ''),
- '$redirect' => array('redirect', t('Redirect'), $app['redirect_uri'], ''),
- '$icon' => array('icon', t('Icon url'), $app['icon'], ''),
- ));
- return $o;
- }
-
- if((argc() > 3) && (argv(2) === 'delete')) {
- check_form_security_token_redirectOnErr('/settings/oauth', 'settings_oauth', 't');
-
- $r = q("DELETE FROM clients WHERE client_id='%s' AND uid=%d",
- dbesc(argv(3)),
- local_channel());
- goaway(z_root()."/settings/oauth/");
- return;
- }
-
-
- $r = q("SELECT clients.*, tokens.id as oauth_token, (clients.uid=%d) AS my
- FROM clients
- LEFT JOIN tokens ON clients.client_id=tokens.client_id
- WHERE clients.uid IN (%d,0)",
- local_channel(),
- local_channel());
-
-
- $tpl = get_markup_template("settings_oauth.tpl");
- $o .= replace_macros($tpl, array(
- '$form_security_token' => get_form_security_token("settings_oauth"),
- '$baseurl' => z_root(),
- '$title' => t('Connected Apps'),
- '$add' => t('Add application'),
- '$edit' => t('Edit'),
- '$delete' => t('Delete'),
- '$consumerkey' => t('Client key starts with'),
- '$noname' => t('No name'),
- '$remove' => t('Remove authorization'),
- '$apps' => $r,
- ));
- return $o;
-
- }
- if((argc() > 1) && (argv(1) === 'featured')) {
- $settings_addons = "";
-
- $o = '';
-
- $r = q("SELECT * FROM `hook` WHERE `hook` = 'feature_settings' ");
- if(! $r)
- $settings_addons = t('No feature settings configured');
-
- call_hooks('feature_settings', $settings_addons);
-
- $tpl = get_markup_template("settings_addons.tpl");
- $o .= replace_macros($tpl, array(
- '$form_security_token' => get_form_security_token("settings_featured"),
- '$title' => t('Feature/Addon Settings'),
- '$settings_addons' => $settings_addons
- ));
- return $o;
- }
-
-
- /*
- * ACCOUNT SETTINGS
- */
-
-
- if((argc() > 1) && (argv(1) === 'account')) {
- $account_settings = "";
-
- call_hooks('account_settings', $account_settings);
-
- $email = App::$account['account_email'];
-
-
- $tpl = get_markup_template("settings_account.tpl");
- $o .= replace_macros($tpl, array(
- '$form_security_token' => get_form_security_token("settings_account"),
- '$title' => t('Account Settings'),
- '$origpass' => array('origpass', t('Current Password'), ' ',''),
- '$password1'=> array('npassword', t('Enter New Password'), '', ''),
- '$password2'=> array('confirm', t('Confirm New Password'), '', t('Leave password fields blank unless changing')),
- '$submit' => t('Submit'),
- '$email' => array('email', t('Email Address:'), $email, ''),
- '$removeme' => t('Remove Account'),
- '$removeaccount' => t('Remove this account including all its channels'),
- '$account_settings' => $account_settings
- ));
- return $o;
- }
-
-
-
- if((argc() > 1) && (argv(1) === 'features')) {
- $arr = array();
- $features = get_features();
-
- foreach($features as $fname => $fdata) {
- $arr[$fname] = array();
- $arr[$fname][0] = $fdata[0];
- foreach(array_slice($fdata,1) as $f) {
- $arr[$fname][1][] = array('feature_' .$f[0],$f[1],((intval(feature_enabled(local_channel(),$f[0]))) ? "1" : ''),$f[2],array(t('Off'),t('On')));
- }
- }
-
- $tpl = get_markup_template("settings_features.tpl");
- $o .= replace_macros($tpl, array(
- '$form_security_token' => get_form_security_token("settings_features"),
- '$title' => t('Additional Features'),
- '$features' => $arr,
- '$submit' => t('Submit'),
- ));
-
- return $o;
- }
-
-
-
-
-
- if((argc() > 1) && (argv(1) === 'connectors')) {
-
- $settings_connectors = "";
-
- call_hooks('connector_settings', $settings_connectors);
-
- $r = null;
-
- $tpl = get_markup_template("settings_connectors.tpl");
-
- $o .= replace_macros($tpl, array(
- '$form_security_token' => get_form_security_token("settings_connectors"),
- '$title' => t('Connector Settings'),
- '$submit' => t('Submit'),
- '$settings_connectors' => $settings_connectors
- ));
-
- call_hooks('display_settings', $o);
- return $o;
- }
-
- /*
- * DISPLAY SETTINGS
- */
-
- if((argc() > 1) && (argv(1) === 'display')) {
- $default_theme = get_config('system','theme');
- if(! $default_theme)
- $default_theme = 'default';
- $default_mobile_theme = get_config('system','mobile_theme');
- if(! $mobile_default_theme)
- $mobile_default_theme = 'none';
-
- $allowed_themes_str = get_config('system','allowed_themes');
- $allowed_themes_raw = explode(',',$allowed_themes_str);
- $allowed_themes = array();
- if(count($allowed_themes_raw))
- foreach($allowed_themes_raw as $x)
- if(strlen(trim($x)) && is_dir("view/theme/$x"))
- $allowed_themes[] = trim($x);
-
-
- $themes = array();
- $files = glob('view/theme/*');
- if($allowed_themes) {
- foreach($allowed_themes as $th) {
- $f = $th;
- $is_experimental = file_exists('view/theme/' . $th . '/experimental');
- $unsupported = file_exists('view/theme/' . $th . '/unsupported');
- $is_mobile = file_exists('view/theme/' . $th . '/mobile');
- $is_library = file_exists('view/theme/'. $th . '/library');
- $mobile_themes["---"] = t("No special theme for mobile devices");
-
- if (!$is_experimental or ($is_experimental && (get_config('experimentals','exp_themes')==1 or get_config('experimentals','exp_themes')===false))){
- $theme_name = (($is_experimental) ? sprintf(t('%s - (Experimental)'), $f) : $f);
- if (! $is_library) {
- if($is_mobile) {
- $mobile_themes[$f] = $themes[$f] = $theme_name . ' (' . t('mobile') . ')';
- }
- else {
- $mobile_themes[$f] = $themes[$f] = $theme_name;
- }
- }
- }
-
- }
- }
- $theme_selected = (!x($_SESSION,'theme')? $default_theme : $_SESSION['theme']);
- $mobile_theme_selected = (!x($_SESSION,'mobile_theme')? $default_mobile_theme : $_SESSION['mobile_theme']);
-
- $preload_images = get_pconfig(local_channel(),'system','preload_images');
- $preload_images = (($preload_images===false)? '0': $preload_images); // default if not set: 0
-
- $user_scalable = get_pconfig(local_channel(),'system','user_scalable');
- $user_scalable = (($user_scalable===false)? '1': $user_scalable); // default if not set: 1
-
- $browser_update = intval(get_pconfig(local_channel(), 'system','update_interval'));
- $browser_update = (($browser_update == 0) ? 80 : $browser_update / 1000); // default if not set: 40 seconds
-
- $itemspage = intval(get_pconfig(local_channel(), 'system','itemspage'));
- $itemspage = (($itemspage > 0 && $itemspage < 101) ? $itemspage : 20); // default if not set: 20 items
-
- $nosmile = get_pconfig(local_channel(),'system','no_smilies');
- $nosmile = (($nosmile===false)? '0': $nosmile); // default if not set: 0
-
- $title_tosource = get_pconfig(local_channel(),'system','title_tosource');
- $title_tosource = (($title_tosource===false)? '0': $title_tosource); // default if not set: 0
-
- $theme_config = "";
- if( ($themeconfigfile = get_theme_config_file($theme_selected)) != null){
- require_once($themeconfigfile);
- $theme_config = theme_content($a);
- }
-
- $tpl = get_markup_template("settings_display.tpl");
- $o = replace_macros($tpl, array(
- '$ptitle' => t('Display Settings'),
- '$d_tset' => t('Theme Settings'),
- '$d_ctset' => t('Custom Theme Settings'),
- '$d_cset' => t('Content Settings'),
- '$form_security_token' => get_form_security_token("settings_display"),
- '$submit' => t('Submit'),
- '$baseurl' => z_root(),
- '$uid' => local_channel(),
-
- '$theme' => (($themes) ? array('theme', t('Display Theme:'), $theme_selected, '', $themes, 'preview') : false),
- '$mobile_theme' => (($mobile_themes) ? array('mobile_theme', t('Mobile Theme:'), $mobile_theme_selected, '', $mobile_themes, '') : false),
- '$preload_images' => array('preload_images', t("Preload images before rendering the page"), $preload_images, t("The subjective page load time will be longer but the page will be ready when displayed"), $yes_no),
- '$user_scalable' => array('user_scalable', t("Enable user zoom on mobile devices"), $user_scalable, '', $yes_no),
- '$ajaxint' => array('browser_update', t("Update browser every xx seconds"), $browser_update, t('Minimum of 10 seconds, no maximum')),
- '$itemspage' => array('itemspage', t("Maximum number of conversations to load at any time:"), $itemspage, t('Maximum of 100 items')),
- '$nosmile' => array('nosmile', t("Show emoticons (smilies) as images"), 1-intval($nosmile), '', $yes_no),
- '$title_tosource' => array('title_tosource', t("Link post titles to source"), $title_tosource, '', $yes_no),
- '$layout_editor' => t('System Page Layout Editor - (advanced)'),
- '$theme_config' => $theme_config,
- '$expert' => feature_enabled(local_channel(),'expert'),
- '$channel_list_mode' => array('channel_list_mode', t('Use blog/list mode on channel page'), get_pconfig(local_channel(),'system','channel_list_mode'), t('(comments displayed separately)'), $yes_no),
- '$network_list_mode' => array('network_list_mode', t('Use blog/list mode on grid page'), get_pconfig(local_channel(),'system','network_list_mode'), t('(comments displayed separately)'), $yes_no),
- '$channel_divmore_height' => array('channel_divmore_height', t('Channel page max height of content (in pixels)'), ((get_pconfig(local_channel(),'system','channel_divmore_height')) ? get_pconfig(local_channel(),'system','channel_divmore_height') : 400), t('click to expand content exceeding this height')),
- '$network_divmore_height' => array('network_divmore_height', t('Grid page max height of content (in pixels)'), ((get_pconfig(local_channel(),'system','network_divmore_height')) ? get_pconfig(local_channel(),'system','network_divmore_height') : 400) , t('click to expand content exceeding this height')),
-
-
- ));
-
- return $o;
- }
-
-
-
-
-
- if(argv(1) === 'channel') {
-
- require_once('include/acl_selectors.php');
- require_once('include/permissions.php');
-
-
- $p = q("SELECT * FROM `profile` WHERE `is_default` = 1 AND `uid` = %d LIMIT 1",
- intval(local_channel())
- );
- if(count($p))
- $profile = $p[0];
-
- load_pconfig(local_channel(),'expire');
-
- $channel = App::get_channel();
-
-
- $global_perms = get_perms();
-
- $permiss = array();
-
- $perm_opts = array(
- array( t('Nobody except yourself'), 0),
- array( t('Only those you specifically allow'), PERMS_SPECIFIC),
- array( t('Approved connections'), PERMS_CONTACTS),
- array( t('Any connections'), PERMS_PENDING),
- array( t('Anybody on this website'), PERMS_SITE),
- array( t('Anybody in this network'), PERMS_NETWORK),
- array( t('Anybody authenticated'), PERMS_AUTHED),
- array( t('Anybody on the internet'), PERMS_PUBLIC)
- );
-
-
- foreach($global_perms as $k => $perm) {
- $options = array();
- foreach($perm_opts as $opt) {
- if((! $perm[2]) && $opt[1] == PERMS_PUBLIC)
- continue;
- $options[$opt[1]] = $opt[0];
- }
- $permiss[] = array($k,$perm[3],$channel[$perm[0]],$perm[4],$options);
- }
-
-
-// logger('permiss: ' . print_r($permiss,true));
-
-
-
- $username = $channel['channel_name'];
- $nickname = $channel['channel_address'];
- $timezone = $channel['channel_timezone'];
- $notify = $channel['channel_notifyflags'];
- $defloc = $channel['channel_location'];
-
- $maxreq = $channel['channel_max_friend_req'];
- $expire = $channel['channel_expire_days'];
- $adult_flag = intval($channel['channel_pageflags'] & PAGE_ADULT);
- $sys_expire = get_config('system','default_expire_days');
-
-// $unkmail = App::$user['unkmail'];
-// $cntunkmail = App::$user['cntunkmail'];
-
- $hide_presence = intval(get_pconfig(local_channel(), 'system','hide_online_status'));
-
-
- $expire_items = get_pconfig(local_channel(), 'expire','items');
- $expire_items = (($expire_items===false)? '1' : $expire_items); // default if not set: 1
-
- $expire_notes = get_pconfig(local_channel(), 'expire','notes');
- $expire_notes = (($expire_notes===false)? '1' : $expire_notes); // default if not set: 1
-
- $expire_starred = get_pconfig(local_channel(), 'expire','starred');
- $expire_starred = (($expire_starred===false)? '1' : $expire_starred); // default if not set: 1
-
- $expire_photos = get_pconfig(local_channel(), 'expire','photos');
- $expire_photos = (($expire_photos===false)? '0' : $expire_photos); // default if not set: 0
-
- $expire_network_only = get_pconfig(local_channel(), 'expire','network_only');
- $expire_network_only = (($expire_network_only===false)? '0' : $expire_network_only); // default if not set: 0
-
-
- $suggestme = get_pconfig(local_channel(), 'system','suggestme');
- $suggestme = (($suggestme===false)? '0': $suggestme); // default if not set: 0
-
- $post_newfriend = get_pconfig(local_channel(), 'system','post_newfriend');
- $post_newfriend = (($post_newfriend===false)? '0': $post_newfriend); // default if not set: 0
-
- $post_joingroup = get_pconfig(local_channel(), 'system','post_joingroup');
- $post_joingroup = (($post_joingroup===false)? '0': $post_joingroup); // default if not set: 0
-
- $post_profilechange = get_pconfig(local_channel(), 'system','post_profilechange');
- $post_profilechange = (($post_profilechange===false)? '0': $post_profilechange); // default if not set: 0
-
- $blocktags = get_pconfig(local_channel(),'system','blocktags');
- $blocktags = (($blocktags===false) ? '0' : $blocktags);
-
- $timezone = date_default_timezone_get();
-
- $opt_tpl = get_markup_template("field_checkbox.tpl");
- if(get_config('system','publish_all')) {
- $profile_in_dir = '<input type="hidden" name="profile_in_directory" value="1" />';
- }
- else {
- $profile_in_dir = replace_macros($opt_tpl,array(
- '$field' => array('profile_in_directory', t('Publish your default profile in the network directory'), $profile['publish'], '', $yes_no),
- ));
- }
-
- $suggestme = replace_macros($opt_tpl,array(
- '$field' => array('suggestme', t('Allow us to suggest you as a potential friend to new members?'), $suggestme, '', $yes_no),
-
- ));
-
- $subdir = ((strlen(App::get_path())) ? '<br />' . t('or') . ' ' . z_root() . '/channel/' . $nickname : '');
-
- $tpl_addr = get_markup_template("settings_nick_set.tpl");
-
- $prof_addr = replace_macros($tpl_addr,array(
- '$desc' => t('Your channel address is'),
- '$nickname' => $nickname,
- '$subdir' => $subdir,
- '$basepath' => App::get_hostname()
- ));
-
- $stpl = get_markup_template('settings.tpl');
-
- $acl = new Zotlabs\Access\AccessList($channel);
- $perm_defaults = $acl->get();
-
- require_once('include/group.php');
- $group_select = mini_group_select(local_channel(),$channel['channel_default_group']);
-
- require_once('include/menu.php');
- $m1 = menu_list(local_channel());
- $menu = false;
- if($m1) {
- $menu = array();
- $current = get_pconfig(local_channel(),'system','channel_menu');
- $menu[] = array('name' => '', 'selected' => ((! $current) ? true : false));
- foreach($m1 as $m) {
- $menu[] = array('name' => htmlspecialchars($m['menu_name'],ENT_COMPAT,'UTF-8'), 'selected' => (($m['menu_name'] === $current) ? ' selected="selected" ' : false));
- }
- }
-
- $evdays = get_pconfig(local_channel(),'system','evdays');
- if(! $evdays)
- $evdays = 3;
-
- $permissions_role = get_pconfig(local_channel(),'system','permissions_role');
- if(! $permissions_role)
- $permissions_role = 'custom';
-
- $permissions_set = (($permissions_role != 'custom') ? true : false);
-
- $vnotify = get_pconfig(local_channel(),'system','vnotify');
- $always_show_in_notices = get_pconfig(local_channel(),'system','always_show_in_notices');
- if($vnotify === false)
- $vnotify = (-1);
-
- $o .= replace_macros($stpl,array(
- '$ptitle' => t('Channel Settings'),
-
- '$submit' => t('Submit'),
- '$baseurl' => z_root(),
- '$uid' => local_channel(),
- '$form_security_token' => get_form_security_token("settings"),
- '$nickname_block' => $prof_addr,
- '$h_basic' => t('Basic Settings'),
- '$username' => array('username', t('Full Name:'), $username,''),
- '$email' => array('email', t('Email Address:'), $email, ''),
- '$timezone' => array('timezone_select' , t('Your Timezone:'), $timezone, '', get_timezones()),
- '$defloc' => array('defloc', t('Default Post Location:'), $defloc, t('Geographical location to display on your posts')),
- '$allowloc' => array('allow_location', t('Use Browser Location:'), ((get_pconfig(local_channel(),'system','use_browser_location')) ? 1 : ''), '', $yes_no),
-
- '$adult' => array('adult', t('Adult Content'), $adult_flag, t('This channel frequently or regularly publishes adult content. (Please tag any adult material and/or nudity with #NSFW)'), $yes_no),
-
- '$h_prv' => t('Security and Privacy Settings'),
- '$permissions_set' => $permissions_set,
- '$server_role' => Zotlabs\Project\System::get_server_role(),
- '$perms_set_msg' => t('Your permissions are already configured. Click to view/adjust'),
-
- '$hide_presence' => array('hide_presence', t('Hide my online presence'),$hide_presence, t('Prevents displaying in your profile that you are online'), $yes_no),
-
- '$lbl_pmacro' => t('Simple Privacy Settings:'),
- '$pmacro3' => t('Very Public - <em>extremely permissive (should be used with caution)</em>'),
- '$pmacro2' => t('Typical - <em>default public, privacy when desired (similar to social network permissions but with improved privacy)</em>'),
- '$pmacro1' => t('Private - <em>default private, never open or public</em>'),
- '$pmacro0' => t('Blocked - <em>default blocked to/from everybody</em>'),
- '$permiss_arr' => $permiss,
- '$blocktags' => array('blocktags',t('Allow others to tag your posts'), 1-$blocktags, t('Often used by the community to retro-actively flag inappropriate content'), $yes_no),
-
- '$lbl_p2macro' => t('Advanced Privacy Settings'),
-
- '$expire' => array('expire',t('Expire other channel content after this many days'),$expire,sprintf( t('0 or blank to use the website limit. The website expires after %d days.'),intval($sys_expire))),
- '$maxreq' => array('maxreq', t('Maximum Friend Requests/Day:'), intval($channel['channel_max_friend_req']) , t('May reduce spam activity')),
- '$permissions' => t('Default Post Permissions'),
- '$permdesc' => t("\x28click to open/close\x29"),
- '$aclselect' => populate_acl($perm_defaults,false),
- '$suggestme' => $suggestme,
- '$group_select' => $group_select,
- '$role' => array('permissions_role' , t('Channel permissions category:'), $permissions_role, '', get_roles()),
-
- '$profile_in_dir' => $profile_in_dir,
- '$hide_friends' => $hide_friends,
- '$hide_wall' => $hide_wall,
- '$unkmail' => $unkmail,
- '$cntunkmail' => array('cntunkmail', t('Maximum private messages per day from unknown people:'), intval($channel['channel_max_anon_mail']) ,t("Useful to reduce spamming")),
-
-
- '$h_not' => t('Notification Settings'),
- '$activity_options' => t('By default post a status message when:'),
- '$post_newfriend' => array('post_newfriend', t('accepting a friend request'), $post_newfriend, '', $yes_no),
- '$post_joingroup' => array('post_joingroup', t('joining a forum/community'), $post_joingroup, '', $yes_no),
- '$post_profilechange' => array('post_profilechange', t('making an <em>interesting</em> profile change'), $post_profilechange, '', $yes_no),
- '$lbl_not' => t('Send a notification email when:'),
- '$notify1' => array('notify1', t('You receive a connection request'), ($notify & NOTIFY_INTRO), NOTIFY_INTRO, '', $yes_no),
- '$notify2' => array('notify2', t('Your connections are confirmed'), ($notify & NOTIFY_CONFIRM), NOTIFY_CONFIRM, '', $yes_no),
- '$notify3' => array('notify3', t('Someone writes on your profile wall'), ($notify & NOTIFY_WALL), NOTIFY_WALL, '', $yes_no),
- '$notify4' => array('notify4', t('Someone writes a followup comment'), ($notify & NOTIFY_COMMENT), NOTIFY_COMMENT, '', $yes_no),
- '$notify5' => array('notify5', t('You receive a private message'), ($notify & NOTIFY_MAIL), NOTIFY_MAIL, '', $yes_no),
- '$notify6' => array('notify6', t('You receive a friend suggestion'), ($notify & NOTIFY_SUGGEST), NOTIFY_SUGGEST, '', $yes_no),
- '$notify7' => array('notify7', t('You are tagged in a post'), ($notify & NOTIFY_TAGSELF), NOTIFY_TAGSELF, '', $yes_no),
- '$notify8' => array('notify8', t('You are poked/prodded/etc. in a post'), ($notify & NOTIFY_POKE), NOTIFY_POKE, '', $yes_no),
-
-
- '$lbl_vnot' => t('Show visual notifications including:'),
-
- '$vnotify1' => array('vnotify1', t('Unseen grid activity'), ($vnotify & VNOTIFY_NETWORK), VNOTIFY_NETWORK, '', $yes_no),
- '$vnotify2' => array('vnotify2', t('Unseen channel activity'), ($vnotify & VNOTIFY_CHANNEL), VNOTIFY_CHANNEL, '', $yes_no),
- '$vnotify3' => array('vnotify3', t('Unseen private messages'), ($vnotify & VNOTIFY_MAIL), VNOTIFY_MAIL, t('Recommended'), $yes_no),
- '$vnotify4' => array('vnotify4', t('Upcoming events'), ($vnotify & VNOTIFY_EVENT), VNOTIFY_EVENT, '', $yes_no),
- '$vnotify5' => array('vnotify5', t('Events today'), ($vnotify & VNOTIFY_EVENTTODAY), VNOTIFY_EVENTTODAY, '', $yes_no),
- '$vnotify6' => array('vnotify6', t('Upcoming birthdays'), ($vnotify & VNOTIFY_BIRTHDAY), VNOTIFY_BIRTHDAY, t('Not available in all themes'), $yes_no),
- '$vnotify7' => array('vnotify7', t('System (personal) notifications'), ($vnotify & VNOTIFY_SYSTEM), VNOTIFY_SYSTEM, '', $yes_no),
- '$vnotify8' => array('vnotify8', t('System info messages'), ($vnotify & VNOTIFY_INFO), VNOTIFY_INFO, t('Recommended'), $yes_no),
- '$vnotify9' => array('vnotify9', t('System critical alerts'), ($vnotify & VNOTIFY_ALERT), VNOTIFY_ALERT, t('Recommended'), $yes_no),
- '$vnotify10' => array('vnotify10', t('New connections'), ($vnotify & VNOTIFY_INTRO), VNOTIFY_INTRO, t('Recommended'), $yes_no),
- '$vnotify11' => array('vnotify11', t('System Registrations'), ($vnotify & VNOTIFY_REGISTER), VNOTIFY_REGISTER, '', $yes_no),
- '$always_show_in_notices' => array('always_show_in_notices', t('Also show new wall posts, private messages and connections under Notices'), $always_show_in_notices, 1, '', $yes_no),
-
- '$evdays' => array('evdays', t('Notify me of events this many days in advance'), $evdays, t('Must be greater than 0')),
-
- '$h_advn' => t('Advanced Account/Page Type Settings'),
- '$h_descadvn' => t('Change the behaviour of this account for special situations'),
- '$pagetype' => $pagetype,
- '$expert' => feature_enabled(local_channel(),'expert'),
- '$hint' => t('Please enable expert mode (in <a href="settings/features">Settings > Additional features</a>) to adjust!'),
- '$lbl_misc' => t('Miscellaneous Settings'),
- '$photo_path' => array('photo_path', t('Default photo upload folder'), get_pconfig(local_channel(),'system','photo_path'), t('%Y - current year, %m - current month')),
- '$attach_path' => array('attach_path', t('Default file upload folder'), get_pconfig(local_channel(),'system','attach_path'), t('%Y - current year, %m - current month')),
- '$menus' => $menu,
- '$menu_desc' => t('Personal menu to display in your channel pages'),
- '$removeme' => t('Remove Channel'),
- '$removechannel' => t('Remove this channel.'),
- '$firefoxshare' => t('Firefox Share $Projectname provider'),
- '$cal_first_day' => array('first_day', t('Start calendar week on monday'), ((get_pconfig(local_channel(),'system','cal_first_day')) ? 1 : ''), '', $yes_no),
- ));
-
- call_hooks('settings_form',$o);
-
- $o .= '</form>' . "\r\n";
-
- return $o;
- }
-}
-
diff --git a/mod/setup.php b/mod/setup.php
deleted file mode 100755
index 5dccc1711..000000000
--- a/mod/setup.php
+++ /dev/null
@@ -1,744 +0,0 @@
-<?php
-/**
- * @file mod/setup.php
- *
- * Controller for the initial setup/installation.
- *
- * @todo This setup module could need some love and improvements.
- */
-
-$install_wizard_pass = 1;
-
-/**
- * @brief Initialisation for the setup module.
- *
- * @param[in,out] App &$a
- */
-function setup_init(&$a) {
-
- // Ensure that if somebody hasn't read the install documentation and doesn't have all
- // the required modules or has a totally borked shared hosting provider and they can't
- // figure out what the hell is going on - that we at least spit out an error message which
- // we can inquire about when they write to tell us that our software doesn't work.
-
- // The worst thing we can do at this point is throw a white screen of death and rely on
- // them knowing about servers and php modules and logfiles enough so that we can guess
- // at the source of the problem. As ugly as it may be, we need to throw a technically worded
- // PHP error message in their face. Once installation is complete application errors will
- // throw a white screen because these error messages divulge information which can
- // potentially be useful to hackers.
-
- error_reporting(E_ERROR | E_WARNING | E_PARSE );
- ini_set('log_errors', '0');
- ini_set('display_errors', '1');
-
- // $baseurl/setup/testrwrite to test if rewite in .htaccess is working
- if (argc() == 2 && argv(1) == "testrewrite") {
- echo 'ok';
- killme();
- }
-
- global $install_wizard_pass;
- if (x($_POST, 'pass'))
- $install_wizard_pass = intval($_POST['pass']);
- else
- $install_wizard_pass = 1;
-
-}
-
-/**
- * @brief Handle the actions of the different setup steps.
- *
- * @param[in,out] App &$a
- */
-function setup_post(&$a) {
- global $install_wizard_pass, $db;
-
- switch($install_wizard_pass) {
- case 1:
- case 2:
- return;
- break; // just in case return don't return :)
- case 3:
- $urlpath = App::get_path();
- $dbhost = trim($_POST['dbhost']);
- $dbport = intval(trim($_POST['dbport']));
- $dbuser = trim($_POST['dbuser']);
- $dbpass = trim($_POST['dbpass']);
- $dbdata = trim($_POST['dbdata']);
- $dbtype = intval(trim($_POST['dbtype']));
- $phpath = trim($_POST['phpath']);
- $adminmail = trim($_POST['adminmail']);
- $siteurl = trim($_POST['siteurl']);
- $advanced = ((intval($_POST['advanced'])) ? 1 : 0);
-
- // $siteurl should not have a trailing slash
-
- $siteurl = rtrim($siteurl,'/');
-
- require_once('include/dba/dba_driver.php');
- unset($db);
- $db = dba_factory($dbhost, $dbport, $dbuser, $dbpass, $dbdata, $dbtype, true);
-
- if(! $db->connected) {
- echo 'Database Connect failed: ' . $db->error;
- killme();
- App::$data['db_conn_failed']=true;
- }
- /*if(get_db_errno()) {
- unset($db);
- $db = dba_factory($dbhost, $dbport, $dbuser, $dbpass, '', true);
-
- if(! get_db_errno()) {
- $r = q("CREATE DATABASE '%s'",
- dbesc($dbdata)
- );
- if($r) {
- unset($db);
- $db = new dba($dbhost, $dbport, $dbuser, $dbpass, $dbdata, true);
- } else {
- App::$data['db_create_failed']=true;
- }
- } else {
- App::$data['db_conn_failed']=true;
- return;
- }
- }*/
- //if(get_db_errno()) {
-
- //}
-
- return;
- break;
- case 4:
- $urlpath = App::get_path();
- $dbhost = notags(trim($_POST['dbhost']));
- $dbport = intval(notags(trim($_POST['dbport'])));
- $dbuser = notags(trim($_POST['dbuser']));
- $dbpass = notags(trim($_POST['dbpass']));
- $dbdata = notags(trim($_POST['dbdata']));
- $dbtype = intval(notags(trim($_POST['dbtype'])));
- $phpath = notags(trim($_POST['phpath']));
- $timezone = notags(trim($_POST['timezone']));
- $adminmail = notags(trim($_POST['adminmail']));
- $siteurl = notags(trim($_POST['siteurl']));
- $advanced = ((intval($_POST['advanced'])) ? 1 : 0);
-
- if($siteurl != z_root()) {
- $test = z_fetch_url($siteurl."/setup/testrewrite");
- if((! $test['success']) || ($test['body'] != 'ok')) {
- App::$data['url_fail'] = true;
- App::$data['url_error'] = $test['error'];
- return;
- }
- }
-
- // connect to db
- $db = dba_factory($dbhost, $dbport, $dbuser, $dbpass, $dbdata, $dbtype, true);
-
- if(! $db->connected) {
- echo 'CRITICAL: DB not connected.';
- killme();
- }
-
- $tpl = get_intltext_template('htconfig.tpl');
- $txt = replace_macros($tpl,array(
- '$dbhost' => $dbhost,
- '$dbport' => $dbport,
- '$dbuser' => $dbuser,
- '$dbpass' => $dbpass,
- '$dbdata' => $dbdata,
- '$dbtype' => $dbtype,
- '$uno' => 1 - $advanced,
- '$timezone' => $timezone,
- '$siteurl' => $siteurl,
- '$site_id' => random_string(),
- '$phpath' => $phpath,
- '$adminmail' => $adminmail
- ));
-
- $result = file_put_contents('.htconfig.php', $txt);
- if(! $result) {
- App::$data['txt'] = $txt;
- }
-
- $errors = load_database($db);
-
- if($errors)
- App::$data['db_failed'] = $errors;
- else
- App::$data['db_installed'] = true;
-
- return;
- break;
- }
-}
-
-function get_db_errno() {
- if(class_exists('mysqli'))
- return mysqli_connect_errno();
- else
- return mysql_errno();
-}
-
-/**
- * @brief Get output for the setup page.
- *
- * Depending on the state we are currently in it returns different content.
- *
- * @param App &$a
- * @return string parsed HTML output
- */
-function setup_content(&$a) {
- global $install_wizard_pass, $db;
-
- $o = '';
- $wizard_status = '';
- $install_title = t('$Projectname Server - Setup');
-
- if(x(App::$data, 'db_conn_failed')) {
- $install_wizard_pass = 2;
- $wizard_status = t('Could not connect to database.');
- }
- if(x(App::$data, 'url_fail')) {
- $install_wizard_pass = 3;
- $wizard_status = t('Could not connect to specified site URL. Possible SSL certificate or DNS issue.');
- if(App::$data['url_error'])
- $wizard_status .= ' ' . App::$data['url_error'];
- }
-
- if(x(App::$data, 'db_create_failed')) {
- $install_wizard_pass = 2;
- $wizard_status = t('Could not create table.');
- }
- $db_return_text = '';
- if(x(App::$data, 'db_installed')) {
- $txt = '<p style="font-size: 130%;">';
- $txt .= t('Your site database has been installed.') . EOL;
- $db_return_text .= $txt;
- }
- if(x(App::$data, 'db_failed')) {
- $txt = t('You may need to import the file "install/schema_xxx.sql" manually using a database client.') . EOL;
- $txt .= t('Please see the file "install/INSTALL.txt".') . EOL ."<hr>" ;
- $txt .= "<pre>".App::$data['db_failed'] . "</pre>". EOL ;
- $db_return_text .= $txt;
- }
- if($db && $db->connected) {
- $r = q("SELECT COUNT(*) as `total` FROM `account`");
- if($r && count($r) && $r[0]['total']) {
- $tpl = get_markup_template('install.tpl');
- return replace_macros($tpl, array(
- '$title' => $install_title,
- '$pass' => '',
- '$status' => t('Permission denied.'),
- '$text' => '',
- ));
- }
- }
-
- if(x(App::$data, 'txt') && strlen(App::$data['txt'])) {
- $db_return_text .= manual_config($a);
- }
-
- if ($db_return_text != "") {
- $tpl = get_markup_template('install.tpl');
- return replace_macros($tpl, array(
- '$title' => $install_title,
- '$pass' => '',
- '$text' => $db_return_text . what_next(),
- ));
- }
-
- switch ($install_wizard_pass){
- case 1: { // System check
-
- $checks = array();
-
- check_funcs($checks);
-
- check_htconfig($checks);
-
- check_store($checks);
-
- check_smarty3($checks);
-
- check_keys($checks);
-
- if (x($_POST, 'phpath'))
- $phpath = notags(trim($_POST['phpath']));
-
- check_php($phpath, $checks);
-
- check_phpconfig($checks);
-
- check_htaccess($checks);
-
- function check_passed($v, $c) {
- if ($c['required'])
- $v = $v && $c['status'];
-
- return $v;
- }
- $checkspassed = array_reduce($checks, "check_passed", true);
-
- $tpl = get_markup_template('install_checks.tpl');
- $o .= replace_macros($tpl, array(
- '$title' => $install_title,
- '$pass' => t('System check'),
- '$checks' => $checks,
- '$passed' => $checkspassed,
- '$see_install' => t('Please see the file "install/INSTALL.txt".'),
- '$next' => t('Next'),
- '$reload' => t('Check again'),
- '$phpath' => $phpath,
- '$baseurl' => z_root(),
- ));
- return $o;
- }; break;
-
- case 2: { // Database config
-
- $dbhost = ((x($_POST,'dbhost')) ? notags(trim($_POST['dbhost'])) : '127.0.0.1');
- $dbuser = notags(trim($_POST['dbuser']));
- $dbport = intval(notags(trim($_POST['dbport'])));
- $dbpass = notags(trim($_POST['dbpass']));
- $dbdata = notags(trim($_POST['dbdata']));
- $dbtype = intval(notags(trim($_POST['dbtype'])));
- $phpath = notags(trim($_POST['phpath']));
- $adminmail = notags(trim($_POST['adminmail']));
- $siteurl = notags(trim($_POST['siteurl']));
-
- $tpl = get_markup_template('install_db.tpl');
- $o .= replace_macros($tpl, array(
- '$title' => $install_title,
- '$pass' => t('Database connection'),
- '$info_01' => t('In order to install $Projectname we need to know how to connect to your database.'),
- '$info_02' => t('Please contact your hosting provider or site administrator if you have questions about these settings.'),
- '$info_03' => t('The database you specify below should already exist. If it does not, please create it before continuing.'),
-
- '$status' => $wizard_status,
-
- '$dbhost' => array('dbhost', t('Database Server Name'), $dbhost, t('Default is 127.0.0.1')),
- '$dbport' => array('dbport', t('Database Port'), $dbport, t('Communication port number - use 0 for default')),
- '$dbuser' => array('dbuser', t('Database Login Name'), $dbuser, ''),
- '$dbpass' => array('dbpass', t('Database Login Password'), $dbpass, ''),
- '$dbdata' => array('dbdata', t('Database Name'), $dbdata, ''),
- '$dbtype' => array('dbtype', t('Database Type'), $dbtype, '', array( 0=>'MySQL', 1=>'PostgreSQL' )),
-
- '$adminmail' => array('adminmail', t('Site administrator email address'), $adminmail, t('Your account email address must match this in order to use the web admin panel.')),
- '$siteurl' => array('siteurl', t('Website URL'), z_root(), t('Please use SSL (https) URL if available.')),
- '$lbl_10' => t('Please select a default timezone for your website'),
-
- '$baseurl' => z_root(),
-
- '$phpath' => $phpath,
-
- '$submit' => t('Submit'),
- ));
- return $o;
- }; break;
- case 3: { // Site settings
- require_once('include/datetime.php');
- $dbhost = ((x($_POST,'dbhost')) ? notags(trim($_POST['dbhost'])) : '127.0.0.1');
- $dbport = intval(notags(trim($_POST['dbuser'])));
- $dbuser = notags(trim($_POST['dbuser']));
- $dbpass = notags(trim($_POST['dbpass']));
- $dbdata = notags(trim($_POST['dbdata']));
- $dbtype = intval(notags(trim($_POST['dbtype'])));
- $phpath = notags(trim($_POST['phpath']));
-
- $adminmail = notags(trim($_POST['adminmail']));
- $siteurl = notags(trim($_POST['siteurl']));
- $timezone = ((x($_POST,'timezone')) ? ($_POST['timezone']) : 'America/Los_Angeles');
-
- $tpl = get_markup_template('install_settings.tpl');
- $o .= replace_macros($tpl, array(
- '$title' => $install_title,
- '$pass' => t('Site settings'),
- '$status' => $wizard_status,
-
- '$dbhost' => $dbhost,
- '$dbport' => $dbport,
- '$dbuser' => $dbuser,
- '$dbpass' => $dbpass,
- '$dbdata' => $dbdata,
- '$phpath' => $phpath,
- '$dbtype' => $dbtype,
-
- '$adminmail' => array('adminmail', t('Site administrator email address'), $adminmail, t('Your account email address must match this in order to use the web admin panel.')),
-
- '$siteurl' => array('siteurl', t('Website URL'), z_root(), t('Please use SSL (https) URL if available.')),
- '$advanced' => array('advanced', t('Enable $Projectname <strong>advanced</strong> features?'), 1, t('Some advanced features, while useful - may be best suited for technically proficient audiences')),
-
- '$timezone' => array('timezone', t('Please select a default timezone for your website'), $timezone, '', get_timezones()),
-
- '$baseurl' => z_root(),
-
- '$submit' => t('Submit'),
- ));
- return $o;
- }; break;
- }
-}
-
-/**
- * @brief Add a check result to the array for output.
- *
- * @param[in,out] array &$checks array passed to template
- * @param string $title a title for the check
- * @param boolean $status
- * @param boolean $required
- * @param[optional] string $help optional help string
- */
-function check_add(&$checks, $title, $status, $required, $help = '') {
- $checks[] = array(
- 'title' => $title,
- 'status' => $status,
- 'required' => $required,
- 'help' => $help
- );
-}
-
-/**
- * @brief Checks the PHP environment.
- *
- * @param[in,out] string &$phpath
- * @param[out] array &$checks
- */
-function check_php(&$phpath, &$checks) {
- $help = '';
-
- if (strlen($phpath)) {
- $passed = file_exists($phpath);
- } else {
- if(is_windows())
- $phpath = trim(shell_exec('where php'));
- else
- $phpath = trim(shell_exec('which php'));
-
- $passed = strlen($phpath);
- }
-
- if(!$passed) {
- $help .= t('Could not find a command line version of PHP in the web server PATH.'). EOL;
- $help .= t('If you don\'t have a command line version of PHP installed on server, you will not be able to run background polling via cron.') . EOL;
- $help .= EOL . EOL ;
- $tpl = get_markup_template('field_input.tpl');
- $help .= replace_macros($tpl, array(
- '$field' => array('phpath', t('PHP executable path'), $phpath, t('Enter full path to php executable. You can leave this blank to continue the installation.')),
- ));
- $phpath = '';
- }
-
- check_add($checks, t('Command line PHP').($passed?" (<tt>$phpath</tt>)":""), $passed, false, $help);
-
- if($passed) {
- $str = autoname(8);
- $cmd = "$phpath install/testargs.php $str";
- $result = trim(shell_exec($cmd));
- $passed2 = $result == $str;
- $help = '';
- if(!$passed2) {
- $help .= t('The command line version of PHP on your system does not have "register_argc_argv" enabled.'). EOL;
- $help .= t('This is required for message delivery to work.');
- }
-
- check_add($checks, t('PHP register_argc_argv'), $passed, true, $help);
- }
-}
-
-/**
- * @brief Some PHP configuration checks.
- *
- * @todo Change how we display such informational text. Add more description
- * how to change them.
- *
- * @param[out] array &$checks
- */
-function check_phpconfig(&$checks) {
- require_once 'include/environment.php';
-
- $help = '';
-
- $result = getPhpiniUploadLimits();
- $help = sprintf(t('Your max allowed total upload size is set to %s. Maximum size of one file to upload is set to %s. You are allowed to upload up to %d files at once.'),
- userReadableSize($result['post_max_size']),
- userReadableSize($result['max_upload_filesize']),
- $result['max_file_uploads']
- );
- $help .= '<br>' . t('You can adjust these settings in the servers php.ini.');
-
- check_add($checks, t('PHP upload limits'), true, false, $help);
-}
-
-/**
- * @brief Check if the openssl implementation can generate keys.
- *
- * @param[out] array $checks
- */
-function check_keys(&$checks) {
- $help = '';
- $res = false;
-
- if (function_exists('openssl_pkey_new')) {
- $res = openssl_pkey_new(array(
- 'digest_alg' => 'sha1',
- 'private_key_bits' => 4096,
- 'encrypt_key' => false)
- );
- }
-
- // Get private key
-
- if (! $res) {
- $help .= t('Error: the "openssl_pkey_new" function on this system is not able to generate encryption keys'). EOL;
- $help .= t('If running under Windows, please see "http://www.php.net/manual/en/openssl.installation.php".');
- }
-
- check_add($checks, t('Generate encryption keys'), $res, true, $help);
-}
-
-/**
- * @brief Check for some PHP functions and modules.
- *
- * @param[in,out] array &$checks
- */
-function check_funcs(&$checks) {
- $ck_funcs = array();
-
- // add check metadata, the real check is done bit later and return values set
- check_add($ck_funcs, t('libCurl PHP module'), true, true);
- check_add($ck_funcs, t('GD graphics PHP module'), true, true);
- check_add($ck_funcs, t('OpenSSL PHP module'), true, true);
- check_add($ck_funcs, t('mysqli or postgres PHP module'), true, true);
- check_add($ck_funcs, t('mb_string PHP module'), true, true);
- check_add($ck_funcs, t('mcrypt PHP module'), true, true);
- check_add($ck_funcs, t('xml PHP module'), true, true);
-
- if(function_exists('apache_get_modules')){
- if (! in_array('mod_rewrite', apache_get_modules())) {
- check_add($ck_funcs, t('Apache mod_rewrite module'), false, true, t('Error: Apache webserver mod-rewrite module is required but not installed.'));
- } else {
- check_add($ck_funcs, t('Apache mod_rewrite module'), true, true);
- }
- }
- if((! function_exists('proc_open')) || strstr(ini_get('disable_functions'),'proc_open')) {
- check_add($ck_funcs, t('proc_open'), false, true, t('Error: proc_open is required but is either not installed or has been disabled in php.ini'));
- }
- else {
- check_add($ck_funcs, t('proc_open'), true, true);
- }
-
- if(! function_exists('curl_init')) {
- $ck_funcs[0]['status'] = false;
- $ck_funcs[0]['help'] = t('Error: libCURL PHP module required but not installed.');
- }
- if(! function_exists('imagecreatefromjpeg')) {
- $ck_funcs[1]['status'] = false;
- $ck_funcs[1]['help'] = t('Error: GD graphics PHP module with JPEG support required but not installed.');
- }
- if(! function_exists('openssl_public_encrypt')) {
- $ck_funcs[2]['status'] = false;
- $ck_funcs[2]['help'] = t('Error: openssl PHP module required but not installed.');
- }
- if(! function_exists('mysqli_connect') && !function_exists('pg_connect')) {
- $ck_funcs[3]['status'] = false;
- $ck_funcs[3]['help'] = t('Error: mysqli or postgres PHP module required but neither are installed.');
- }
- if(! function_exists('mb_strlen')) {
- $ck_funcs[4]['status'] = false;
- $ck_funcs[4]['help'] = t('Error: mb_string PHP module required but not installed.');
- }
- if(! function_exists('mcrypt_encrypt')) {
- $ck_funcs[5]['status'] = false;
- $ck_funcs[5]['help'] = t('Error: mcrypt PHP module required but not installed.');
- }
- if(! extension_loaded('xml')) {
- $ck_funcs[6]['status'] = false;
- $ck_funcs[6]['help'] = t('Error: xml PHP module required for DAV but not installed.');
- }
-
- $checks = array_merge($checks, $ck_funcs);
-}
-
-/**
- * @brief Check for .htconfig requirements.
- *
- * @param[out] array &$checks
- */
-function check_htconfig(&$checks) {
- $status = true;
- $help = '';
-
- if( (file_exists('.htconfig.php') && !is_writable('.htconfig.php')) ||
- (!file_exists('.htconfig.php') && !is_writable('.')) ) {
- $status = false;
- $help = t('The web installer needs to be able to create a file called ".htconfig.php" in the top folder of your web server and it is unable to do so.') .EOL;
- $help .= t('This is most often a permission setting, as the web server may not be able to write files in your folder - even if you can.').EOL;
- $help .= t('At the end of this procedure, we will give you a text to save in a file named .htconfig.php in your Red top folder.').EOL;
- $help .= t('You can alternatively skip this procedure and perform a manual installation. Please see the file "install/INSTALL.txt" for instructions.').EOL;
- }
-
- check_add($checks, t('.htconfig.php is writable'), $status, false, $help);
-}
-
-/**
- * @brief Checks for our templating engine Smarty3 requirements.
- *
- * @param[out] array &$checks
- */
-function check_smarty3(&$checks) {
- $status = true;
- $help = '';
-
- if(! is_writable(TEMPLATE_BUILD_PATH) ) {
- $status = false;
- $help = t('Red uses the Smarty3 template engine to render its web views. Smarty3 compiles templates to PHP to speed up rendering.') .EOL;
- $help .= sprintf( t('In order to store these compiled templates, the web server needs to have write access to the directory %s under the Red top level folder.'), TEMPLATE_BUILD_PATH) . EOL;
- $help .= t('Please ensure that the user that your web server runs as (e.g. www-data) has write access to this folder.').EOL;
- $help .= sprintf( t('Note: as a security measure, you should give the web server write access to %s only--not the template files (.tpl) that it contains.'), TEMPLATE_BUILD_PATH) . EOL;
- }
-
- check_add($checks, sprintf( t('%s is writable'), TEMPLATE_BUILD_PATH), $status, true, $help);
-}
-
-/**
- * @brief Check for store directory.
- *
- * @param[out] array &$checks
- */
-function check_store(&$checks) {
- $status = true;
- $help = '';
-
- @os_mkdir(TEMPLATE_BUILD_PATH, STORAGE_DEFAULT_PERMISSIONS, true);
-
- if(! is_writable('store')) {
- $status = false;
- $help = t('Red uses the store directory to save uploaded files. The web server needs to have write access to the store directory under the Red top level folder') . EOL;
- $help .= t('Please ensure that the user that your web server runs as (e.g. www-data) has write access to this folder.').EOL;
- }
-
- check_add($checks, t('store is writable'), $status, true, $help);
-}
-
-/**
- * @brief Check URL rewrite und SSL certificate.
- *
- * @param[out] array &$checks
- */
-function check_htaccess(&$checks) {
- $a = get_app();
- $status = true;
- $help = '';
- $ssl_error = false;
-
- $url = z_root() . '/setup/testrewrite';
-
- if (function_exists('curl_init')){
- $test = z_fetch_url($url);
- if(! $test['success']) {
- if(strstr($url,'https://')) {
- $test = z_fetch_url($url,false,0,array('novalidate' => true));
- if($test['success']) {
- $ssl_error = true;
- }
- }
- else {
- $test = z_fetch_url(str_replace('http://','https://',$url),false,0,array('novalidate' => true));
- if($test['success']) {
- $ssl_error = true;
- }
- }
-
- if($ssl_error) {
- $help = t('SSL certificate cannot be validated. Fix certificate or disable https access to this site.') . EOL;
- $help .= t('If you have https access to your website or allow connections to TCP port 443 (the https: port), you MUST use a browser-valid certificate. You MUST NOT use self-signed certificates!') . EOL;
- $help .= t('This restriction is incorporated because public posts from you may for example contain references to images on your own hub.') . EOL;
- $help .= t('If your certificate is not recognized, members of other sites (who may themselves have valid certificates) will get a warning message on their own site complaining about security issues.') . EOL;
- $help .= t('This can cause usability issues elsewhere (not just on your own site) so we must insist on this requirement.') .EOL;
- $help .= t('Providers are available that issue free certificates which are browser-valid.'). EOL;
-
- check_add($checks, t('SSL certificate validation'), false, true, $help);
- }
- }
-
- if ((! $test['success']) || ($test['body'] != "ok")) {
- $status = false;
- $help = t('Url rewrite in .htaccess is not working. Check your server configuration.'.'Test: '.var_export($test,true));
- }
-
- check_add($checks, t('Url rewrite is working'), $status, true, $help);
- } else {
- // cannot check modrewrite if libcurl is not installed
- }
-}
-
-
-function manual_config(&$a) {
- $data = htmlspecialchars(App::$data['txt'], ENT_COMPAT, 'UTF-8');
- $o = t('The database configuration file ".htconfig.php" could not be written. Please use the enclosed text to create a configuration file in your web server root.');
- $o .= "<textarea rows=\"24\" cols=\"80\" >$data</textarea>";
-
- return $o;
-}
-
-function load_database_rem($v, $i){
- $l = trim($i);
- if (strlen($l)>1 && ($l[0]=="-" || ($l[0]=="/" && $l[1]=="*"))){
- return $v;
- } else {
- return $v."\n".$i;
- }
-}
-
-
-function load_database($db) {
- $str = file_get_contents($db->get_install_script());
- $arr = explode(';',$str);
- $errors = false;
- foreach($arr as $a) {
- if(strlen(trim($a))) {
- $r = @$db->q(trim($a));
- if(! $r) {
- $errors .= t('Errors encountered creating database tables.') . $a . EOL;
- }
- }
- }
-
- return $errors;
-}
-
-function what_next() {
- $a = get_app();
- // install the standard theme
- set_config('system', 'allowed_themes', 'redbasic');
-
- // Set a lenient list of ciphers if using openssl. Other ssl engines
- // (e.g. NSS used in RedHat) require different syntax, so hopefully
- // the default curl cipher list will work for most sites. If not,
- // this can set via config. Many distros are now disabling RC4,
- // but many Red sites still use it and are unable to change it.
- // We do not use SSL for encryption, only to protect session cookies.
- // z_fetch_url() is also used to import shared links and other content
- // so in theory most any cipher could show up and we should do our best
- // to make the content available rather than tell folks that there's a
- // weird SSL error which they can't do anything about.
-
- $x = curl_version();
- if(stristr($x['ssl_version'],'openssl'))
- set_config('system','curl_ssl_ciphers','ALL:!eNULL');
-
- // Create a system channel
- require_once ('include/identity.php');
- create_sys_channel();
-
- $baseurl = z_root();
- return
- t('<h1>What next</h1>')
- ."<p>".t('IMPORTANT: You will need to [manually] setup a scheduled task for the poller.')
- .t('Please see the file "install/INSTALL.txt".')
- ."</p><p>"
- .t("Go to your new hub <a href='$baseurl/register'>registration page</a> and register as new member. Remember to use the same email you have entered as administrator email. This will allow you to enter the site admin panel.")
- ."</p>";
-}
diff --git a/mod/share.php b/mod/share.php
deleted file mode 100644
index 43206b487..000000000
--- a/mod/share.php
+++ /dev/null
@@ -1,87 +0,0 @@
-<?php
-
-require_once('include/security.php');
-require_once('include/bbcode.php');
-
-function share_init(&$a) {
-
- $post_id = ((argc() > 1) ? intval(argv(1)) : 0);
-
- if(! $post_id)
- killme();
-
- if(! (local_channel() || remote_channel()))
- killme();
-
- $r = q("SELECT * from item left join xchan on author_xchan = xchan_hash WHERE id = %d LIMIT 1",
- intval($post_id)
- );
- if(! $r)
- killme();
- if(($r[0]['item_private']) && ($r[0]['xchan_network'] !== 'rss'))
- killme();
-
- $sql_extra = item_permissions_sql($r[0]['uid']);
-
- $r = q("select * from item where id = %d $sql_extra",
- intval($post_id)
- );
- if(! $r)
- killme();
-
- /** @FIXME we only share bbcode */
-
- if($r[0]['mimetype'] !== 'text/bbcode')
- killme();
-
- /** @FIXME eventually we want to post remotely via rpost on your home site */
- // When that works remove this next bit:
-
- if(! local_channel())
- killme();
-
- xchan_query($r);
-
- $is_photo = (($r[0]['obj_type'] === ACTIVITY_OBJ_PHOTO) ? true : false);
- if($is_photo) {
- $object = json_decode($r[0]['object'],true);
- $photo_bb = $object['body'];
- }
-
- if (strpos($r[0]['body'], "[/share]") !== false) {
- $pos = strpos($r[0]['body'], "[share");
- $o = substr($r[0]['body'], $pos);
- } else {
- $o = "[share author='".urlencode($r[0]['author']['xchan_name']).
- "' profile='".$r[0]['author']['xchan_url'] .
- "' avatar='".$r[0]['author']['xchan_photo_s'].
- "' link='".$r[0]['plink'].
- "' posted='".$r[0]['created'].
- "' message_id='".$r[0]['mid']."']";
- if($r[0]['title'])
- $o .= '[b]'.$r[0]['title'].'[/b]'."\r\n";
- $o .= (($is_photo) ? $photo_bb . "\r\n" . $r[0]['body'] : $r[0]['body']);
- $o .= "[/share]";
- }
-
- if(local_channel()) {
- echo $o;
- killme();
- }
-
- $observer = App::get_observer();
- $parsed = $observer['xchan_url'];
- if($parsed) {
- $post_url = $parsed['scheme'] . ':' . $parsed['host'] . (($parsed['port']) ? ':' . $parsed['port'] : '')
- . '/rpost';
-
- /**
- * @FIXME we were probably called from JS so we don't know the return page.
- * In fact we won't be able to load the remote page.
- * we might need an iframe
- */
-
- $x = z_post_url($post_url, array('f' => '', 'body' => $o ));
- killme();
- }
-}
diff --git a/mod/sharedwithme.php b/mod/sharedwithme.php
deleted file mode 100644
index 27c238270..000000000
--- a/mod/sharedwithme.php
+++ /dev/null
@@ -1,107 +0,0 @@
-<?php
-require_once('include/conversation.php');
-require_once('include/text.php');
-
-function sharedwithme_content(&$a) {
- if(! local_channel()) {
- notice( t('Permission denied.') . EOL);
- return;
- }
-
- $channel = App::get_channel();
-
- $is_owner = (local_channel() && (local_channel() == $channel['channel_id']));
-
- //check for updated items and remove them
- require_once('include/sharedwithme.php');
- apply_updates();
-
- //drop single file - localuser
- if((argc() > 2) && (argv(2) === 'drop')) {
-
- $id = intval(argv(1));
-
- q("DELETE FROM item WHERE id = %d AND uid = %d",
- intval($id),
- intval(local_channel())
- );
-
- goaway(z_root() . '/sharedwithme');
- }
-
- //drop all files - localuser
- if((argc() > 1) && (argv(1) === 'dropall')) {
-
- q("DELETE FROM item WHERE verb = '%s' AND obj_type = '%s' AND uid = %d",
- dbesc(ACTIVITY_POST),
- dbesc(ACTIVITY_OBJ_FILE),
- intval(local_channel())
- );
-
- goaway(z_root() . '/sharedwithme');
- }
-
- //list files
- $r = q("SELECT id, uid, object, item_unseen FROM item WHERE verb = '%s' AND obj_type = '%s' AND uid = %d AND owner_xchan != '%s'",
- dbesc(ACTIVITY_POST),
- dbesc(ACTIVITY_OBJ_FILE),
- intval(local_channel()),
- dbesc($channel['channel_hash'])
- );
-
- $items =array();
- $ids = '';
-
- if($r) {
-
- foreach($r as $rr) {
- $object = json_decode($rr['object'],true);
-
- $item = array();
- $item['id'] = $rr['id'];
- $item['objfiletype'] = $object['filetype'];
- $item['objfiletypeclass'] = getIconFromType($object['filetype']);
- $item['objurl'] = rawurldecode(get_rel_link($object['link'],'alternate')) . '?f=&zid=' . $channel['xchan_addr'];
- $item['objfilename'] = $object['filename'];
- $item['objfilesize'] = userReadableSize($object['filesize']);
- $item['objedited'] = $object['edited'];
- $item['unseen'] = $rr['item_unseen'];
-
- $items[] = $item;
-
- if($item['unseen'] > 0) {
- $ids .= " '" . $rr['id'] . "',";
- }
-
- }
-
- }
-
- if($ids) {
-
- //remove trailing ,
- $ids = rtrim($ids, ",");
-
- q("UPDATE item SET item_unseen = 0 WHERE id IN ( $ids ) AND uid = %d",
- intval(local_channel())
- );
-
- }
-
- $o = profile_tabs($a, $is_owner, $channel['channel_address']);
-
- $o .= replace_macros(get_markup_template('sharedwithme.tpl'), array(
- '$header' => t('Files: shared with me'),
- '$name' => t('Name'),
- '$label_new' => t('NEW'),
- '$size' => t('Size'),
- '$lastmod' => t('Last Modified'),
- '$dropall' => t('Remove all files'),
- '$drop' => t('Remove this file'),
- '$items' => $items
- ));
-
- return $o;
-
-}
-
diff --git a/mod/siteinfo.php b/mod/siteinfo.php
deleted file mode 100644
index 7711fafb2..000000000
--- a/mod/siteinfo.php
+++ /dev/null
@@ -1,88 +0,0 @@
-<?php
-
-function siteinfo_init(&$a) {
- if (argv(1) === 'json') {
- $data = get_site_info();
- json_return_and_die($data);
- }
-}
-
-
-
-function siteinfo_content(&$a) {
-
- if(! get_config('system','hidden_version_siteinfo')) {
- $version = sprintf( t('Version %s'), Zotlabs\Project\System::get_project_version());
- if(@is_dir('.git') && function_exists('shell_exec')) {
- $commit = @shell_exec('git log -1 --format="%h"');
- $tag = Zotlabs\Project\System::get_std_version(); // @shell_exec('git describe --tags --abbrev=0');
- }
- if(! isset($commit) || strlen($commit) > 16)
- $commit = '';
- }
- else {
- $version = $commit = '';
- }
- $visible_plugins = array();
- if(is_array(App::$plugins) && count(App::$plugins)) {
- $r = q("select * from addon where hidden = 0");
- if(count($r))
- foreach($r as $rr)
- $visible_plugins[] = $rr['name'];
- }
-
- $plugins_list = '';
- if(count($visible_plugins)) {
- $plugins_text = t('Installed plugins/addons/apps:');
- $sorted = $visible_plugins;
- $s = '';
- sort($sorted);
- foreach($sorted as $p) {
- if(strlen($p)) {
- if(strlen($s)) $s .= ', ';
- $s .= $p;
- }
- }
- $plugins_list .= $s;
- }
- else
- $plugins_text = t('No installed plugins/addons/apps');
-
- $txt = get_config('system','admininfo');
- $admininfo = bbcode($txt);
-
- if(file_exists('doc/site_donate.html'))
- $donate .= file_get_contents('doc/site_donate.html');
-
- if(function_exists('sys_getloadavg'))
- $loadavg = sys_getloadavg();
-
- $o = replace_macros(get_markup_template('siteinfo.tpl'), array(
- '$title' => t('$Projectname'),
- '$description' => t('This is a hub of $Projectname - a global cooperative network of decentralized privacy enhanced websites.'),
- '$version' => $version,
- '$tag_txt' => t('Tag: '),
- '$tag' => $tag,
- '$polled' => t('Last background fetch: '),
- '$lastpoll' => get_poller_runtime(),
- '$load_average' => t('Current load average: '),
- '$loadavg_all' => $loadavg[0] . ', ' . $loadavg[1] . ', ' . $loadavg[2],
- '$commit' => $commit,
- '$web_location' => t('Running at web location') . ' ' . z_root(),
- '$visit' => t('Please visit <a href="http://hubzilla.org">hubzilla.org</a> to learn more about $Projectname.'),
- '$bug_text' => t('Bug reports and issues: please visit'),
- '$bug_link_url' => 'https://github.com/redmatrix/hubzilla/issues',
- '$bug_link_text' => t('$projectname issues'),
- '$contact' => t('Suggestions, praise, etc. - please email "redmatrix" at librelist - dot com'),
- '$donate' => $donate,
- '$adminlabel' => t('Site Administrators'),
- '$admininfo' => $admininfo,
- '$plugins_text' => $plugins_text,
- '$plugins_list' => $plugins_list
- ));
-
- call_hooks('about_hook', $o);
-
- return $o;
-
-}
diff --git a/mod/siteinfo_json.php b/mod/siteinfo_json.php
deleted file mode 100644
index 35697917c..000000000
--- a/mod/siteinfo_json.php
+++ /dev/null
@@ -1,8 +0,0 @@
-<?php
-
-function siteinfo_json_init(&$a) {
-
- $data = get_site_info();
- json_return_and_die($data);
-
-}
diff --git a/mod/sitelist.php b/mod/sitelist.php
deleted file mode 100644
index 30b2359ac..000000000
--- a/mod/sitelist.php
+++ /dev/null
@@ -1,62 +0,0 @@
-<?php /** @file */
-
-function sitelist_init(&$a) {
-
- $start = (($_REQUEST['start']) ? intval($_REQUEST['start']) : 0);
- $limit = ((intval($_REQUEST['limit'])) ? intval($_REQUEST['limit']) : 30);
- $order = (($_REQUEST['order']) ? $_REQUEST['order'] : 'random');
- $open = (($_REQUEST['open']) ? intval($_REQUEST['open']) : false);
-
-
- $sql_order = " order by site_url ";
- $rand = db_getfunc('rand');
- if($order == 'random')
- $sql_order = " order by $rand ";
-
- $sql_limit = " LIMIT $limit OFFSET $start ";
-
- $sql_extra = "";
- if($open)
- $sql_extra = " and site_register = " . intval(REGISTER_OPEN) . " ";
-
- $realm = get_directory_realm();
- if($realm == DIRECTORY_REALM) {
- $sql_extra .= " and ( site_realm = '" . dbesc($realm) . "' or site_realm = '') ";
- }
- else
- $sql_extra .= " and site_realm = '" . dbesc($realm) . "' ";
-
- $result = array('success' => false);
-
- $r = q("select count(site_url) as total from site where site_type = %d $sql_extra ",
- intval(SITE_TYPE_ZOT)
- );
-
- if($r)
- $result['total'] = intval($r[0]['total']);
-
- $result['start'] = $start;
- $result['limit'] = $limit;
-
- $r = q("select * from site where site_type = %d $sql_extra $sql_order $sql_limit",
- intval(SITE_TYPE_ZOT)
- );
-
- $result['results'] = 0;
- $result['entries'] = array();
-
- if($r) {
- $result['success'] = true;
- $result['results'] = count($r);
-
- foreach($r as $rr) {
- $result['entries'][] = array('url' => $rr['site_url']);
- }
-
- }
-
- echo json_encode($result);
- killme();
-
-
-} \ No newline at end of file
diff --git a/mod/smilies.php b/mod/smilies.php
deleted file mode 100644
index 2ccc007b4..000000000
--- a/mod/smilies.php
+++ /dev/null
@@ -1,15 +0,0 @@
-<?php
-
-function smilies_content(&$a) {
- if (App::$argv[1]==="json"){
- $tmp = list_smilies();
- $results = array();
- for($i = 0; $i < count($tmp['texts']); $i++) {
- $results[] = array('text' => $tmp['texts'][$i], 'icon' => $tmp['icons'][$i]);
- }
- json_return_and_die($results);
- }
- else {
- return smilies('',true);
- }
-}
diff --git a/mod/sources.php b/mod/sources.php
deleted file mode 100644
index 6ea0743aa..000000000
--- a/mod/sources.php
+++ /dev/null
@@ -1,168 +0,0 @@
-<?php /** @file */
-
-function sources_post(&$a) {
- if(! local_channel())
- return;
-
- if(! feature_enabled(local_channel(),'channel_sources'))
- return '';
-
- $source = intval($_REQUEST['source']);
- $xchan = $_REQUEST['xchan'];
- $abook = intval($_REQUEST['abook']);
- $words = $_REQUEST['words'];
- $frequency = $_REQUEST['frequency'];
- $name = $_REQUEST['name'];
-
- $channel = App::get_channel();
-
- if($name == '*')
- $xchan = '*';
-
- if($abook) {
- $r = q("select abook_xchan from abook where abook_id = %d and abook_channel = %d limit 1",
- intval($abook),
- intval(local_channel())
- );
- if($r)
- $xchan = $r[0]['abook_xchan'];
- }
-
- if(! $xchan) {
- notice ( t('Failed to create source. No channel selected.') . EOL);
- return;
- }
-
- if(! $source) {
- $r = q("insert into source ( src_channel_id, src_channel_xchan, src_xchan, src_patt )
- values ( %d, '%s', '%s', '%s' ) ",
- intval(local_channel()),
- dbesc($channel['channel_hash']),
- dbesc($xchan),
- dbesc($words)
- );
- if($r) {
- info( t('Source created.') . EOL);
- }
- goaway(z_root() . '/sources');
- }
- else {
- $r = q("update source set src_xchan = '%s', src_patt = '%s' where src_channel_id = %d and src_id = %d",
- dbesc($xchan),
- dbesc($words),
- intval(local_channel()),
- intval($source)
- );
- if($r) {
- info( t('Source updated.') . EOL);
- }
-
- }
-}
-
-
-function sources_content(&$a) {
- if(! local_channel()) {
- notice( t('Permission denied.') . EOL);
- return '';
- }
-
- if(! feature_enabled(local_channel(),'channel_sources')) {
- return '';
- }
-
- // list sources
- if(argc() == 1) {
- $r = q("select source.*, xchan.* from source left join xchan on src_xchan = xchan_hash where src_channel_id = %d",
- intval(local_channel())
- );
- if($r) {
- for($x = 0; $x < count($r); $x ++) {
- if($r[$x]['src_xchan'] == '*') {
- $r[$x]['xchan_name'] = t('*');
- }
- $r[$x]['src_patt'] = htmlspecialchars($r[$x]['src_patt'], ENT_COMPAT,'UTF-8');
- }
- }
- $o = replace_macros(get_markup_template('sources_list.tpl'), array(
- '$title' => t('Channel Sources'),
- '$desc' => t('Manage remote sources of content for your channel.'),
- '$new' => t('New Source'),
- '$sources' => $r
- ));
- return $o;
- }
-
- if(argc() == 2 && argv(1) === 'new') {
- // TODO add the words 'or RSS feed' and corresponding code to manage feeds and frequency
-
- $o = replace_macros(get_markup_template('sources_new.tpl'), array(
- '$title' => t('New Source'),
- '$desc' => t('Import all or selected content from the following channel into this channel and distribute it according to your channel settings.'),
- '$words' => array( 'words', t('Only import content with these words (one per line)'),'',t('Leave blank to import all public content')),
- '$name' => array( 'name', t('Channel Name'), '', ''),
- '$submit' => t('Submit')
- ));
- return $o;
-
- }
-
- if(argc() == 2 && intval(argv(1))) {
- // edit source
- $r = q("select source.*, xchan.* from source left join xchan on src_xchan = xchan_hash where src_id = %d and src_channel_id = %d limit 1",
- intval(argv(1)),
- intval(local_channel())
- );
- if($r) {
- $x = q("select abook_id from abook where abook_xchan = '%s' and abook_channel = %d limit 1",
- dbesc($r[0]['src_xchan']),
- intval(local_channel())
- );
- }
- if(! $r) {
- notice( t('Source not found.') . EOL);
- return '';
- }
-
- $r[0]['src_patt'] = htmlspecialchars($r[0]['src_patt'], ENT_QUOTES,'UTF-8');
-
- $o = replace_macros(get_markup_template('sources_edit.tpl'), array(
- '$title' => t('Edit Source'),
- '$drop' => t('Delete Source'),
- '$id' => $r[0]['src_id'],
- '$desc' => t('Import all or selected content from the following channel into this channel and distribute it according to your channel settings.'),
- '$words' => array( 'words', t('Only import content with these words (one per line)'),$r[0]['src_patt'],t('Leave blank to import all public content')),
- '$xchan' => $r[0]['src_xchan'],
- '$abook' => $x[0]['abook_id'],
- '$name' => array( 'name', t('Channel Name'), $r[0]['xchan_name'], ''),
- '$submit' => t('Submit')
- ));
- return $o;
-
- }
-
- if(argc() == 3 && intval(argv(1)) && argv(2) === 'drop') {
- $r = q("select * from source where src_id = %d and src_channel_id = %d limit 1",
- intval(argv(1)),
- intval(local_channel())
- );
- if(! $r) {
- notice( t('Source not found.') . EOL);
- return '';
- }
- $r = q("delete from source where src_id = %d and src_channel_id = %d",
- intval(argv(1)),
- intval(local_channel())
- );
- if($r)
- info( t('Source removed') . EOL);
- else
- notice( t('Unable to remove source.') . EOL);
-
- goaway(z_root() . '/sources');
-
- }
-
- // shouldn't get here.
-
-} \ No newline at end of file
diff --git a/mod/sslify.php b/mod/sslify.php
deleted file mode 100644
index f37a8e23e..000000000
--- a/mod/sslify.php
+++ /dev/null
@@ -1,24 +0,0 @@
-<?php
-
-function sslify_init(&$a) {
- $x = z_fetch_url($_REQUEST['url']);
- if($x['success']) {
- $h = explode("\n",$x['header']);
- foreach ($h as $l) {
- list($k,$v) = array_map("trim", explode(":", trim($l), 2));
- $hdrs[$k] = $v;
- }
- if (array_key_exists('Content-Type', $hdrs))
- $type = $hdrs['Content-Type'];
-
- header('Content-Type: ' . $type);
- echo $x['body'];
- killme();
- }
- killme();
- // for some reason when this fallback is in place - it gets triggered
- // often, (creating mixed content exceptions) even though there is
- // nothing obvious missing on the page when we bypass it.
- goaway($_REQUEST['url']);
-}
-
diff --git a/mod/starred.php b/mod/starred.php
deleted file mode 100644
index 103e5f4b4..000000000
--- a/mod/starred.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-
-
-function starred_init(&$a) {
-
- $starred = 0;
-
- if(! local_channel())
- killme();
- if(argc() > 1)
- $message_id = intval(argv(1));
- if(! $message_id)
- killme();
-
- $r = q("SELECT item_flags FROM item WHERE uid = %d AND id = %d LIMIT 1",
- intval(local_channel()),
- intval($message_id)
- );
- if(! count($r))
- killme();
-
- $item_starred = (intval($r[0]['item_starred']) ? 0 : 1);
-
- $r = q("UPDATE item SET item_starred = %d WHERE uid = %d and id = %d",
- intval($item_starred),
- intval(local_channel()),
- intval($message_id)
- );
-
- header('Content-type: application/json');
- echo json_encode(array('result' => $item_starred));
- killme();
-}
diff --git a/mod/subthread.php b/mod/subthread.php
deleted file mode 100755
index aca034d43..000000000
--- a/mod/subthread.php
+++ /dev/null
@@ -1,163 +0,0 @@
-<?php
-
-require_once('include/security.php');
-require_once('include/bbcode.php');
-require_once('include/items.php');
-
-
-function subthread_content(&$a) {
-
- if((! local_channel()) && (! remote_channel())) {
- return;
- }
-
- $item_id = ((argc() > 2) ? notags(trim(argv(2))) : 0);
-
- if(argv(1) === 'sub')
- $activity = ACTIVITY_FOLLOW;
- elseif(argv(1) === 'unsub')
- $activity = ACTIVITY_UNFOLLOW;
-
-
- $r = q("SELECT parent FROM item WHERE id = '%s'",
- dbesc($item_id)
- );
-
- if($r) {
- $r = q("select * from item where id = parent and id = %d limit 1",
- dbesc($r[0]['parent'])
- );
- }
-
- if((! $item_id) || (! $r)) {
- logger('subthread: no item ' . $item_id);
- return;
- }
-
- $item = $r[0];
-
- $owner_uid = $item['uid'];
- $observer = App::get_observer();
- $ob_hash = (($observer) ? $observer['xchan_hash'] : '');
-
- if(! perm_is_allowed($owner_uid,$ob_hash,'post_comments'))
- return;
-
- $sys = get_sys_channel();
-
- $owner_uid = $item['uid'];
- $owner_aid = $item['aid'];
-
- // if this is a "discover" item, (item['uid'] is the sys channel),
- // fallback to the item comment policy, which should've been
- // respected when generating the conversation thread.
- // Even if the activity is rejected by the item owner, it should still get attached
- // to the local discover conversation on this site.
-
- if(($owner_uid != $sys['channel_id']) && (! perm_is_allowed($owner_uid,$observer['xchan_hash'],'post_comments'))) {
- notice( t('Permission denied') . EOL);
- killme();
- }
-
- $r = q("select * from xchan where xchan_hash = '%s' limit 1",
- dbesc($item['owner_xchan'])
- );
- if($r)
- $thread_owner = $r[0];
- else
- killme();
-
- $r = q("select * from xchan where xchan_hash = '%s' limit 1",
- dbesc($item['author_xchan'])
- );
- if($r)
- $item_author = $r[0];
- else
- killme();
-
-
-
-
- $mid = item_message_id();
-
- $post_type = (($item['resource_type'] === 'photo') ? t('photo') : t('status'));
-
- $links = array(array('rel' => 'alternate','type' => 'text/html', 'href' => $item['plink']));
- $objtype = (($item['resource_type'] === 'photo') ? ACTIVITY_OBJ_PHOTO : ACTIVITY_OBJ_NOTE );
-
- $body = $item['body'];
-
- $obj = json_encode(array(
- 'type' => $objtype,
- 'id' => $item['mid'],
- 'parent' => (($item['thr_parent']) ? $item['thr_parent'] : $item['parent_mid']),
- 'link' => $links,
- 'title' => $item['title'],
- 'content' => $item['body'],
- 'created' => $item['created'],
- 'edited' => $item['edited'],
- 'author' => array(
- 'name' => $item_author['xchan_name'],
- 'address' => $item_author['xchan_addr'],
- 'guid' => $item_author['xchan_guid'],
- 'guid_sig' => $item_author['xchan_guid_sig'],
- 'link' => array(
- array('rel' => 'alternate', 'type' => 'text/html', 'href' => $item_author['xchan_url']),
- array('rel' => 'photo', 'type' => $item_author['xchan_photo_mimetype'], 'href' => $item_author['xchan_photo_m'])),
- ),
- ));
-
- if(! intval($item['item_thread_top']))
- $post_type = 'comment';
-
- if($activity === ACTIVITY_FOLLOW)
- $bodyverb = t('%1$s is following %2$s\'s %3$s');
- if($activity === ACTIVITY_UNFOLLOW)
- $bodyverb = t('%1$s stopped following %2$s\'s %3$s');
-
- $arr = array();
-
- $arr['mid'] = $mid;
- $arr['aid'] = $owner_aid;
- $arr['uid'] = $owner_uid;
- $arr['parent'] = $item['id'];
- $arr['parent_mid'] = $item['mid'];
- $arr['thr_parent'] = $item['mid'];
- $arr['owner_xchan'] = $thread_owner['xchan_hash'];
- $arr['author_xchan'] = $observer['xchan_hash'];
- $arr['item_origin'] = 1;
- $arr['item_notshown'] = 1;
- if(intval($item['item_wall']))
- $arr['item_wall'] = 1;
- else
- $arr['item_wall'] = 0;
-
- $ulink = '[zrl=' . $item_author['xchan_url'] . ']' . $item_author['xchan_name'] . '[/zrl]';
- $alink = '[zrl=' . $observer['xchan_url'] . ']' . $observer['xchan_name'] . '[/zrl]';
- $plink = '[zrl=' . z_root() . '/display/' . $item['mid'] . ']' . $post_type . '[/zrl]';
-
- $arr['body'] = sprintf( $bodyverb, $alink, $ulink, $plink );
-
- $arr['verb'] = $activity;
- $arr['obj_type'] = $objtype;
- $arr['object'] = $obj;
-
- $arr['allow_cid'] = $item['allow_cid'];
- $arr['allow_gid'] = $item['allow_gid'];
- $arr['deny_cid'] = $item['deny_cid'];
- $arr['deny_gid'] = $item['deny_gid'];
-
- $post = item_store($arr);
- $post_id = $post['item_id'];
-
- $arr['id'] = $post_id;
-
- call_hooks('post_local_end', $arr);
-
- killme();
-
-
-}
-
-
-
diff --git a/mod/suggest.php b/mod/suggest.php
deleted file mode 100644
index ca888310a..000000000
--- a/mod/suggest.php
+++ /dev/null
@@ -1,66 +0,0 @@
-<?php
-
-require_once('include/socgraph.php');
-require_once('include/contact_widgets.php');
-require_once('include/widgets.php');
-
-
-function suggest_init(&$a) {
- if(! local_channel())
- return;
-
- if(x($_GET,'ignore')) {
- q("insert into xign ( uid, xchan ) values ( %d, '%s' ) ",
- intval(local_channel()),
- dbesc($_GET['ignore'])
- );
- }
-
-}
-
-
-function suggest_content(&$a) {
-
- $o = '';
- if(! local_channel()) {
- notice( t('Permission denied.') . EOL);
- return;
- }
-
- $_SESSION['return_url'] = z_root() . '/' . App::$cmd;
-
- $r = suggestion_query(local_channel(),get_observer_hash());
-
- if(! $r) {
- info( t('No suggestions available. If this is a new site, please try again in 24 hours.'));
- return;
- }
-
- $arr = array();
-
- foreach($r as $rr) {
-
- $connlnk = z_root() . '/follow/?url=' . $rr['xchan_addr'];
-
- $arr[] = array(
- 'url' => chanlink_url($rr['xchan_url']),
- 'common' => $rr['total'],
- 'profile' => $rr['xchan_url'],
- 'name' => $rr['xchan_name'],
- 'photo' => $rr['xchan_photo_m'],
- 'ignlnk' => z_root() . '/suggest?ignore=' . $rr['xchan_hash'],
- 'conntxt' => t('Connect'),
- 'connlnk' => $connlnk,
- 'ignore' => t('Ignore/Hide')
- );
- }
-
-
- $o = replace_macros(get_markup_template('suggest_page.tpl'),array(
- '$title' => t('Channel Suggestions'),
- '$entries' => $arr
- ));
-
- return $o;
-
-}
diff --git a/mod/tagger.php b/mod/tagger.php
deleted file mode 100644
index 330b65b91..000000000
--- a/mod/tagger.php
+++ /dev/null
@@ -1,134 +0,0 @@
-<?php
-
-require_once('include/security.php');
-require_once('include/bbcode.php');
-require_once('include/items.php');
-
-
-function tagger_content(&$a) {
-
- if(! local_channel() && ! remote_channel()) {
- return;
- }
-
- $observer_hash = get_observer_hash();
- //strip html-tags
- $term = notags(trim($_GET['term']));
- //check if empty
- if(! $term)
- return;
-
- $item_id = ((argc() > 1) ? notags(trim(argv(1))) : 0);
-
- logger('tagger: tag ' . $term . ' item ' . $item_id);
-
-
- $r = q("SELECT * FROM item left join xchan on xchan_hash = author_xchan WHERE id = '%s' and uid = %d LIMIT 1",
- dbesc($item_id),
- intval(local_channel())
- );
-
- if((! $item_id) || (! $r)) {
- logger('tagger: no item ' . $item_id);
- return;
- }
-
- $item = $r[0];
-
- $owner_uid = $item['uid'];
-
- switch($item['resource_type']) {
- case 'photo':
- $targettype = ACTIVITY_OBJ_PHOTO;
- $post_type = t('photo');
- break;
- case 'event':
- $targgettype = ACTIVITY_OBJ_EVENT;
- $post_type = t('event');
- break;
- default:
- $targettype = ACTIVITY_OBJ_NOTE;
- $post_type = t('post');
- if($item['mid'] != $item['parent_mid'])
- $post_type = t('comment');
- break;
- }
-
-
- $links = array(array('rel' => 'alternate','type' => 'text/html',
- 'href' => z_root() . '/display/' . $item['mid']));
-
- $target = json_encode(array(
- 'type' => $targettype,
- 'id' => $item['mid'],
- 'link' => $links,
- 'title' => $item['title'],
- 'content' => $item['body'],
- 'created' => $item['created'],
- 'edited' => $item['edited'],
- 'author' => array(
- 'name' => $item['xchan_name'],
- 'address' => $item['xchan_addr'],
- 'guid' => $item['xchan_guid'],
- 'guid_sig' => $item['xchan_guid_sig'],
- 'link' => array(
- array('rel' => 'alternate', 'type' => 'text/html', 'href' => $item['xchan_url']),
- array('rel' => 'photo', 'type' => $item['xchan_photo_mimetype'], 'href' => $item['xchan_photo_m'])),
- ),
- ));
-
-
-
- $link = xmlify('<link rel="alternate" type="text/html" href="'
- . z_root() . '/display/' . $owner['nickname'] . '/' . $item['id'] . '" />' . "\n") ;
-
- $tagid = z_root() . '/search?tag=' . $term;
- $objtype = ACTIVITY_OBJ_TAGTERM;
-
- $obj = json_encode(array(
- 'type' => $objtype,
- 'id' => $tagid,
- 'link' => array(array('rel' => 'alternate','type' => 'text/html', 'href' => $tagid)),
- 'title' => $term,
- 'content' => $term
- ));
-
- $bodyverb = t('%1$s tagged %2$s\'s %3$s with %4$s');
-
- // saving here for reference
- // also check out x22d5 and x2317 and x0d6b and x0db8 and x24d0 and xff20 !!!
-
- $termlink = html_entity_decode('&#x22d5;') . '[zrl=' . z_root() . '/search?tag=' . urlencode($term) . ']'. $term . '[/zrl]';
-
- $channel = App::get_channel();
-
- $arr = array();
-
- $arr['owner_xchan'] = $item['owner_xchan'];
- $arr['author_xchan'] = $channel['channel_hash'];
-
- $arr['item_origin'] = 1;
- $arr['item_wall'] = ((intval($item['item_wall'])) ? 1 : 0);
-
- $ulink = '[zrl=' . $channel['xchan_url'] . ']' . $channel['channel_name'] . '[/zrl]';
- $alink = '[zrl=' . $item['xchan_url'] . ']' . $item['xchan_name'] . '[/zrl]';
- $plink = '[zrl=' . $item['plink'] . ']' . $post_type . '[/zrl]';
-
- $arr['body'] = sprintf( $bodyverb, $ulink, $alink, $plink, $termlink );
-
- $arr['verb'] = ACTIVITY_TAG;
- $arr['tgt_type'] = $targettype;
- $arr['target'] = $target;
- $arr['obj_type'] = $objtype;
- $arr['object'] = $obj;
- $arr['parent_mid'] = $item['mid'];
-
- store_item_tag($item['uid'],$item['id'],TERM_OBJ_POST,TERM_COMMUNITYTAG,$term,$tagid);
- $ret = post_activity_item($arr);
-
- if($ret['success'])
- proc_run('php','include/notifier.php','tag',$ret['activity']['id']);
-
- killme();
-
-}
diff --git a/mod/tagrm.php b/mod/tagrm.php
deleted file mode 100644
index e10bbad73..000000000
--- a/mod/tagrm.php
+++ /dev/null
@@ -1,141 +0,0 @@
-<?php
-
-require_once('include/bbcode.php');
-
-function tagrm_post(&$a) {
-
- if(! local_channel())
- goaway(z_root() . '/' . $_SESSION['photo_return']);
-
-
- if((x($_POST,'submit')) && ($_POST['submit'] === t('Cancel')))
- goaway(z_root() . '/' . $_SESSION['photo_return']);
-
- $tag = ((x($_POST,'tag')) ? trim($_POST['tag']) : '');
- $item = ((x($_POST,'item')) ? intval($_POST['item']) : 0 );
-
- $r = q("SELECT * FROM `item` WHERE `id` = %d AND `uid` = %d LIMIT 1",
- intval($item),
- intval(local_channel())
- );
-
- if(! $r)
- goaway(z_root() . '/' . $_SESSION['photo_return']);
-
- $r = fetch_post_tags($r,true);
-
- $item = $r[0];
- $new_tags = array();
-
- if($item['term']) {
- for($x = 0; $x < count($item['term']); $x ++) {
- if($item['term'][$x]['term'] !== hex2bin($tag))
- $new_tags[] = $item['term'][$x];
- }
- }
-
- if($new_tags)
- $item['term'] = $new_tags;
- else
- unset($item['term']);
-
- item_store_update($item);
-
- info( t('Tag removed') . EOL );
- goaway(z_root() . '/' . $_SESSION['photo_return']);
-
- // NOTREACHED
-
-}
-
-
-
-function tagrm_content(&$a) {
-
- if(! local_channel()) {
- goaway(z_root() . '/' . $_SESSION['photo_return']);
- // NOTREACHED
- }
-
- // remove tag on the fly if item and tag are provided
- if((argc() == 4) && (argv(1) === 'drop') && intval(argv(2))) {
-
- $item = intval(argv(2));
- $tag = argv(3);
-
- $r = q("SELECT * FROM `item` WHERE `id` = %d AND `uid` = %d LIMIT 1",
- intval($item),
- intval(local_channel())
- );
-
- if(! $r)
- goaway(z_root() . '/' . $_SESSION['photo_return']);
-
- $r = fetch_post_tags($r,true);
-
- $item = $r[0];
-
- $new_tags = array();
-
- if($item['term']) {
- for($x = 0; $x < count($item['term']); $x ++) {
- if($item['term'][$x]['term'] !== hex2bin($tag))
- $new_tags[] = $item['term'][$x];
- }
- }
-
- if($new_tags)
- $item['term'] = $new_tags;
- else
- unset($item['term']);
-
- item_store_update($item);
-
- info( t('Tag removed') . EOL );
- goaway(z_root() . '/' . $_SESSION['photo_return']);
-
- }
-
- //if we got only the item print a list of tags to select
- if((argc() == 3) && (argv(1) === 'drop') && intval(argv(2))) {
-
- $o = '';
-
- $item = intval(argv(2));
-
- $r = q("SELECT * FROM `item` WHERE `id` = %d AND `uid` = %d LIMIT 1",
- intval($item),
- intval(local_channel())
- );
-
- if(! $r)
- goaway(z_root() . '/' . $_SESSION['photo_return']);
-
- $r = fetch_post_tags($r,true);
-
- if(! count($r[0]['term']))
- goaway(z_root() . '/' . $_SESSION['photo_return']);
-
- $o .= '<h3>' . t('Remove Item Tag') . '</h3>';
-
- $o .= '<p id="tag-remove-desc">' . t('Select a tag to remove: ') . '</p>';
-
- $o .= '<form id="tagrm" action="tagrm" method="post" >';
- $o .= '<input type="hidden" name="item" value="' . $item . '" />';
- $o .= '<ul>';
-
-
- foreach($r[0]['term'] as $x) {
- $o .= '<li><input type="checkbox" name="tag" value="' . bin2hex($x['term']) . '" >' . bbcode($x['term']) . '</input></li>';
- }
-
- $o .= '</ul>';
- $o .= '<input id="tagrm-submit" type="submit" name="submit" value="' . t('Remove') .'" />';
- $o .= '<input id="tagrm-cancel" type="submit" name="submit" value="' . t('Cancel') .'" />';
- $o .= '</form>';
-
- return $o;
-
- }
-
-}
diff --git a/mod/tasks.php b/mod/tasks.php
deleted file mode 100644
index e11166f93..000000000
--- a/mod/tasks.php
+++ /dev/null
@@ -1,107 +0,0 @@
-<?php
-
-require_once('include/event.php');
-
-
-function tasks_init(&$a) {
-
-
-// logger('request: ' . print_r($_REQUEST,true));
-
- $arr = array();
-
- if(argc() > 1 && argv(1) === 'fetch') {
- if(argc() > 2 && argv(2) === 'all')
- $arr['all'] = 1;
-
- $x = tasks_fetch($arr);
- if($x['tasks']) {
- $x['html'] = '';
- foreach($x['tasks'] as $y) {
- $x['html'] .= '<div class="tasklist-item"><input type="checkbox" onchange="taskComplete(' . $y['id'] . '); return false;" /> ' . $y['summary'] . '</div>';
- }
- }
- json_return_and_die($x);
- }
-
-}
-
-
-
-function tasks_post(&$a) {
-
-
-// logger('post: ' . print_r($_POST,true));
-
-
- if(! local_channel())
- return;
-
- $channel = App::get_channel();
-
- if((argc() > 2) && (argv(1) === 'complete') && intval(argv(2))) {
- $ret = array('success' => false);
- $r = q("select * from event where `type` = 'task' and uid = %d and id = %d limit 1",
- intval(local_channel()),
- intval(argv(2))
- );
- if($r) {
- $event = $r[0];
- if($event['event_status'] === 'COMPLETED') {
- $event['event_status'] = 'IN-PROCESS';
- $event['event_status_date'] = NULL_DATE;
- $event['event_percent'] = 0;
- $event['event_sequence'] = $event['event_sequence'] + 1;
- $event['edited'] = datetime_convert();
- }
- else {
- $event['event_status'] = 'COMPLETED';
- $event['event_status_date'] = datetime_convert();
- $event['event_percent'] = 100;
- $event['event_sequence'] = $event['event_sequence'] + 1;
- $event['edited'] = datetime_convert();
- }
- $x = event_store_event($event);
- if($x)
- $ret['success'] = true;
- }
- json_return_and_die($ret);
- }
-
- if(argc() == 2 && argv(1) === 'new') {
- $text = escape_tags(trim($_REQUEST['summary']));
- if(! $text)
- return array('success' => false);
- $event = array();
- $event['account'] = $channel['channel_account_id'];
- $event['uid'] = $channel['channel_id'];
- $event['event_xchan'] = $channel['channel_hash'];
- $event['type'] = 'task';
- $event['nofinish'] = true;
- $event['created'] = $event['edited'] = $event['start'] = datetime_convert();
- $event['adjust'] = 1;
- $event['allow_cid'] = '<' . $channel['channel_hash'] . '>';
- $event['summary'] = escape_tags($_REQUEST['summary']);
- $x = event_store_event($event);
- if($x)
- $x['success'] = true;
- else
- $x = array('success' => false);
- json_return_and_die($x);
- }
-
-
-}
-
-
-
-
-
-function tasks_content(&$a) {
-
- if(! local_channel())
- return;
-
-
- return '';
-} \ No newline at end of file
diff --git a/mod/thing.php b/mod/thing.php
deleted file mode 100644
index 44e9d9e2e..000000000
--- a/mod/thing.php
+++ /dev/null
@@ -1,362 +0,0 @@
-<?php
-/**
- * @file mod/thing.php
- * @brief
- */
-
-require_once('include/items.php');
-require_once('include/security.php');
-require_once('include/contact_selectors.php');
-require_once('include/acl_selectors.php');
-
-function thing_init(&$a) {
-
- if(! local_channel())
- return;
-
- $channel = App::get_channel();
-
- $term_hash = (($_REQUEST['term_hash']) ? $_REQUEST['term_hash'] : '');
-
- $name = escape_tags($_REQUEST['term']);
- $verb = escape_tags($_REQUEST['verb']);
- $activity = intval($_REQUEST['activity']);
- $profile_guid = escape_tags($_REQUEST['profile_assign']);
- $url = $_REQUEST['link'];
- $photo = $_REQUEST['img'];
-
- $hash = random_string();
-
- $verbs = obj_verbs();
-
- /**
- * verbs: [0] = first person singular, e.g. "I want", [1] = 3rd person singular, e.g. "Bill wants"
- * We use the first person form when creating an activity, but the third person for use in activities
- * @FIXME There is no accounting for verb gender for languages where this is significant. We may eventually
- * require obj_verbs() to provide full conjugations and specify which form to use in the $_REQUEST params to this module.
- */
-
- $translated_verb = $verbs[$verb][1];
-
- /*
- * The site administrator can do things that normals cannot.
- * This is restricted because it will likely cause
- * an activitystreams protocol violation and the activity might
- * choke in some other network and result in unnecessary
- * support requests. It isn't because we're trying to be heavy-handed
- * about what you can and can't do.
- */
-
- if(! $translated_verb) {
- if(is_site_admin())
- $translated_verb = $verb;
- }
-
- /*
- * Things, objects: We do not provide definite (a, an) or indefinite (the) articles or singular/plural designators
- * That needs to be specified in your thing. e.g. Mike has "a carrot", Greg wants "balls", Bob likes "the Boston Red Sox".
- */
-
- /*
- * Future work on this module might produce more complex activities with targets, e.g. Phillip likes Karen's moustache
- * and to describe other non-thing objects like channels, such as Karl wants Susan - where Susan represents a channel profile.
- */
-
- if((! $name) || (! $translated_verb))
- return;
-
- $acl = new Zotlabs\Access\AccessList($channel);
-
- if(array_key_exists('contact_allow',$_REQUEST)
- || array_key_exists('group_allow',$_REQUEST)
- || array_key_exists('contact_deny',$_REQUEST)
- || array_key_exists('group_deny',$_REQUEST)) {
- $acl->set_from_array($_REQUEST);
- }
-
- $x = $acl->get();
-
- if($term_hash) {
- $t = q("select * from obj where obj_obj = '%s' and obj_channel = %d limit 1",
- dbesc($term_hash),
- intval(local_channel())
- );
- if(! $t) {
- notice( t('Item not found.') . EOL);
- return;
- }
- $orig_record = $t[0];
- if($photo != $orig_record['obj_imgurl']) {
- $arr = import_xchan_photo($photo,get_observer_hash(),true);
- $local_photo = $arr[0];
- $local_photo_type = $arr[3];
- }
- else
- $local_photo = $orig_record['obj_imgurl'];
-
- $r = q("update obj set obj_term = '%s', obj_url = '%s', obj_imgurl = '%s', obj_edited = '%s', allow_cid = '%s', allow_gid = '%s', deny_cid = '%s', deny_gid = '%s' where obj_obj = '%s' and obj_channel = %d ",
- dbesc($name),
- dbesc(($url) ? $url : z_root() . '/thing/' . $term_hash),
- dbesc($local_photo),
- dbesc(datetime_convert()),
- dbesc($x['allow_cid']),
- dbesc($x['allow_gid']),
- dbesc($x['deny_cid']),
- dbesc($x['deny_gid']),
- dbesc($term_hash),
- intval(local_channel())
- );
-
- info( t('Thing updated') . EOL);
-
- $r = q("select * from obj where obj_channel = %d and obj_obj = '%s' limit 1",
- intval(local_channel()),
- dbesc($term_hash)
- );
- if($r) {
- build_sync_packet(0, array('obj' => $r));
- }
-
- return;
- }
-
- $sql = (($profile_guid) ? " and profile_guid = '" . dbesc($profile_guid) . "' " : " and is_default = 1 ");
- $p = q("select profile_guid, is_default from profile where uid = %d $sql limit 1",
- intval(local_channel())
- );
-
- if($p)
- $profile = $p[0];
- else
- return;
-
- $local_photo = null;
-
- if($photo) {
- $arr = import_xchan_photo($photo,get_observer_hash(),true);
- $local_photo = $arr[0];
- $local_photo_type = $arr[3];
- }
-
- $created = datetime_convert();
- $url = (($url) ? $url : z_root() . '/thing/' . $hash);
-
- $r = q("insert into obj ( obj_page, obj_verb, obj_type, obj_channel, obj_obj, obj_term, obj_url, obj_imgurl, obj_created, obj_edited, allow_cid, allow_gid, deny_cid, deny_gid ) values ('%s','%s', %d, %d, '%s','%s','%s','%s','%s','%s','%s','%s','%s','%s') ",
- dbesc($profile['profile_guid']),
- dbesc($verb),
- intval(TERM_OBJ_THING),
- intval(local_channel()),
- dbesc($hash),
- dbesc($name),
- dbesc($url),
- dbesc(($photo) ? $local_photo : ''),
- dbesc($created),
- dbesc($created),
- dbesc($x['allow_cid']),
- dbesc($x['allow_gid']),
- dbesc($x['deny_cid']),
- dbesc($x['deny_gid'])
- );
-
- if(! $r) {
- notice( t('Object store: failed'));
- return;
- }
-
- info( t('Thing added'));
-
- $r = q("select * from obj where obj_channel = %d and obj_obj = '%s' limit 1",
- intval(local_channel()),
- dbesc($hash)
- );
- if($r) {
- build_sync_packet(0, array('obj' => $r));
- }
-
- if($activity) {
- $arr = array();
- $links = array(array('rel' => 'alternate','type' => 'text/html', 'href' => $url));
- if($local_photo)
- $links[] = array('rel' => 'photo', 'type' => $local_photo_type, 'href' => $local_photo);
-
- $objtype = ACTIVITY_OBJ_THING;
-
- $obj = json_encode(array(
- 'type' => $objtype,
- 'id' => $url,
- 'link' => $links,
- 'title' => $name,
- 'content' => $name
- ));
-
- $bodyverb = str_replace('OBJ: ', '',t('OBJ: %1$s %2$s %3$s'));
-
- $arr['owner_xchan'] = $channel['channel_hash'];
- $arr['author_xchan'] = $channel['channel_hash'];
-
- $arr['item_origin'] = 1;
- $arr['item_wall'] = 1;
- $arr['item_thread_top'] = 1;
-
- $ulink = '[zrl=' . $channel['xchan_url'] . ']' . $channel['channel_name'] . '[/zrl]';
- $plink = '[zrl=' . $url . ']' . $name . '[/zrl]';
-
- $arr['body'] = sprintf( $bodyverb, $ulink, $translated_verb, $plink );
-
- if($local_photo)
- $arr['body'] .= "\n\n[zmg]" . $local_photo . "[/zmg]";
-
- $arr['verb'] = $verb;
- $arr['obj_type'] = $objtype;
- $arr['object'] = $obj;
-
- if(! $profile['is_default']) {
- $arr['item_private'] = true;
- $str = '';
- $r = q("select abook_xchan from abook where abook_channel = %d and abook_profile = '%s'",
- intval(local_channel()),
- dbesc($profile_guid)
- );
- if($r) {
- $arr['allow_cid'] = '';
- foreach($r as $rr)
- $arr['allow_cid'] .= '<' . $rr['abook_xchan'] . '>';
- }
- else
- $arr['allow_cid'] = '<' . get_observer_hash() . '>';
- }
-
- $ret = post_activity_item($arr);
- }
-}
-
-
-function thing_content(&$a) {
-
- // @FIXME one problem with things is we can't share them unless we provide the channel in the url
- // so we can definitively lookup the owner.
-
- if(argc() == 2) {
-
- $r = q("select obj_channel from obj where obj_type = %d and obj_obj = '%s' limit 1",
- intval(TERM_OBJ_THING),
- dbesc(argv(1))
- );
- if($r)
- $sql_extra = permissions_sql($r[0]['obj_channel']);
-
- $r = q("select * from obj where obj_type = %d and obj_obj = '%s' $sql_extra limit 1",
- intval(TERM_OBJ_THING),
- dbesc(argv(1))
- );
-
- if($r) {
- return replace_macros(get_markup_template('show_thing.tpl'), array(
- '$header' => t('Show Thing'),
- '$edit' => t('Edit'),
- '$delete' => t('Delete'),
- '$canedit' => ((local_channel() && local_channel() == $r[0]['obj_channel']) ? true : false),
- '$thing' => $r[0] ));
- }
- else {
- notice( t('item not found.') . EOL);
- return;
- }
- }
-
- $channel = App::get_channel();
-
- if(! (local_channel() && $channel)) {
- notice( t('Permission denied.') . EOL);
- return;
- }
-
- $acl = new Zotlabs\Access\AccessList($channel);
- $channel_acl = $acl->get();
-
- $lockstate = (($acl->is_private()) ? 'lock' : 'unlock');
-
- $thing_hash = '';
-
- if(argc() == 3 && argv(1) === 'edit') {
- $thing_hash = argv(2);
-
- $r = q("select * from obj where obj_type = %d and obj_obj = '%s' limit 1",
- intval(TERM_OBJ_THING),
- dbesc($thing_hash)
- );
-
- if((! $r) || ($r[0]['obj_channel'] != local_channel())) {
- notice( t('Permission denied.') . EOL);
- return '';
- }
-
- $o .= replace_macros(get_markup_template('thing_edit.tpl'),array(
- '$thing_hdr' => t('Edit Thing'),
- '$multiprof' => feature_enabled(local_channel(),'multi_profiles'),
- '$profile_lbl' => t('Select a profile'),
- '$profile_select' => contact_profile_assign($r[0]['obj_page']),
- '$verb_lbl' => $channel['channel_name'],
- '$verb_select' => obj_verb_selector($r[0]['obj_verb']),
- '$activity' => array('activity',t('Post an activity'),true,t('Only sends to viewers of the applicable profile')),
- '$thing_hash' => $thing_hash,
- '$thing_lbl' => t('Name of thing e.g. something'),
- '$thething' => $r[0]['obj_term'],
- '$url_lbl' => t('URL of thing (optional)'),
- '$theurl' => $r[0]['obj_url'],
- '$img_lbl' => t('URL for photo of thing (optional)'),
- '$imgurl' => $r[0]['obj_imgurl'],
- '$permissions' => t('Permissions'),
- '$aclselect' => populate_acl($channel_acl,false),
- '$lockstate' => $lockstate,
- '$submit' => t('Submit')
- ));
-
- return $o;
- }
-
- if(argc() == 3 && argv(1) === 'drop') {
- $thing_hash = argv(2);
-
- $r = q("select * from obj where obj_type = %d and obj_obj = '%s' limit 1",
- intval(TERM_OBJ_THING),
- dbesc($thing_hash)
- );
-
- if((! $r) || ($r[0]['obj_channel'] != local_channel())) {
- notice( t('Permission denied.') . EOL);
- return '';
- }
-
- $x = q("delete from obj where obj_obj = '%s' and obj_type = %d and obj_channel = %d",
- dbesc($thing_hash),
- intval(TERM_OBJ_THING),
- intval(local_channel())
- );
-
- $r[0]['obj_deleted'] = 1;
-
- build_sync_packet(0,array('obj' => $r));
-
- return $o;
- }
-
- $o .= replace_macros(get_markup_template('thing_input.tpl'),array(
- '$thing_hdr' => t('Add Thing to your Profile'),
- '$multiprof' => feature_enabled(local_channel(),'multi_profiles'),
- '$profile_lbl' => t('Select a profile'),
- '$profile_select' => contact_profile_assign(''),
- '$verb_lbl' => $channel['channel_name'],
- '$activity' => array('activity',t('Post an activity'),((array_key_exists('activity',$_REQUEST)) ? $_REQUEST['activity'] : true),t('Only sends to viewers of the applicable profile')),
- '$verb_select' => obj_verb_selector(),
- '$thing_lbl' => t('Name of thing e.g. something'),
- '$url_lbl' => t('URL of thing (optional)'),
- '$img_lbl' => t('URL for photo of thing (optional)'),
- '$permissions' => t('Permissions'),
- '$aclselect' => populate_acl($channel_acl,false),
- '$lockstate' => $lockstate,
- '$submit' => t('Submit')
- ));
-
- return $o;
-}
diff --git a/mod/toggle_mobile.php b/mod/toggle_mobile.php
deleted file mode 100644
index 918c4aad6..000000000
--- a/mod/toggle_mobile.php
+++ /dev/null
@@ -1,17 +0,0 @@
-<?php
-
-function toggle_mobile_init(&$a) {
-
- if(isset($_GET['off']))
- $_SESSION['show_mobile'] = false;
- else
- $_SESSION['show_mobile'] = true;
-
- if(isset($_GET['address']))
- $address = $_GET['address'];
- else
- $address = z_root();
-
- goaway($address);
-}
-
diff --git a/mod/toggle_safesearch.php b/mod/toggle_safesearch.php
deleted file mode 100644
index 3c800c4f3..000000000
--- a/mod/toggle_safesearch.php
+++ /dev/null
@@ -1,25 +0,0 @@
-<?php
-
-function toggle_safesearch_init(&$a) {
-
-$observer = get_observer_hash();
-if (! $observer)
- return;
-
-if($observer)
- $safe_mode = get_xconfig($observer,'directory','safe_mode');
-if ($safe_mode == '')
- set_xconfig($observer,'directory','safe_mode', '0');
-elseif($safe_mode == '0')
- set_xconfig($observer,'directory','safe_mode', '1');
-elseif($safe_mode == '1')
- set_xconfig($observer,'directory','safe_mode', '0');
-
-if(isset($_GET['address']))
- $address = $_GET['address'];
-else
- $address = z_root() . '/directory';
-
- goaway($address);
-}
-
diff --git a/mod/uexport.php b/mod/uexport.php
deleted file mode 100644
index 4a16903f8..000000000
--- a/mod/uexport.php
+++ /dev/null
@@ -1,65 +0,0 @@
-<?php
-
-function uexport_init(&$a) {
- if(! local_channel())
- killme();
-
- if(argc() > 1) {
- $channel = App::get_channel();
-
- require_once('include/identity.php');
-
- if(argc() > 1 && intval(argv(1)) > 1900) {
- $year = intval(argv(1));
- }
-
- if(argc() > 2 && intval(argv(2)) > 0 && intval(argv(2)) <= 12) {
- $month = intval(argv(2));
- }
-
- header('content-type: application/octet_stream');
- header('content-disposition: attachment; filename="' . $channel['channel_address'] . (($year) ? '-' . $year : '') . (($month) ? '-' . $month : '') . '.json"' );
-
- if($year) {
- echo json_encode(identity_export_year(local_channel(),$year,$month));
- killme();
- }
-
- if(argc() > 1 && argv(1) === 'basic') {
- echo json_encode(identity_basic_export(local_channel()));
- killme();
- }
-
- // FIXME - this basically doesn't work in the wild with a channel more than a few months old due to memory and execution time limits.
- // It probably needs to be built at the CLI and offered to download as a tarball. Maybe stored in the members dav.
-
- if(argc() > 1 && argv(1) === 'complete') {
- echo json_encode(identity_basic_export(local_channel(),true));
- killme();
- }
- }
-}
-
-function uexport_content(&$a) {
-
- $y = datetime_convert('UTC',date_default_timezone_get(),'now','Y');
-
- $yearurl = z_root() . '/uexport/' . $y;
- $janurl = z_root() . '/uexport/' . $y . '/1';
- $impurl = '/import_items';
- $o = replace_macros(get_markup_template('uexport.tpl'), array(
- '$title' => t('Export Channel'),
- '$basictitle' => t('Export Channel'),
- '$basic' => t('Export your basic channel information to a file. This acts as a backup of your connections, permissions, profile and basic data, which can be used to import your data to a new server hub, but does not contain your content.'),
- '$fulltitle' => t('Export Content'),
- '$full' => t('Export your channel information and recent content to a JSON backup that can be restored or imported to another server hub. This backs up all of your connections, permissions, profile data and several months of posts. This file may be VERY large. Please be patient - it may take several minutes for this download to begin.'),
- '$by_year' => t('Export your posts from a given year.'),
-
- '$extra' => t('You may also export your posts and conversations for a particular year or month. Adjust the date in your browser location bar to select other dates. If the export fails (possibly due to memory exhaustion on your server hub), please try again selecting a more limited date range.'),
- '$extra2' => sprintf( t('To select all posts for a given year, such as this year, visit <a href="%1$s">%2$s</a>'),$yearurl,$yearurl),
- '$extra3' => sprintf( t('To select all posts for a given month, such as January of this year, visit <a href="%1$s">%2$s</a>'),$janurl,$janurl),
- '$extra4' => sprintf( t('These content files may be imported or restored by visiting <a href="%1$s">%2$s</a> on any site containing your channel. For best results please import or restore these in date order (oldest first).'),$impurl,$impurl)
-
- ));
-return $o;
-}
diff --git a/mod/update_display.php b/mod/update_display.php
deleted file mode 100644
index 52903bb8c..000000000
--- a/mod/update_display.php
+++ /dev/null
@@ -1,42 +0,0 @@
-<?php
-
-// See update_profile.php for documentation
-
-require_once('mod/display.php');
-require_once('include/group.php');
-
-function update_display_content(&$a) {
-
- $profile_uid = intval($_GET['p']);
- if(! $profile_uid)
- $profile_uid = (-1);
- $load = (((argc() > 1) && (argv(1) == 'load')) ? 1 : 0);
- header("Content-type: text/html");
- echo "<!DOCTYPE html><html><body>\r\n";
- echo (($_GET['msie'] == 1) ? '<div>' : '<section>');
-
-
- $text = display_content($a,$profile_uid, $load);
- $pattern = "/<img([^>]*) src=\"([^\"]*)\"/";
- $replace = "<img\${1} dst=\"\${2}\"";
-// $text = preg_replace($pattern, $replace, $text);
-/*
- if(! $load) {
- $replace = '<br />' . t('[Embedded content - reload page to view]') . '<br />';
- $pattern = "/<\s*audio[^>]*>(.*?)<\s*\/\s*audio>/i";
- $text = preg_replace($pattern, $replace, $text);
- $pattern = "/<\s*video[^>]*>(.*?)<\s*\/\s*video>/i";
- $text = preg_replace($pattern, $replace, $text);
- $pattern = "/<\s*embed[^>]*>(.*?)<\s*\/\s*embed>/i";
- $text = preg_replace($pattern, $replace, $text);
- $pattern = "/<\s*iframe[^>]*>(.*?)<\s*\/\s*iframe>/i";
- $text = preg_replace($pattern, $replace, $text);
- }
-*/
- echo str_replace("\t",' ',$text);
- echo (($_GET['msie'] == 1) ? '</div>' : '</section>');
- echo "</body></html>\r\n";
-// logger('update_display: ' . $text);
- killme();
-
-}
diff --git a/mod/update_home.php b/mod/update_home.php
deleted file mode 100644
index 4a8000bdb..000000000
--- a/mod/update_home.php
+++ /dev/null
@@ -1,38 +0,0 @@
-<?php
-
-// See update_profile.php for documentation
-
-require_once('mod/home.php');
-
-function update_home_content(&$a) {
-
- $profile_uid = ((intval($_GET['p'])) ? intval($_GET['p']) : (-1));
- $load = (((argc() > 1) && (argv(1) == 'load')) ? 1 : 0);
- header("Content-type: text/html");
- echo "<!DOCTYPE html><html><body>\r\n";
- echo ((array_key_exists('msie',$_GET) && $_GET['msie'] == 1) ? '<div>' : '<section>');
-
- $text = home_content($a,$profile_uid, $load);
- $pattern = "/<img([^>]*) src=\"([^\"]*)\"/";
- $replace = "<img\${1} dst=\"\${2}\"";
-// $text = preg_replace($pattern, $replace, $text);
-/*
- if(! $load) {
- $replace = '<br />' . t('[Embedded content - reload page to view]') . '<br />';
- $pattern = "/<\s*audio[^>]*>(.*?)<\s*\/\s*audio>/i";
- $text = preg_replace($pattern, $replace, $text);
- $pattern = "/<\s*video[^>]*>(.*?)<\s*\/\s*video>/i";
- $text = preg_replace($pattern, $replace, $text);
- $pattern = "/<\s*embed[^>]*>(.*?)<\s*\/\s*embed>/i";
- $text = preg_replace($pattern, $replace, $text);
- $pattern = "/<\s*iframe[^>]*>(.*?)<\s*\/\s*iframe>/i";
- $text = preg_replace($pattern, $replace, $text);
- }
-*/
- echo str_replace("\t",' ',$text);
- echo ((array_key_exists('msie',$_GET) && $_GET['msie'] == 1) ? '</div>' : '</section>');
- echo "</body></html>\r\n";
-// logger('update_home: ' . $text);
- killme();
-
-} \ No newline at end of file
diff --git a/mod/update_network.php b/mod/update_network.php
deleted file mode 100644
index 03c12312c..000000000
--- a/mod/update_network.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-
-// See update_profile.php for documentation
-
-require_once('mod/network.php');
-require_once('include/group.php');
-
-function update_network_content(&$a) {
-
- $profile_uid = intval($_GET['p']);
- $load = (((argc() > 1) && (argv(1) == 'load')) ? 1 : 0);
- header("Content-type: text/html");
- echo "<!DOCTYPE html><html><body>\r\n";
- echo ((array_key_exists('msie',$_GET) && $_GET['msie'] == 1) ? '<div>' : '<section>');
-
-
- $text = network_content($a,$profile_uid, $load);
- $pattern = "/<img([^>]*) src=\"([^\"]*)\"/";
- $replace = "<img\${1} dst=\"\${2}\"";
-// $text = preg_replace($pattern, $replace, $text);
-/*
- if(! $load) {
- $replace = '<br />' . t('[Embedded content - reload page to view]') . '<br />';
- $pattern = "/<\s*audio[^>]*>(.*?)<\s*\/\s*audio>/i";
- $text = preg_replace($pattern, $replace, $text);
- $pattern = "/<\s*video[^>]*>(.*?)<\s*\/\s*video>/i";
- $text = preg_replace($pattern, $replace, $text);
- $pattern = "/<\s*embed[^>]*>(.*?)<\s*\/\s*embed>/i";
- $text = preg_replace($pattern, $replace, $text);
- $pattern = "/<\s*iframe[^>]*>(.*?)<\s*\/\s*iframe>/i";
- $text = preg_replace($pattern, $replace, $text);
- }
-*/
- echo str_replace("\t",' ',$text);
- echo ((array_key_exists('msie',$_GET) && $_GET['msie'] == 1) ? '</div>' : '</section>');
- echo "</body></html>\r\n";
-// logger('update_network: ' . $text);
- killme();
-
-} \ No newline at end of file
diff --git a/mod/update_public.php b/mod/update_public.php
deleted file mode 100644
index fcec792f6..000000000
--- a/mod/update_public.php
+++ /dev/null
@@ -1,37 +0,0 @@
-<?php
-
-// See update_profile.php for documentation
-
-require_once('mod/public.php');
-
-function update_public_content(&$a) {
-
- $profile_uid = ((intval($_GET['p'])) ? intval($_GET['p']) : (-1));
- $load = (((argc() > 1) && (argv(1) == 'load')) ? 1 : 0);
- header("Content-type: text/html");
- echo "<!DOCTYPE html><html><body>\r\n";
- echo ((array_key_exists('msie',$_GET) && $_GET['msie'] == 1) ? '<div>' : '<section>');
-
- $text = public_content($a,$profile_uid, $load);
- $pattern = "/<img([^>]*) src=\"([^\"]*)\"/";
- $replace = "<img\${1} dst=\"\${2}\"";
-// $text = preg_replace($pattern, $replace, $text);
-/*
- if(! $load) {
- $replace = '<br />' . t('[Embedded content - reload page to view]') . '<br />';
- $pattern = "/<\s*audio[^>]*>(.*?)<\s*\/\s*audio>/i";
- $text = preg_replace($pattern, $replace, $text);
- $pattern = "/<\s*video[^>]*>(.*?)<\s*\/\s*video>/i";
- $text = preg_replace($pattern, $replace, $text);
- $pattern = "/<\s*embed[^>]*>(.*?)<\s*\/\s*embed>/i";
- $text = preg_replace($pattern, $replace, $text);
- $pattern = "/<\s*iframe[^>]*>(.*?)<\s*\/\s*iframe>/i";
- $text = preg_replace($pattern, $replace, $text);
- }
-*/
- echo str_replace("\t",' ',$text);
- echo ((array_key_exists('msie',$_GET) && $_GET['msie'] == 1) ? '</div>' : '</section>');
- echo "</body></html>\r\n";
- killme();
-
-} \ No newline at end of file
diff --git a/mod/update_search.php b/mod/update_search.php
deleted file mode 100644
index 25bcffcb6..000000000
--- a/mod/update_search.php
+++ /dev/null
@@ -1,66 +0,0 @@
-<?php
-
-/**
- * Module: update_profile
- * Purpose: AJAX synchronisation of search page
- *
- */
-
-
-require_once('mod/search.php');
-
-function update_search_content(&$a) {
-
- $profile_uid = intval($_GET['p']);
- if(! $profile_uid)
- $profile_uid = (-1);
-
- $load = (((argc() > 1) && (argv(1) == 'load')) ? 1 : 0);
-
- header("Content-type: text/html");
- echo "<!DOCTYPE html><html><body>\r\n";
-
- /**
- * We can remove this hack once Internet Explorer recognises HTML5 natively
- */
-
- echo (($_GET['msie'] == 1) ? '<div>' : '<section>');
-
- /**
- *
- * Grab the page inner contents by calling the content function from the profile module directly,
- * but move any image src attributes to another attribute name. This is because
- * some browsers will prefetch all the images for the page even if we don't need them.
- * The only ones we need to fetch are those for new page additions, which we'll discover
- * on the client side and then swap the image back.
- *
- */
-
- $text = search_content($a,$profile_uid,$load);
-
- $pattern = "/<img([^>]*) src=\"([^\"]*)\"/";
- $replace = "<img\${1} dst=\"\${2}\"";
-// $text = preg_replace($pattern, $replace, $text);
-/*
- if(! $load) {
- $replace = '<br />' . t('[Embedded content - reload page to view]') . '<br />';
- $pattern = "/<\s*audio[^>]*>(.*?)<\s*\/\s*audio>/i";
- $text = preg_replace($pattern, $replace, $text);
- $pattern = "/<\s*video[^>]*>(.*?)<\s*\/\s*video>/i";
- $text = preg_replace($pattern, $replace, $text);
- $pattern = "/<\s*embed[^>]*>(.*?)<\s*\/\s*embed>/i";
- $text = preg_replace($pattern, $replace, $text);
- $pattern = "/<\s*iframe[^>]*>(.*?)<\s*\/\s*iframe>/i";
- $text = preg_replace($pattern, $replace, $text);
- }
-*/
- /**
- * reportedly some versions of MSIE don't handle tabs in XMLHttpRequest documents very well
- */
-
- echo str_replace("\t",' ',$text);
- echo (($_GET['msie'] == 1) ? '</div>' : '</section>');
- echo "</body></html>\r\n";
- killme();
-
-} \ No newline at end of file
diff --git a/mod/view.php b/mod/view.php
deleted file mode 100644
index f18646cb9..000000000
--- a/mod/view.php
+++ /dev/null
@@ -1,15 +0,0 @@
-<?php
-/**
- * load view/theme/$current_theme/style.php with Hubzilla context
- */
-
-function view_init($a){
-
- header("Content-Type: text/css");
-
- $theme = argv(2);
- $THEMEPATH = "view/theme/$theme";
- if(file_exists("view/theme/$theme/php/style.php"))
- require_once("view/theme/$theme/php/style.php");
- killme();
-}
diff --git a/mod/viewconnections.php b/mod/viewconnections.php
deleted file mode 100644
index 6e0daab6e..000000000
--- a/mod/viewconnections.php
+++ /dev/null
@@ -1,111 +0,0 @@
-<?php
-require_once('include/contact_selectors.php');
-require_once('include/Contact.php');
-
-function viewconnections_init(&$a) {
-
- if((get_config('system','block_public')) && (! local_channel()) && (! remote_channel())) {
- return;
- }
- if(argc() > 1)
- profile_load($a,argv(1));
-}
-
-function viewconnections_content(&$a) {
-
- if((get_config('system','block_public')) && (! local_channel()) && (! remote_channel())) {
- notice( t('Public access denied.') . EOL);
- return;
- }
-
- if(((! count(App::$profile)) || (App::$profile['hide_friends']))) {
- notice( t('Permission denied.') . EOL);
- return;
- }
-
- if(! perm_is_allowed(App::$profile['uid'], get_observer_hash(),'view_contacts')) {
- notice( t('Permission denied.') . EOL);
- return;
- }
-
- if(! $_REQUEST['aj'])
- $_SESSION['return_url'] = App::$query_string;
-
-
- $is_owner = ((local_channel() && local_channel() == App::$profile['uid']) ? true : false);
-
- $abook_flags = " and abook_pending = 0 and abook_self = 0 ";
- $sql_extra = '';
-
- if(! $is_owner) {
- $abook_flags = " and abook_hidden = 0 ";
- $sql_extra = " and xchan_hidden = 0 ";
- }
-
- $r = q("SELECT count(*) as total FROM abook left join xchan on abook_xchan = xchan_hash where abook_channel = %d $abook_flags and xchan_orphan = 0 and xchan_deleted = 0 $sql_extra ",
- intval(App::$profile['uid'])
- );
- if($r) {
- App::set_pager_total($r[0]['total']);
- }
-
- $r = q("SELECT * FROM abook left join xchan on abook_xchan = xchan_hash where abook_channel = %d $abook_flags and xchan_orphan = 0 and xchan_deleted = 0 $sql_extra order by xchan_name LIMIT %d OFFSET %d ",
- intval(App::$profile['uid']),
- intval(App::$pager['itemspage']),
- intval(App::$pager['start'])
- );
-
- if((! $r) && (! $_REQUEST['aj'])) {
- info( t('No connections.') . EOL );
- return $o;
- }
-
- $contacts = array();
-
- foreach($r as $rr) {
-
- $url = chanlink_url($rr['xchan_url']);
- if($url) {
- $contacts[] = array(
- 'id' => $rr['abook_id'],
- 'archived' => (intval($rr['abook_archived']) ? true : false),
- 'img_hover' => sprintf( t('Visit %s\'s profile [%s]'), $rr['xchan_name'], $rr['xchan_url']),
- 'thumb' => $rr['xchan_photo_m'],
- 'name' => substr($rr['xchan_name'],0,20),
- 'username' => $rr['xchan_addr'],
- 'link' => $url,
- 'sparkle' => '',
- 'itemurl' => $rr['url'],
- 'network' => '',
- );
- }
- }
-
-
- if($_REQUEST['aj']) {
- if($contacts) {
- $o = replace_macros(get_markup_template('viewcontactsajax.tpl'),array(
- '$contacts' => $contacts
- ));
- }
- else {
- $o = '<div id="content-complete"></div>';
- }
- echo $o;
- killme();
- }
- else {
- $o .= "<script> var page_query = '" . $_GET['q'] . "'; var extra_args = '" . extra_query_args() . "' ; </script>";
- $tpl = get_markup_template("viewcontact_template.tpl");
- $o .= replace_macros($tpl, array(
- '$title' => t('View Connections'),
- '$contacts' => $contacts,
-// '$paginate' => paginate($a),
- ));
- }
-
- if(! $contacts)
- $o .= '<div id="content-complete"></div>';
-
- return $o;
-}
diff --git a/mod/viewsrc.php b/mod/viewsrc.php
deleted file mode 100644
index a4efd1214..000000000
--- a/mod/viewsrc.php
+++ /dev/null
@@ -1,47 +0,0 @@
-<?php
-
-
-function viewsrc_content(&$a) {
-
- $o = '';
-
- $sys = get_sys_channel();
-
- $item_id = ((argc() > 1) ? intval(argv(1)) : 0);
- $json = ((argc() > 2 && argv(2) === 'json') ? true : false);
-
- if(! local_channel()) {
- notice( t('Permission denied.') . EOL);
- }
-
-
- if(! $item_id) {
- App::$error = 404;
- notice( t('Item not found.') . EOL);
- }
-
- $item_normal = item_normal();
-
- if(local_channel() && $item_id) {
- $r = q("select id, item_flags, item_obscured, body from item where uid in (%d , %d) and id = %d $item_normal limit 1",
- intval(local_channel()),
- intval($sys['channel_id']),
- intval($item_id)
- );
-
- if($r) {
- if(intval($r[0]['item_obscured']))
- $r[0]['body'] = crypto_unencapsulate(json_decode($r[0]['body'],true),get_config('system','prvkey'));
- $o = (($json) ? json_encode($r[0]['body']) : str_replace("\n",'<br />',$r[0]['body']));
- }
- }
-
- if(is_ajax()) {
- print '<div><i class="icon-pencil"> ' . t('Source of Item') . ' ' . $r[0]['id'] . '</i></div>';
- echo $o;
- killme();
- }
-
- return $o;
-}
-
diff --git a/mod/wall_attach.php b/mod/wall_attach.php
deleted file mode 100644
index 7f054705f..000000000
--- a/mod/wall_attach.php
+++ /dev/null
@@ -1,49 +0,0 @@
-<?php
-
-require_once('include/attach.php');
-require_once('include/identity.php');
-require_once('include/photos.php');
-
-function wall_attach_post(&$a) {
-
- $using_api = false;
-
- if(App::$data['api_info'] && array_key_exists('media',$_FILES)) {
- $using_api = true;
- $user_info = App::$data['api_info'];
- $nick = $user_info['screen_name'];
- $channel = get_channel_by_nick($user_info['screen_name']);
- }
- elseif(argc() > 1)
- $channel = get_channel_by_nick(argv(1));
-
- if(! $channel)
- killme();
-
- $observer = App::get_observer();
-
-
- $def_album = get_pconfig($channel['channel_id'],'system','photo_path');
- $def_attach = get_pconfig($channel['channel_id'],'system','attach_path');
-
- $r = attach_store($channel,(($observer) ? $observer['xchan_hash'] : ''),'', array('source' => 'editor', 'visible' => 0, 'album' => $def_album, 'directory' => $def_attach, 'allow_cid' => '<' . $channel['channel_hash'] . '>'));
-
- if(! $r['success']) {
- notice( $r['message'] . EOL);
- killme();
- }
-
- if(intval($r['data']['is_photo'])) {
- $s = "\n\n" . $r['body'] . "\n\n";
- }
- else {
- $s = "\n\n" . '[attachment]' . $r['data']['hash'] . ',' . $r['data']['revision'] . '[/attachment]' . "\n";
- }
-
- if($using_api)
- return $s;
-
- echo $s;
- killme();
-
-}
diff --git a/mod/wall_upload.php b/mod/wall_upload.php
deleted file mode 100644
index 54e2f8526..000000000
--- a/mod/wall_upload.php
+++ /dev/null
@@ -1,51 +0,0 @@
-<?php
-
-require_once('include/photo/photo_driver.php');
-require_once('include/identity.php');
-require_once('include/photos.php');
-
-
-
-function wall_upload_post(&$a) {
-
-
- $using_api = ((x($_FILES,'media')) ? true : false);
-
- if($using_api) {
- require_once('include/api.php');
- $user_info = api_get_user($a);
- $nick = $user_info['screen_name'];
- }
- else {
- if(argc() > 1)
- $nick = argv(1);
- }
-
- $channel = (($nick) ? get_channel_by_nick($nick) : false);
-
- if(! $channel) {
- if($using_api)
- return;
- notice( t('Channel not found.') . EOL);
- killme();
- }
-
- $observer = App::get_observer();
-
- $args = array( 'source' => 'editor', 'visible' => 0, 'contact_allow' => array($channel['channel_hash']));
-
- $ret = photo_upload($channel,$observer,$args);
-
- if(! $ret['success']) {
- if($using_api)
- return;
- notice($ret['message']);
- killme();
- }
-
- if($using_api)
- return("\n\n" . $ret['body'] . "\n\n");
- else
- echo "\n\n" . $ret['body'] . "\n\n";
- killme();
-}
diff --git a/mod/webfinger.php b/mod/webfinger.php
deleted file mode 100644
index e35767338..000000000
--- a/mod/webfinger.php
+++ /dev/null
@@ -1,48 +0,0 @@
-<?php
-
-
-
-function webfinger_content(&$a) {
-
-
- $o .= '<h3>Webfinger Diagnostic</h3>';
-
- $o .= '<form action="webfinger" method="get">';
- $o .= 'Lookup address: <input type="text" style="width: 250px;" name="addr" value="' . $_GET['addr'] .'" />';
- $o .= '<input type="submit" name="submit" value="Submit" /></form>';
-
- $o .= '<br /><br />';
-
- $old = false;
- if(x($_GET,'addr')) {
- $addr = trim($_GET['addr']);
-// if(strpos($addr,'@') !== false) {
- $res = webfinger_rfc7033($addr,true);
- if(! $res) {
- $res = old_webfinger($addr);
- $old = true;
- }
-// }
-// else {
-// if(function_exists('lrdd'))
-// $res = lrdd($addr);
-// }
-
- if($res && $old) {
- foreach($res as $r) {
- if($r['@attributes']['rel'] === 'http://microformats.org/profile/hcard') {
- $hcard = unamp($r['@attributes']['href']);
- require_once('library/HTML5/Parser.php');
- $res['vcard'] = scrape_vcard($hcard);
- break;
- }
- }
- }
-
-
- $o .= '<pre>';
- $o .= str_replace("\n",'<br />',print_r($res,true));
- $o .= '</pre>';
- }
- return $o;
-}
diff --git a/mod/webpages.php b/mod/webpages.php
deleted file mode 100644
index c20a147da..000000000
--- a/mod/webpages.php
+++ /dev/null
@@ -1,201 +0,0 @@
-<?php
-
-require_once('include/identity.php');
-require_once('include/conversation.php');
-require_once('include/acl_selectors.php');
-
-function webpages_init(&$a) {
-
- if(argc() > 1 && argv(1) === 'sys' && is_site_admin()) {
- $sys = get_sys_channel();
- if($sys && intval($sys['channel_id'])) {
- App::$is_sys = true;
- }
- }
-
- if(argc() > 1)
- $which = argv(1);
- else
- return;
-
- profile_load($a,$which);
-
-}
-
-
-function webpages_content(&$a) {
-
- if(! App::$profile) {
- notice( t('Requested profile is not available.') . EOL );
- App::$error = 404;
- return;
- }
-
- $which = argv(1);
-
- $_SESSION['return_url'] = App::$query_string;
-
- $uid = local_channel();
- $owner = 0;
- $channel = null;
- $observer = App::get_observer();
-
- $channel = App::get_channel();
-
- if(App::$is_sys && is_site_admin()) {
- $sys = get_sys_channel();
- if($sys && intval($sys['channel_id'])) {
- $uid = $owner = intval($sys['channel_id']);
- $channel = $sys;
- $observer = $sys;
- }
- }
-
- if(! $owner) {
- // Figure out who the page owner is.
- $r = q("select channel_id from channel where channel_address = '%s'",
- dbesc($which)
- );
- if($r) {
- $owner = intval($r[0]['channel_id']);
- }
- }
-
- $ob_hash = (($observer) ? $observer['xchan_hash'] : '');
-
- $perms = get_all_perms($owner,$ob_hash);
-
- if(! $perms['write_pages']) {
- notice( t('Permission denied.') . EOL);
- return;
- }
-
- $mimetype = (($_REQUEST['mimetype']) ? $_REQUEST['mimetype'] : get_pconfig($owner,'system','page_mimetype'));
-
- if(! $mimetype) {
- $mimetype = 'choose';
- }
-
- $layout = (($_REQUEST['layout']) ? $_REQUEST['layout'] : get_pconfig($owner,'system','page_layout'));
- if(! $layout)
- $layout = 'choose';
-
- // Create a status editor (for now - we'll need a WYSIWYG eventually) to create pages
- // Nickname is set to the observers xchan, and profile_uid to the owner's.
- // This lets you post pages at other people's channels.
-
- if((! $channel) && ($uid) && ($uid == App::$profile_uid)) {
- $channel = App::get_channel();
- }
- if($channel) {
- $channel_acl = array(
- 'allow_cid' => $channel['channel_allow_cid'],
- 'allow_gid' => $channel['channel_allow_gid'],
- 'deny_cid' => $channel['channel_deny_cid'],
- 'deny_gid' => $channel['channel_deny_gid']
- );
- }
- else
- $channel_acl = array();
-
- $is_owner = ($uid && $uid == $owner);
- $o = profile_tabs($a, $is_owner, App::$profile['channel_address']);
-
- $x = array(
- 'webpage' => ITEM_TYPE_WEBPAGE,
- 'is_owner' => true,
- 'nickname' => App::$profile['channel_address'],
- 'lockstate' => (($channel['channel_allow_cid'] || $channel['channel_allow_gid'] || $channel['channel_deny_cid'] || $channel['channel_deny_gid']) ? 'lock' : 'unlock'),
- 'bang' => '',
- 'acl' => (($is_owner) ? populate_acl($channel_acl,false) : ''),
- 'showacl' => (($is_owner) ? true : false),
- 'visitor' => true,
- 'profile_uid' => intval($owner),
- 'mimetype' => $mimetype,
- 'layout' => $layout,
- 'expanded' => true,
- 'novoting'=> true,
- 'bbco_autocomplete' => 'bbcode',
- 'bbcode' => true
- );
-
- if($_REQUEST['title'])
- $x['title'] = $_REQUEST['title'];
- if($_REQUEST['body'])
- $x['body'] = $_REQUEST['body'];
- if($_REQUEST['pagetitle'])
- $x['pagetitle'] = $_REQUEST['pagetitle'];
-
- $editor = status_editor($a,$x);
-
- // Get a list of webpages. We can't display all them because endless scroll makes that unusable,
- // so just list titles and an edit link.
-
-
- /** @TODO - this should be replaced with pagelist_widget */
-
- $sql_extra = item_permissions_sql($owner);
-
- $r = q("select * from item_id left join item on item_id.iid = item.id
- where item_id.uid = %d and service = 'WEBPAGE' and item_type = %d $sql_extra order by item.created desc",
- intval($owner),
- intval(ITEM_TYPE_WEBPAGE)
- );
-
- $pages = null;
-
- if($r) {
- $pages = array();
- foreach($r as $rr) {
- unobscure($rr);
-
- $lockstate = (($rr['allow_cid'] || $rr['allow_gid'] || $rr['deny_cid'] || $rr['deny_gid']) ? 'lock' : 'unlock');
-
- $element_arr = array(
- 'type' => 'webpage',
- 'title' => $rr['title'],
- 'body' => $rr['body'],
- 'created' => $rr['created'],
- 'edited' => $rr['edited'],
- 'mimetype' => $rr['mimetype'],
- 'pagetitle' => $rr['sid'],
- 'mid' => $rr['mid'],
- 'layout_mid' => $rr['layout_mid']
- );
- $pages[$rr['iid']][] = array(
- 'url' => $rr['iid'],
- 'pagetitle' => $rr['sid'],
- 'title' => $rr['title'],
- 'created' => datetime_convert('UTC',date_default_timezone_get(),$rr['created']),
- 'edited' => datetime_convert('UTC',date_default_timezone_get(),$rr['edited']),
- 'bb_element' => '[element]' . base64url_encode(json_encode($element_arr)) . '[/element]',
- 'lockstate' => $lockstate
- );
- }
- }
-
-
- //Build the base URL for edit links
- $url = z_root() . '/editwebpage/' . $which;
-
- $o .= replace_macros(get_markup_template('webpagelist.tpl'), array(
- '$listtitle' => t('Webpages'),
- '$baseurl' => $url,
- '$create' => t('Create'),
- '$edit' => t('Edit'),
- '$share' => t('Share'),
- '$delete' => t('Delete'),
- '$pages' => $pages,
- '$channel' => $which,
- '$editor' => $editor,
- '$view' => t('View'),
- '$preview' => t('Preview'),
- '$actions_txt' => t('Actions'),
- '$pagelink_txt' => t('Page Link'),
- '$title_txt' => t('Page Title'),
- '$created_txt' => t('Created'),
- '$edited_txt' => t('Edited')
- ));
-
- return $o;
-}
diff --git a/mod/wfinger.php b/mod/wfinger.php
deleted file mode 100644
index 445dbb349..000000000
--- a/mod/wfinger.php
+++ /dev/null
@@ -1,134 +0,0 @@
-<?php
-
-require_once('include/zot.php');
-
-function wfinger_init(&$a) {
-
- $result = array();
-
- $scheme = '';
-
- if(x($_SERVER,'HTTPS') && $_SERVER['HTTPS'])
- $scheme = 'https';
- elseif(x($_SERVER,'SERVER_PORT') && (intval($_SERVER['SERVER_PORT']) == 443))
- $scheme = 'https';
-
- $zot = intval($_REQUEST['zot']);
-
- if(($scheme !== 'https') && (! $zot)) {
- header($_SERVER["SERVER_PROTOCOL"] . ' ' . 500 . ' ' . 'Webfinger requires HTTPS');
- killme();
- }
-
-
- $resource = $_REQUEST['resource'];
- logger('webfinger: ' . $resource,LOGGER_DEBUG);
-
- $r = null;
-
- if($resource) {
-
- if(strpos($resource,'acct:') === 0) {
- $channel = str_replace('acct:','',$resource);
- if(strpos($channel,'@') !== false) {
- $host = substr($channel,strpos($channel,'@')+1);
- if(strcasecmp($host,App::get_hostname())) {
- goaway('https://' . $host . '/.well-known/webfinger?f=&resource=' . $resource . (($zot) ? '&zot=' . $zot : ''));
- }
- $channel = substr($channel,0,strpos($channel,'@'));
- }
- }
- if(strpos($resource,'http') === 0) {
- $channel = str_replace('~','',basename($resource));
- }
-
- $r = q("select * from channel left join xchan on channel_hash = xchan_hash
- where channel_address = '%s' limit 1",
- dbesc($channel)
- );
-
- }
-
- header('Access-Control-Allow-Origin: *');
-
-
- if($resource && $r) {
-
- $h = q("select hubloc_addr from hubloc where hubloc_hash = '%s' and hubloc_deleted = 0",
- dbesc($r[0]['channel_hash'])
- );
-
- $result['subject'] = $resource;
-
- $aliases = array(
- z_root() . '/channel/' . $r[0]['channel_address'],
- z_root() . '/~' . $r[0]['channel_address']
- );
-
- if($h) {
- foreach($h as $hh) {
- $aliases[] = 'acct:' . $hh['hubloc_addr'];
- }
- }
-
- $result['aliases'] = array();
-
- $result['properties'] = array(
- 'http://webfinger.net/ns/name' => $r[0]['channel_name'],
- 'http://xmlns.com/foaf/0.1/name' => $r[0]['channel_name']
- );
-
- foreach($aliases as $alias)
- if($alias != $resource)
- $result['aliases'][] = $alias;
-
- $result['links'] = array(
-
- array(
- 'rel' => 'http://webfinger.net/rel/avatar',
- 'type' => $r[0]['xchan_photo_mimetype'],
- 'href' => $r[0]['xchan_photo_l']
- ),
-
- array(
- 'rel' => 'http://webfinger.net/rel/profile-page',
- 'href' => z_root() . '/profile/' . $r[0]['channel_address'],
- ),
-
- array(
- 'rel' => 'http://webfinger.net/rel/blog',
- 'href' => z_root() . '/channel/' . $r[0]['channel_address'],
- ),
-
- array(
- 'rel' => 'http://ostatus.org/schema/1.0/subscribe',
- 'template' => z_root() . '/follow/url={uri}',
- ),
-
- array(
- 'rel' => 'http://purl.org/zot/protocol',
- 'href' => z_root() . '/.well-known/zot-info' . '?address=' . $r[0]['xchan_addr'],
- ),
-
- array(
- 'rel' => 'magic-public-key',
- 'href' => 'data:application/magic-public-key,' . salmon_key($r[0]['channel_pubkey']),
- )
- );
-
- if($zot) {
- // get a zotinfo packet and return it with webfinger
- $result['zot'] = zotinfo(array('address' => $r[0]['xchan_addr']));
- }
- }
- else {
- header($_SERVER["SERVER_PROTOCOL"] . ' ' . 400 . ' ' . 'Bad Request');
- killme();
- }
-
- $arr = array('channel' => $r[0], 'request' => $_REQUEST, 'result' => $result);
- call_hooks('webfinger',$arr);
-
- json_return_and_die($arr['result'],'application/jrd+json');
-
-}
diff --git a/mod/xchan.php b/mod/xchan.php
deleted file mode 100644
index 69fbdb77d..000000000
--- a/mod/xchan.php
+++ /dev/null
@@ -1,41 +0,0 @@
-<?php
-
-
-function xchan_content(&$a) {
-
- $o = '<h3>' . t('Xchan Lookup') . '</h3>';
-
- $o .= '<form action="xchan" method="get">';
- $o .= t('Lookup xchan beginning with (or webbie): ');
- $o .= '<input type="text" style="width:250px;" name="addr" value="' . $_GET['addr'] .'">';
- $o .= '<input type="submit" name="submit" value="' . t('Submit') .'"></form>';
- $o .= '<br><br>';
-
- if(x($_GET, 'addr')) {
- $addr = trim($_GET['addr']);
-
- $r = q("select * from xchan where xchan_hash like '%s%%' or xchan_addr = '%s' group by xchan_hash",
- dbesc($addr),
- dbesc($addr)
- );
-
- if($r) {
- foreach($r as $rr) {
- $o .= str_replace(array("\n", " "), array("<br>", "&nbsp;"), print_r($rr, true)) . EOL;
-
- $s = q("select * from hubloc where hubloc_hash like '%s'",
- dbesc($r[0]['xchan_hash'])
- );
-
- if($s) {
- foreach($s as $rrr)
- $o .= str_replace(array("\n", " "), array("<br>", "&nbsp;"), print_r($rrr, true)) . EOL;
- }
- }
- }
- else
- notice( t('Not found.') . EOL);
-
- }
- return $o;
-}
diff --git a/mod/xpoco.php b/mod/xpoco.php
deleted file mode 100644
index 560966750..000000000
--- a/mod/xpoco.php
+++ /dev/null
@@ -1,7 +0,0 @@
-<?php
-
-require_once('include/socgraph.php');
-
-function xpoco_init(&$a) {
- poco($a,true);
-}
diff --git a/mod/xrd.php b/mod/xrd.php
deleted file mode 100644
index 463cda662..000000000
--- a/mod/xrd.php
+++ /dev/null
@@ -1,75 +0,0 @@
-<?php
-
-require_once('include/crypto.php');
-
-function xrd_init(&$a) {
-
- $uri = urldecode(notags(trim($_GET['uri'])));
- logger('xrd: ' . $uri,LOGGER_DEBUG);
-
- $resource = $uri;
-
- if(substr($uri,0,4) === 'http') {
- $uri = str_replace('~','',$uri);
- $name = basename($uri);
- }
- else {
- $local = str_replace('acct:', '', $uri);
- if(substr($local,0,2) == '//')
- $local = substr($local,2);
-
- $name = substr($local,0,strpos($local,'@'));
- }
-
- $r = q("SELECT * FROM channel WHERE channel_address = '%s' LIMIT 1",
- dbesc($name)
- );
- if(! $r)
- killme();
-
- $dspr = replace_macros(get_markup_template('xrd_diaspora.tpl'),array(
- '$baseurl' => z_root(),
- '$dspr_guid' => $r[0]['channel_guid'] . str_replace('.','',App::get_hostname()),
- '$dspr_key' => base64_encode(pemtorsa($r[0]['channel_pubkey']))
- ));
-
- $salmon_key = salmon_key($r[0]['channel_pubkey']);
-
- header('Access-Control-Allow-Origin: *');
- header("Content-type: application/xrd+xml");
-
-
- $aliases = array('acct:' . $r[0]['channel_address'] . '@' . App::get_hostname(), z_root() . '/channel/' . $r[0]['channel_address'], z_root() . '/~' . $r[0]['channel_address']);
-
- for($x = 0; $x < count($aliases); $x ++) {
- if($aliases[$x] === $resource)
- unset($aliases[$x]);
- }
-
-
- $o = replace_macros(get_markup_template('xrd_person.tpl'), array(
- '$nick' => $r[0]['channel_address'],
- '$accturi' => $resource,
- '$aliases' => $aliases,
- '$profile_url' => z_root() . '/channel/' . $r[0]['channel_address'],
- '$hcard_url' => z_root() . '/hcard/' . $r[0]['channel_address'],
- '$atom' => z_root() . '/feed/' . $r[0]['channel_address'],
- '$zot_post' => z_root() . '/post/' . $r[0]['channel_address'],
- '$poco_url' => z_root() . '/poco/' . $r[0]['channel_address'],
- '$photo' => z_root() . '/photo/profile/l/' . $r[0]['channel_id'],
- '$dspr' => $dspr,
-// '$salmon' => z_root() . '/salmon/' . $r[0]['channel_address'],
-// '$salmen' => z_root() . '/salmon/' . $r[0]['channel_address'] . '/mention',
- '$modexp' => 'data:application/magic-public-key,' . $salmon_key,
- '$subscribe' => z_root() . '/follow?url={uri}',
- '$bigkey' => salmon_key($r[0]['channel_pubkey'])
- ));
-
-
- $arr = array('user' => $r[0], 'xml' => $o);
- call_hooks('personal_xrd', $arr);
-
- echo $arr['xml'];
- killme();
-
-}
diff --git a/mod/xref.php b/mod/xref.php
deleted file mode 100644
index 95cc22aa7..000000000
--- a/mod/xref.php
+++ /dev/null
@@ -1,20 +0,0 @@
-<?php
-
-function xref_init(&$a) {
- // Sets a referral URL using an xchan directly
- // Link format: example.com/xref/[xchan]/[TargetURL]
- // Target URL is optional.
- // Cookie lasts 24 hours to survive a browser restart. Contains no personal
- // information at all - just somebody else's xchan.
- $referrer = argv(1);
- $expire=time()+60*60*2;
- $path = 'xref';
- setcookie($path, $referrer, $expire, "/");
- $url = '';
-
- if (argc() > 2)
- $url = argv(2);
-
- goaway (z_root() . '/' . $url);
-
-}
diff --git a/mod/zfinger.php b/mod/zfinger.php
deleted file mode 100644
index fff7c9e1b..000000000
--- a/mod/zfinger.php
+++ /dev/null
@@ -1,12 +0,0 @@
-<?php
-
-function zfinger_init(&$a) {
-
- require_once('include/zot.php');
- require_once('include/crypto.php');
-
-
- $x = zotinfo($_REQUEST);
- json_return_and_die($x);
-
-}
diff --git a/mod/zotfeed.php b/mod/zotfeed.php
deleted file mode 100644
index 5041532ae..000000000
--- a/mod/zotfeed.php
+++ /dev/null
@@ -1,46 +0,0 @@
-<?php
-
-require_once('include/items.php');
-require_once('include/zot.php');
-
-function zotfeed_init(&$a) {
-
- $result = array('success' => false);
-
- $mindate = (($_REQUEST['mindate']) ? datetime_convert('UTC','UTC',$_REQUEST['mindate']) : '');
- if(! $mindate)
- $mindate = datetime_convert('UTC','UTC', 'now - 14 days');
-
- if(get_config('system','block_public') && (! get_account_id()) && (! remote_channel())) {
- $result['message'] = 'Public access denied';
- json_return_and_die($result);
- }
-
- $observer = App::get_observer();
-
-
- $channel_address = ((argc() > 1) ? argv(1) : '');
- if($channel_address) {
- $r = q("select channel_id, channel_name from channel where channel_address = '%s' and channel_removed = 0 limit 1",
- dbesc(argv(1))
- );
- }
- else {
- $x = get_sys_channel();
- if($x)
- $r = array($x);
- $mindate = datetime_convert('UTC','UTC', 'now - 14 days');
- }
- if(! $r) {
- $result['message'] = 'Channel not found.';
- json_return_and_die($result);
- }
-
- logger('zotfeed request: ' . $r[0]['channel_name'], LOGGER_DEBUG);
-
- $result['messages'] = zot_feed($r[0]['channel_id'],$observer['xchan_hash'],array('mindate' => $mindate));
- $result['success'] = true;
- json_return_and_die($result);
-
-
-}
diff --git a/mod/zping.php b/mod/zping.php
deleted file mode 100644
index 4cc4abb73..000000000
--- a/mod/zping.php
+++ /dev/null
@@ -1,28 +0,0 @@
-<?php /** @file */
-
-require_once('include/zot.php');
-
-function zping_content(&$a) {
-
- // This is just a test utility function and may go away once we build these tools into
- // the address book and directory to do dead site discovery.
-
- // The response packet include the current URL and key so we can discover if the server
- // has been re-installed and clean up (e.g. get rid of) any old hublocs and xchans.
-
- // Remember to add '/post' to the url
-
- if(! local_channel())
- return;
-
- $url = $_REQUEST['url'];
-
- if(! $url)
- return;
-
-
- $m = zot_build_packet(App::get_channel(),'ping');
- $r = zot_zot($url,$m);
- return print_r($r,true);
-
-} \ No newline at end of file
diff --git a/util/config b/util/config
index 9e90eca56..d4bcd5da1 100755
--- a/util/config
+++ b/util/config
@@ -3,13 +3,54 @@
// Red config utility
+if(!file_exists('include/cli_startup.php')) {
+ echo 'Run config from the top level Hubzilla web directory, as util/config <args>' . PHP_EOL;
+ exit(1);
+}
+
require_once('include/cli_startup.php');
cli_startup();
-if($argc > 3) {
-
+$helpArgs = getopt('h', array('help'));
+if (count($helpArgs) === 1) {
+ echo <<<'EndOfOutput'
+Gets, sets, or lists site-wide configuration settings.
+
+Usage: util/config
+ util/config <family>
+ util/config <family> <key>
+ util/config <family> <key> <value>
+
+ util/config
+ Displays all config entries
+
+ util/config <family>
+ Displays all config entries for family (system, database, etc)
+
+ util/config <family> <key>
+ Displays single config entry for the specified family and key
+
+ util/config <family> <key> <value>
+ Set config entry for specified family and key to value and display result
+
+Notes:
+ Setting config entries which are manually set in .htconfig.php may result
+ in conflict between database settings and the manual startup settings.
+
+ For channel-specific configuration settings, use util/pconfig
+
+ Details for configuration options can be found at:
+
+EndOfOutput;
+ echo ' ' . App::get_baseurl() . '/help/hidden_configs' . PHP_EOL . PHP_EOL;
+ return;
+}
+
+
+
+if($argc > 3) {
set_config($argv[1],$argv[2],$argv[3]);
echo "config[{$argv[1]}][{$argv[2]}] = " . printable_config(get_config($argv[1],$argv[2])) . "\n";
}
diff --git a/util/importdoc b/util/importdoc
index b89e12e97..087f472bc 100755
--- a/util/importdoc
+++ b/util/importdoc
@@ -5,7 +5,7 @@ require_once('include/cli_startup.php');
cli_startup();
-require_once('mod/help.php');
+require_once('include/help.php');
function update_docs_dir($s) {
$f = basename($s);
diff --git a/util/pconfig b/util/pconfig
index 038fa74c3..1afba8306 100755
--- a/util/pconfig
+++ b/util/pconfig
@@ -3,11 +3,57 @@
// Red pconfig utility
+
+if(!file_exists('include/cli_startup.php')) {
+ echo 'Run pconfig from the top level Hubzilla web directory, as util/pconfig <args>' . PHP_EOL;
+ exit(1);
+}
+
+
+
require_once('include/cli_startup.php');
require_once('include/zot.php');
cli_startup();
+$helpArgs = getopt('h', array('help'));
+if (count($helpArgs) === 1) {
+ echo <<<'EndOfOutput'
+Gets, sets, or lists personal (per channel) configuration settings.
+
+Usage: util/pconfig
+ util/pconfig <channel_id>
+ util/pconfig <channel_id> <family>
+ util/pconfig <channel_id> <family> <key>
+ util/pconfig <channel_id> <family> <key> <value>
+
+ util/pconfig
+ List all channel IDs
+
+ util/pconfig <channel_id>
+ Displays all of the the channel's config entries
+
+ util/pconfig <channel_id> <family>
+ Displays all of the channel's config entries for the specified family
+ (system, database, etc)
+
+ util/pconfig <channel_id> <family> <key>
+ Displays single config entry for the specified family and key
+
+ util/pconfig <channel_id> <family> <key> <value>
+ Set config entry for specified family and key to value and display result
+
+Notes:
+ For site-wide configuration settings, use util/config
+
+ Details for configuration options can be found at:
+
+EndOfOutput;
+ echo ' ' . App::get_baseurl() . '/help/hidden_configs' . PHP_EOL . PHP_EOL;
+ return;
+}
+
+
if($argc > 4) {
set_pconfig($argv[1],$argv[2],$argv[3],$argv[4]);
build_sync_packet($argv[1]);
@@ -34,3 +80,11 @@ if($argc == 2) {
}
}
+if($argc == 1) {
+ $r = q("select channel_id, channel_name from channel");
+ if($r) {
+ foreach($r as $rr) {
+ echo sprintf('%4u %s', $rr['channel_id'], $rr['channel_name']) . PHP_EOL;
+ }
+ }
+}
diff --git a/util/typo.php b/util/typo.php
index 0f7249f5c..e9a9be5f0 100644
--- a/util/typo.php
+++ b/util/typo.php
@@ -50,12 +50,12 @@
include_once($file);
}
- echo "Directory: mod\n";
- $files = glob('mod/*.php');
- foreach($files as $file) {
- echo $file . "\n";
- include_once($file);
- }
+// echo "Directory: mod\n";
+// $files = glob('mod/*.php');
+// foreach($files as $file) {
+// echo $file . "\n";
+// include_once($file);
+// }
echo "Directory: addon\n";
$dirs = glob('addon/*');
diff --git a/view/es-es/hmessages.po b/view/es-es/hmessages.po
index 39d963ed7..0242dbc1a 100644
--- a/view/es-es/hmessages.po
+++ b/view/es-es/hmessages.po
@@ -13,8 +13,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Redmatrix\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-04-15 00:01-0700\n"
-"PO-Revision-Date: 2016-04-16 05:32+0000\n"
+"POT-Creation-Date: 2016-04-22 00:01-0700\n"
+"PO-Revision-Date: 2016-04-22 10:40+0000\n"
"Last-Translator: Manuel Jiménez Friaza <mjfriaza@openmailbox.org>\n"
"Language-Team: Spanish (Spain) (http://www.transifex.com/Friendica/red-matrix/language/es_ES/)\n"
"MIME-Version: 1.0\n"
@@ -51,16 +51,16 @@ msgstr "Programar bandeja de entrada"
msgid "Schedule Outbox"
msgstr "Programar bandeja de salida"
-#: ../../Zotlabs/Storage/Browser.php:164 ../../include/apps.php:360
+#: ../../Zotlabs/Storage/Browser.php:164 ../../Zotlabs/Module/Photos.php:797
+#: ../../Zotlabs/Module/Photos.php:1241 ../../include/apps.php:360
#: ../../include/apps.php:415 ../../include/conversation.php:1037
-#: ../../include/widgets.php:1457 ../../mod/photos.php:793
-#: ../../mod/photos.php:1237
+#: ../../include/widgets.php:1457
msgid "Unknown"
msgstr "Desconocido"
-#: ../../Zotlabs/Storage/Browser.php:226 ../../include/apps.php:135
-#: ../../include/conversation.php:1657 ../../include/nav.php:93
-#: ../../mod/fbrowser.php:109
+#: ../../Zotlabs/Storage/Browser.php:226 ../../Zotlabs/Module/Fbrowser.php:85
+#: ../../include/apps.php:135 ../../include/conversation.php:1657
+#: ../../include/nav.php:93
msgid "Files"
msgstr "Ficheros"
@@ -73,21 +73,23 @@ msgid "Shared"
msgstr "Compartido"
#: ../../Zotlabs/Storage/Browser.php:230 ../../Zotlabs/Storage/Browser.php:303
-#: ../../mod/new_channel.php:138 ../../mod/webpages.php:184
-#: ../../mod/blocks.php:154 ../../mod/layouts.php:176 ../../mod/menu.php:114
+#: ../../Zotlabs/Module/Blocks.php:158 ../../Zotlabs/Module/Layouts.php:180
+#: ../../Zotlabs/Module/Menu.php:118 ../../Zotlabs/Module/New_channel.php:142
+#: ../../Zotlabs/Module/Webpages.php:188
msgid "Create"
msgstr "Crear"
#: ../../Zotlabs/Storage/Browser.php:231 ../../Zotlabs/Storage/Browser.php:305
-#: ../../include/widgets.php:1470 ../../mod/photos.php:820
-#: ../../mod/photos.php:1361 ../../mod/profile_photo.php:401
-#: ../../mod/cover_photo.php:353
+#: ../../Zotlabs/Module/Cover_photo.php:357
+#: ../../Zotlabs/Module/Photos.php:824 ../../Zotlabs/Module/Photos.php:1365
+#: ../../Zotlabs/Module/Profile_photo.php:368 ../../include/widgets.php:1470
msgid "Upload"
msgstr "Subir"
-#: ../../Zotlabs/Storage/Browser.php:235 ../../mod/admin.php:1158
-#: ../../mod/chat.php:241 ../../mod/settings.php:599
-#: ../../mod/settings.php:625 ../../mod/sharedwithme.php:95
+#: ../../Zotlabs/Storage/Browser.php:235 ../../Zotlabs/Module/Admin.php:1166
+#: ../../Zotlabs/Module/Chat.php:245 ../../Zotlabs/Module/Settings.php:590
+#: ../../Zotlabs/Module/Settings.php:616
+#: ../../Zotlabs/Module/Sharedwithme.php:99
msgid "Name"
msgstr "Nombre"
@@ -95,36 +97,45 @@ msgstr "Nombre"
msgid "Type"
msgstr "Tipo"
-#: ../../Zotlabs/Storage/Browser.php:237 ../../include/text.php:1293
-#: ../../mod/sharedwithme.php:97
+#: ../../Zotlabs/Storage/Browser.php:237
+#: ../../Zotlabs/Module/Sharedwithme.php:101 ../../include/text.php:1293
msgid "Size"
msgstr "Tamaño"
-#: ../../Zotlabs/Storage/Browser.php:238 ../../mod/sharedwithme.php:98
+#: ../../Zotlabs/Storage/Browser.php:238
+#: ../../Zotlabs/Module/Sharedwithme.php:102
msgid "Last Modified"
msgstr "Última modificación"
-#: ../../Zotlabs/Storage/Browser.php:240 ../../include/identity.php:930
+#: ../../Zotlabs/Storage/Browser.php:240 ../../Zotlabs/Module/Admin.php:1775
+#: ../../Zotlabs/Module/Blocks.php:159
+#: ../../Zotlabs/Module/Connections.php:290
+#: ../../Zotlabs/Module/Connections.php:310
+#: ../../Zotlabs/Module/Editblock.php:140
+#: ../../Zotlabs/Module/Editlayout.php:139
+#: ../../Zotlabs/Module/Editpost.php:118
+#: ../../Zotlabs/Module/Editwebpage.php:181
+#: ../../Zotlabs/Module/Layouts.php:188 ../../Zotlabs/Module/Menu.php:112
+#: ../../Zotlabs/Module/Settings.php:650 ../../Zotlabs/Module/Thing.php:260
+#: ../../Zotlabs/Module/Webpages.php:189 ../../include/identity.php:930
#: ../../include/identity.php:934 ../../include/ItemObject.php:100
#: ../../include/apps.php:259 ../../include/menu.php:108
#: ../../include/page_widgets.php:8 ../../include/page_widgets.php:36
-#: ../../mod/admin.php:1767 ../../mod/editpost.php:114
-#: ../../mod/connections.php:286 ../../mod/connections.php:306
-#: ../../mod/editblock.php:136 ../../mod/editlayout.php:135
-#: ../../mod/webpages.php:185 ../../mod/editwebpage.php:177
-#: ../../mod/blocks.php:155 ../../mod/settings.php:659
-#: ../../mod/layouts.php:184 ../../mod/menu.php:108 ../../mod/thing.php:256
msgid "Edit"
msgstr "Editar"
-#: ../../Zotlabs/Storage/Browser.php:241 ../../include/ItemObject.php:120
-#: ../../include/apps.php:260 ../../include/conversation.php:657
-#: ../../mod/admin.php:993 ../../mod/admin.php:1152 ../../mod/admin.php:1768
-#: ../../mod/photos.php:1168 ../../mod/connections.php:259
-#: ../../mod/connedit.php:569 ../../mod/editblock.php:183
-#: ../../mod/editlayout.php:180 ../../mod/webpages.php:187
-#: ../../mod/editwebpage.php:224 ../../mod/blocks.php:157
-#: ../../mod/group.php:173 ../../mod/settings.php:660 ../../mod/thing.php:257
+#: ../../Zotlabs/Storage/Browser.php:241 ../../Zotlabs/Module/Admin.php:1001
+#: ../../Zotlabs/Module/Admin.php:1160 ../../Zotlabs/Module/Admin.php:1776
+#: ../../Zotlabs/Module/Blocks.php:161
+#: ../../Zotlabs/Module/Connections.php:263
+#: ../../Zotlabs/Module/Connedit.php:573
+#: ../../Zotlabs/Module/Editblock.php:187
+#: ../../Zotlabs/Module/Editlayout.php:184
+#: ../../Zotlabs/Module/Editwebpage.php:228 ../../Zotlabs/Module/Group.php:177
+#: ../../Zotlabs/Module/Photos.php:1172 ../../Zotlabs/Module/Settings.php:651
+#: ../../Zotlabs/Module/Thing.php:261 ../../Zotlabs/Module/Webpages.php:191
+#: ../../include/ItemObject.php:120 ../../include/apps.php:260
+#: ../../include/conversation.php:657
msgid "Delete"
msgstr "Eliminar"
@@ -150,58 +161,77 @@ msgstr "Crear nueva carpeta"
msgid "Upload file"
msgstr "Subir fichero"
-#: ../../Zotlabs/Web/Router.php:47 ../../include/items.php:4671
-#: ../../include/photos.php:29 ../../include/chat.php:133
-#: ../../include/attach.php:141 ../../include/attach.php:189
-#: ../../include/attach.php:252 ../../include/attach.php:266
-#: ../../include/attach.php:273 ../../include/attach.php:338
-#: ../../include/attach.php:352 ../../include/attach.php:359
-#: ../../include/attach.php:437 ../../include/attach.php:895
-#: ../../include/attach.php:966 ../../include/attach.php:1118
-#: ../../mod/achievements.php:30 ../../mod/api.php:26 ../../mod/api.php:31
-#: ../../mod/appman.php:66 ../../mod/page.php:31 ../../mod/page.php:86
-#: ../../mod/authtest.php:13 ../../mod/pdledit.php:22 ../../mod/block.php:22
-#: ../../mod/block.php:72 ../../mod/editpost.php:13 ../../mod/photos.php:70
-#: ../../mod/bookmarks.php:57 ../../mod/mitem.php:111
-#: ../../mod/channel.php:101 ../../mod/channel.php:221
-#: ../../mod/channel.php:261 ../../mod/poke.php:133 ../../mod/chat.php:94
-#: ../../mod/chat.php:99 ../../mod/common.php:35 ../../mod/profile.php:64
-#: ../../mod/profile.php:72 ../../mod/mood.php:112
-#: ../../mod/connections.php:29 ../../mod/profile_photo.php:289
-#: ../../mod/profile_photo.php:302 ../../mod/connedit.php:362
-#: ../../mod/network.php:12 ../../mod/cover_photo.php:273
-#: ../../mod/cover_photo.php:286 ../../mod/profiles.php:198
-#: ../../mod/profiles.php:596 ../../mod/editblock.php:65
-#: ../../mod/new_channel.php:73 ../../mod/new_channel.php:100
-#: ../../mod/editlayout.php:63 ../../mod/editlayout.php:87
-#: ../../mod/rate.php:111 ../../mod/webpages.php:69
-#: ../../mod/editwebpage.php:64 ../../mod/editwebpage.php:86
-#: ../../mod/editwebpage.php:101 ../../mod/editwebpage.php:125
-#: ../../mod/blocks.php:69 ../../mod/blocks.php:76 ../../mod/events.php:260
-#: ../../mod/register.php:73 ../../mod/regmod.php:17
-#: ../../mod/notifications.php:66 ../../mod/filestorage.php:18
-#: ../../mod/filestorage.php:73 ../../mod/filestorage.php:88
-#: ../../mod/filestorage.php:115 ../../mod/fsuggest.php:78
-#: ../../mod/group.php:9 ../../mod/service_limits.php:7
-#: ../../mod/settings.php:579 ../../mod/id.php:71 ../../mod/setup.php:233
-#: ../../mod/sharedwithme.php:7 ../../mod/invite.php:13
-#: ../../mod/invite.php:87 ../../mod/item.php:206 ../../mod/item.php:214
-#: ../../mod/item.php:1069 ../../mod/layouts.php:69 ../../mod/layouts.php:76
-#: ../../mod/layouts.php:87 ../../mod/like.php:177 ../../mod/locs.php:83
-#: ../../mod/sources.php:66 ../../mod/mail.php:126 ../../mod/suggest.php:26
-#: ../../mod/manage.php:6 ../../mod/menu.php:74 ../../mod/message.php:16
-#: ../../mod/thing.php:270 ../../mod/thing.php:290 ../../mod/thing.php:327
-#: ../../mod/viewconnections.php:22 ../../mod/viewconnections.php:27
-#: ../../mod/viewsrc.php:14 ../../index.php:174
+#: ../../Zotlabs/Web/Router.php:65 ../../Zotlabs/Module/Achievements.php:34
+#: ../../Zotlabs/Module/Api.php:13 ../../Zotlabs/Module/Api.php:18
+#: ../../Zotlabs/Module/Appman.php:70 ../../Zotlabs/Module/Authtest.php:16
+#: ../../Zotlabs/Module/Block.php:26 ../../Zotlabs/Module/Block.php:76
+#: ../../Zotlabs/Module/Blocks.php:73 ../../Zotlabs/Module/Blocks.php:80
+#: ../../Zotlabs/Module/Bookmarks.php:61 ../../Zotlabs/Module/Channel.php:104
+#: ../../Zotlabs/Module/Channel.php:224 ../../Zotlabs/Module/Channel.php:264
+#: ../../Zotlabs/Module/Chat.php:98 ../../Zotlabs/Module/Chat.php:103
+#: ../../Zotlabs/Module/Common.php:39 ../../Zotlabs/Module/Connections.php:33
+#: ../../Zotlabs/Module/Connedit.php:366
+#: ../../Zotlabs/Module/Cover_photo.php:277
+#: ../../Zotlabs/Module/Cover_photo.php:290
+#: ../../Zotlabs/Module/Editblock.php:69
+#: ../../Zotlabs/Module/Editlayout.php:67
+#: ../../Zotlabs/Module/Editlayout.php:91 ../../Zotlabs/Module/Editpost.php:17
+#: ../../Zotlabs/Module/Editwebpage.php:68
+#: ../../Zotlabs/Module/Editwebpage.php:90
+#: ../../Zotlabs/Module/Editwebpage.php:105
+#: ../../Zotlabs/Module/Editwebpage.php:129
+#: ../../Zotlabs/Module/Events.php:264 ../../Zotlabs/Module/Filestorage.php:22
+#: ../../Zotlabs/Module/Filestorage.php:77
+#: ../../Zotlabs/Module/Filestorage.php:92
+#: ../../Zotlabs/Module/Filestorage.php:119
+#: ../../Zotlabs/Module/Fsuggest.php:82 ../../Zotlabs/Module/Group.php:13
+#: ../../Zotlabs/Module/Id.php:76 ../../Zotlabs/Module/Invite.php:17
+#: ../../Zotlabs/Module/Invite.php:91 ../../Zotlabs/Module/Item.php:210
+#: ../../Zotlabs/Module/Item.php:218 ../../Zotlabs/Module/Item.php:1070
+#: ../../Zotlabs/Module/Layouts.php:73 ../../Zotlabs/Module/Layouts.php:80
+#: ../../Zotlabs/Module/Layouts.php:91 ../../Zotlabs/Module/Like.php:181
+#: ../../Zotlabs/Module/Locs.php:87 ../../Zotlabs/Module/Mail.php:130
+#: ../../Zotlabs/Module/Manage.php:10 ../../Zotlabs/Module/Menu.php:78
+#: ../../Zotlabs/Module/Message.php:20 ../../Zotlabs/Module/Mitem.php:115
+#: ../../Zotlabs/Module/Mood.php:116 ../../Zotlabs/Module/Network.php:16
+#: ../../Zotlabs/Module/New_channel.php:77
+#: ../../Zotlabs/Module/New_channel.php:104
+#: ../../Zotlabs/Module/Notifications.php:70 ../../Zotlabs/Module/Page.php:35
+#: ../../Zotlabs/Module/Page.php:90 ../../Zotlabs/Module/Pdledit.php:26
+#: ../../Zotlabs/Module/Photos.php:74 ../../Zotlabs/Module/Poke.php:137
+#: ../../Zotlabs/Module/Profile.php:68 ../../Zotlabs/Module/Profile.php:76
+#: ../../Zotlabs/Module/Profile_photo.php:256
+#: ../../Zotlabs/Module/Profile_photo.php:269
+#: ../../Zotlabs/Module/Profiles.php:202 ../../Zotlabs/Module/Profiles.php:600
+#: ../../Zotlabs/Module/Rate.php:115 ../../Zotlabs/Module/Register.php:77
+#: ../../Zotlabs/Module/Regmod.php:21
+#: ../../Zotlabs/Module/Service_limits.php:11
+#: ../../Zotlabs/Module/Settings.php:570 ../../Zotlabs/Module/Setup.php:238
+#: ../../Zotlabs/Module/Sharedwithme.php:11
+#: ../../Zotlabs/Module/Sources.php:70 ../../Zotlabs/Module/Suggest.php:30
+#: ../../Zotlabs/Module/Thing.php:274 ../../Zotlabs/Module/Thing.php:294
+#: ../../Zotlabs/Module/Thing.php:331
+#: ../../Zotlabs/Module/Viewconnections.php:26
+#: ../../Zotlabs/Module/Viewconnections.php:31
+#: ../../Zotlabs/Module/Viewsrc.php:18 ../../Zotlabs/Module/Webpages.php:73
+#: ../../include/chat.php:133 ../../include/attach.php:141
+#: ../../include/attach.php:189 ../../include/attach.php:252
+#: ../../include/attach.php:266 ../../include/attach.php:273
+#: ../../include/attach.php:338 ../../include/attach.php:352
+#: ../../include/attach.php:359 ../../include/attach.php:437
+#: ../../include/attach.php:895 ../../include/attach.php:966
+#: ../../include/attach.php:1118 ../../include/items.php:4671
+#: ../../include/photos.php:29 ../../index.php:174
msgid "Permission denied."
msgstr "Acceso denegado."
-#: ../../Zotlabs/Web/Router.php:105 ../../mod/help.php:231
+#: ../../Zotlabs/Web/Router.php:146 ../../Zotlabs/Module/Help.php:94
msgid "Not Found"
msgstr "No encontrado"
-#: ../../Zotlabs/Web/Router.php:108 ../../mod/page.php:89
-#: ../../mod/block.php:75 ../../mod/display.php:117 ../../mod/help.php:234
+#: ../../Zotlabs/Web/Router.php:149 ../../Zotlabs/Module/Block.php:79
+#: ../../Zotlabs/Module/Display.php:121 ../../Zotlabs/Module/Help.php:97
+#: ../../Zotlabs/Module/Page.php:93
msgid "Page not found."
msgstr "Página no encontrada."
@@ -211,12 +241,6084 @@ msgid ""
" logout and retry."
msgstr "La autenticación desde su servidor está bloqueada. Ha iniciado sesión localmente. Por favor, salga de la sesión y vuelva a intentarlo."
-#: ../../Zotlabs/Zot/Auth.php:248 ../../mod/openid.php:72
-#: ../../mod/openid.php:179
+#: ../../Zotlabs/Zot/Auth.php:248 ../../Zotlabs/Module/Openid.php:76
+#: ../../Zotlabs/Module/Openid.php:183
#, php-format
msgid "Welcome %s. Remote authentication successful."
msgstr "Bienvenido %s. La identificación desde su servidor se ha llevado a cabo correctamente."
+#: ../../Zotlabs/Module/Achievements.php:15 ../../Zotlabs/Module/Blocks.php:33
+#: ../../Zotlabs/Module/Connect.php:17 ../../Zotlabs/Module/Editblock.php:33
+#: ../../Zotlabs/Module/Editlayout.php:31
+#: ../../Zotlabs/Module/Editwebpage.php:32
+#: ../../Zotlabs/Module/Filestorage.php:58 ../../Zotlabs/Module/Hcard.php:12
+#: ../../Zotlabs/Module/Layouts.php:33 ../../Zotlabs/Module/Profile.php:20
+#: ../../Zotlabs/Module/Webpages.php:33 ../../include/identity.php:830
+msgid "Requested profile is not available."
+msgstr "El perfil solicitado no está disponible."
+
+#: ../../Zotlabs/Module/Achievements.php:38
+msgid "Some blurb about what to do when you're new here"
+msgstr "Algunas propuestas para el nuevo usuario sobre qué se puede hacer aquí"
+
+#: ../../Zotlabs/Module/Acl.php:225
+msgid "network"
+msgstr "red"
+
+#: ../../Zotlabs/Module/Acl.php:235
+msgid "RSS"
+msgstr "RSS"
+
+#: ../../Zotlabs/Module/Admin.php:58
+msgid "Theme settings updated."
+msgstr "Ajustes del tema actualizados."
+
+#: ../../Zotlabs/Module/Admin.php:145 ../../Zotlabs/Module/Admin.php:1197
+#: ../../Zotlabs/Module/Admin.php:1442 ../../Zotlabs/Module/Display.php:44
+#: ../../Zotlabs/Module/Filestorage.php:31 ../../Zotlabs/Module/Thing.php:89
+#: ../../Zotlabs/Module/Viewsrc.php:24 ../../include/items.php:4592
+msgid "Item not found."
+msgstr "Elemento no encontrado."
+
+#: ../../Zotlabs/Module/Admin.php:178
+msgid "# Accounts"
+msgstr "# Cuentas"
+
+#: ../../Zotlabs/Module/Admin.php:179
+msgid "# blocked accounts"
+msgstr "# cuentas bloqueadas"
+
+#: ../../Zotlabs/Module/Admin.php:180
+msgid "# expired accounts"
+msgstr "# cuentas caducadas"
+
+#: ../../Zotlabs/Module/Admin.php:181
+msgid "# expiring accounts"
+msgstr "# cuentas que caducan"
+
+#: ../../Zotlabs/Module/Admin.php:192
+msgid "# Channels"
+msgstr "# Canales"
+
+#: ../../Zotlabs/Module/Admin.php:193
+msgid "# primary"
+msgstr "# primario"
+
+#: ../../Zotlabs/Module/Admin.php:194
+msgid "# clones"
+msgstr "# clones"
+
+#: ../../Zotlabs/Module/Admin.php:200
+msgid "Message queues"
+msgstr "Mensajes en cola"
+
+#: ../../Zotlabs/Module/Admin.php:216 ../../Zotlabs/Module/Admin.php:462
+#: ../../Zotlabs/Module/Admin.php:677 ../../Zotlabs/Module/Admin.php:717
+#: ../../Zotlabs/Module/Admin.php:992 ../../Zotlabs/Module/Admin.php:1156
+#: ../../Zotlabs/Module/Admin.php:1271 ../../Zotlabs/Module/Admin.php:1332
+#: ../../Zotlabs/Module/Admin.php:1493 ../../Zotlabs/Module/Admin.php:1527
+#: ../../Zotlabs/Module/Admin.php:1612
+msgid "Administration"
+msgstr "Administración"
+
+#: ../../Zotlabs/Module/Admin.php:217
+msgid "Summary"
+msgstr "Sumario"
+
+#: ../../Zotlabs/Module/Admin.php:220
+msgid "Registered accounts"
+msgstr "Cuentas registradas"
+
+#: ../../Zotlabs/Module/Admin.php:221 ../../Zotlabs/Module/Admin.php:681
+msgid "Pending registrations"
+msgstr "Registros pendientes"
+
+#: ../../Zotlabs/Module/Admin.php:222
+msgid "Registered channels"
+msgstr "Canales registrados"
+
+#: ../../Zotlabs/Module/Admin.php:223 ../../Zotlabs/Module/Admin.php:682
+msgid "Active plugins"
+msgstr "Extensiones activas"
+
+#: ../../Zotlabs/Module/Admin.php:224
+msgid "Version"
+msgstr "Versión"
+
+#: ../../Zotlabs/Module/Admin.php:345
+msgid "Site settings updated."
+msgstr "Ajustes del sitio actualizados."
+
+#: ../../Zotlabs/Module/Admin.php:372 ../../include/comanche.php:34
+msgid "Default"
+msgstr "Predeterminado"
+
+#: ../../Zotlabs/Module/Admin.php:382 ../../Zotlabs/Module/Settings.php:796
+msgid "mobile"
+msgstr "móvil"
+
+#: ../../Zotlabs/Module/Admin.php:384
+msgid "experimental"
+msgstr "experimental"
+
+#: ../../Zotlabs/Module/Admin.php:386
+msgid "unsupported"
+msgstr "no soportado"
+
+#: ../../Zotlabs/Module/Admin.php:431 ../../Zotlabs/Module/Api.php:89
+#: ../../Zotlabs/Module/Connedit.php:379 ../../Zotlabs/Module/Connedit.php:657
+#: ../../Zotlabs/Module/Events.php:458 ../../Zotlabs/Module/Events.php:459
+#: ../../Zotlabs/Module/Events.php:468
+#: ../../Zotlabs/Module/Filestorage.php:155
+#: ../../Zotlabs/Module/Filestorage.php:163 ../../Zotlabs/Module/Menu.php:100
+#: ../../Zotlabs/Module/Menu.php:157 ../../Zotlabs/Module/Mitem.php:158
+#: ../../Zotlabs/Module/Mitem.php:159 ../../Zotlabs/Module/Mitem.php:232
+#: ../../Zotlabs/Module/Mitem.php:233 ../../Zotlabs/Module/Photos.php:665
+#: ../../Zotlabs/Module/Profiles.php:651 ../../Zotlabs/Module/Removeme.php:64
+#: ../../Zotlabs/Module/Settings.php:579 ../../include/dir_fns.php:141
+#: ../../include/dir_fns.php:142 ../../include/dir_fns.php:143
+#: ../../view/theme/redbasic/php/config.php:105
+#: ../../view/theme/redbasic/php/config.php:130 ../../boot.php:1606
+msgid "No"
+msgstr "No"
+
+#: ../../Zotlabs/Module/Admin.php:432
+msgid "Yes - with approval"
+msgstr "Sí - con aprobación"
+
+#: ../../Zotlabs/Module/Admin.php:433 ../../Zotlabs/Module/Api.php:88
+#: ../../Zotlabs/Module/Connedit.php:379 ../../Zotlabs/Module/Events.php:458
+#: ../../Zotlabs/Module/Events.php:459 ../../Zotlabs/Module/Events.php:468
+#: ../../Zotlabs/Module/Filestorage.php:155
+#: ../../Zotlabs/Module/Filestorage.php:163 ../../Zotlabs/Module/Menu.php:100
+#: ../../Zotlabs/Module/Menu.php:157 ../../Zotlabs/Module/Mitem.php:158
+#: ../../Zotlabs/Module/Mitem.php:159 ../../Zotlabs/Module/Mitem.php:232
+#: ../../Zotlabs/Module/Mitem.php:233 ../../Zotlabs/Module/Photos.php:665
+#: ../../Zotlabs/Module/Profiles.php:651 ../../Zotlabs/Module/Removeme.php:64
+#: ../../Zotlabs/Module/Settings.php:579 ../../include/dir_fns.php:141
+#: ../../include/dir_fns.php:142 ../../include/dir_fns.php:143
+#: ../../view/theme/redbasic/php/config.php:105
+#: ../../view/theme/redbasic/php/config.php:130 ../../boot.php:1606
+msgid "Yes"
+msgstr "Sí"
+
+#: ../../Zotlabs/Module/Admin.php:438
+msgid "My site is not a public server"
+msgstr "Mi sitio no es un servidor público"
+
+#: ../../Zotlabs/Module/Admin.php:439
+msgid "My site has paid access only"
+msgstr "Mi sitio es un servicio de pago"
+
+#: ../../Zotlabs/Module/Admin.php:440
+msgid "My site has free access only"
+msgstr "Mi sitio es un servicio gratuito"
+
+#: ../../Zotlabs/Module/Admin.php:441
+msgid "My site offers free accounts with optional paid upgrades"
+msgstr "Mi sitio ofrece cuentas gratuitas con opciones extra de pago"
+
+#: ../../Zotlabs/Module/Admin.php:463 ../../include/widgets.php:1334
+msgid "Site"
+msgstr "Sitio"
+
+#: ../../Zotlabs/Module/Admin.php:464 ../../Zotlabs/Module/Admin.php:654
+#: ../../Zotlabs/Module/Admin.php:729 ../../Zotlabs/Module/Admin.php:994
+#: ../../Zotlabs/Module/Admin.php:1158 ../../Zotlabs/Module/Admin.php:1334
+#: ../../Zotlabs/Module/Admin.php:1529 ../../Zotlabs/Module/Admin.php:1614
+#: ../../Zotlabs/Module/Admin.php:1778 ../../Zotlabs/Module/Appman.php:103
+#: ../../Zotlabs/Module/Cal.php:341 ../../Zotlabs/Module/Chat.php:194
+#: ../../Zotlabs/Module/Chat.php:236 ../../Zotlabs/Module/Connect.php:97
+#: ../../Zotlabs/Module/Connedit.php:733 ../../Zotlabs/Module/Events.php:472
+#: ../../Zotlabs/Module/Events.php:669
+#: ../../Zotlabs/Module/Filestorage.php:160
+#: ../../Zotlabs/Module/Fsuggest.php:112 ../../Zotlabs/Module/Group.php:85
+#: ../../Zotlabs/Module/Import.php:546
+#: ../../Zotlabs/Module/Import_items.php:120
+#: ../../Zotlabs/Module/Invite.php:146 ../../Zotlabs/Module/Locs.php:121
+#: ../../Zotlabs/Module/Mail.php:384 ../../Zotlabs/Module/Mitem.php:235
+#: ../../Zotlabs/Module/Mood.php:139 ../../Zotlabs/Module/Pconfig.php:107
+#: ../../Zotlabs/Module/Pdledit.php:66 ../../Zotlabs/Module/Photos.php:676
+#: ../../Zotlabs/Module/Photos.php:1051 ../../Zotlabs/Module/Photos.php:1091
+#: ../../Zotlabs/Module/Photos.php:1209 ../../Zotlabs/Module/Poke.php:186
+#: ../../Zotlabs/Module/Profiles.php:691 ../../Zotlabs/Module/Rate.php:172
+#: ../../Zotlabs/Module/Settings.php:588 ../../Zotlabs/Module/Settings.php:701
+#: ../../Zotlabs/Module/Settings.php:729 ../../Zotlabs/Module/Settings.php:752
+#: ../../Zotlabs/Module/Settings.php:840
+#: ../../Zotlabs/Module/Settings.php:1032 ../../Zotlabs/Module/Setup.php:335
+#: ../../Zotlabs/Module/Setup.php:376 ../../Zotlabs/Module/Sources.php:108
+#: ../../Zotlabs/Module/Sources.php:142 ../../Zotlabs/Module/Thing.php:316
+#: ../../Zotlabs/Module/Thing.php:362 ../../Zotlabs/Module/Xchan.php:15
+#: ../../include/ItemObject.php:703 ../../include/widgets.php:708
+#: ../../include/widgets.php:720 ../../include/js_strings.php:22
+#: ../../view/theme/redbasic/php/config.php:99
+msgid "Submit"
+msgstr "Enviar"
+
+#: ../../Zotlabs/Module/Admin.php:465 ../../Zotlabs/Module/Register.php:245
+msgid "Registration"
+msgstr "Registro"
+
+#: ../../Zotlabs/Module/Admin.php:466
+msgid "File upload"
+msgstr "Subir fichero"
+
+#: ../../Zotlabs/Module/Admin.php:467
+msgid "Policies"
+msgstr "Políticas"
+
+#: ../../Zotlabs/Module/Admin.php:468 ../../include/contact_widgets.php:19
+msgid "Advanced"
+msgstr "Avanzado"
+
+#: ../../Zotlabs/Module/Admin.php:472
+msgid "Site name"
+msgstr "Nombre del sitio"
+
+#: ../../Zotlabs/Module/Admin.php:473
+msgid "Banner/Logo"
+msgstr "Banner/Logo"
+
+#: ../../Zotlabs/Module/Admin.php:474
+msgid "Administrator Information"
+msgstr "Información del Administrador"
+
+#: ../../Zotlabs/Module/Admin.php:474
+msgid ""
+"Contact information for site administrators. Displayed on siteinfo page. "
+"BBCode can be used here"
+msgstr "Información de contacto de los administradores del sitio. Visible en la página \"siteinfo\". Se puede usar BBCode"
+
+#: ../../Zotlabs/Module/Admin.php:475
+msgid "System language"
+msgstr "Idioma del sistema"
+
+#: ../../Zotlabs/Module/Admin.php:476
+msgid "System theme"
+msgstr "Tema gráfico del sistema"
+
+#: ../../Zotlabs/Module/Admin.php:476
+msgid ""
+"Default system theme - may be over-ridden by user profiles - <a href='#' "
+"id='cnftheme'>change theme settings</a>"
+msgstr "Tema del sistema por defecto - se puede cambiar por cada perfil de usuario - <a href='#' id='cnftheme'>modificar los ajustes del tema</a>"
+
+#: ../../Zotlabs/Module/Admin.php:477
+msgid "Mobile system theme"
+msgstr "Tema del sistema para móviles"
+
+#: ../../Zotlabs/Module/Admin.php:477
+msgid "Theme for mobile devices"
+msgstr "Tema para dispositivos móviles"
+
+#: ../../Zotlabs/Module/Admin.php:479
+msgid "Allow Feeds as Connections"
+msgstr "Permitir contenidos RSS como conexiones"
+
+#: ../../Zotlabs/Module/Admin.php:479
+msgid "(Heavy system resource usage)"
+msgstr "(Uso intenso de los recursos del sistema)"
+
+#: ../../Zotlabs/Module/Admin.php:480
+msgid "Maximum image size"
+msgstr "Tamaño máximo de la imagen"
+
+#: ../../Zotlabs/Module/Admin.php:480
+msgid ""
+"Maximum size in bytes of uploaded images. Default is 0, which means no "
+"limits."
+msgstr "Tamaño máximo en bytes de la imagen subida. Por defecto, es 0, lo que significa que no hay límites."
+
+#: ../../Zotlabs/Module/Admin.php:481
+msgid "Does this site allow new member registration?"
+msgstr "¿Debe este sitio permitir el registro de nuevos miembros?"
+
+#: ../../Zotlabs/Module/Admin.php:482
+msgid "Invitation only"
+msgstr "Solo con una invitación"
+
+#: ../../Zotlabs/Module/Admin.php:482
+msgid ""
+"Only allow new member registrations with an invitation code. Above register "
+"policy must be set to Yes."
+msgstr "Solo se permiten inscripciones de nuevos miembros con un código de invitación. Además, deben aceptarse los términos del registro marcando \"Sí\"."
+
+#: ../../Zotlabs/Module/Admin.php:483
+msgid "Which best describes the types of account offered by this hub?"
+msgstr "¿Cómo describiría el tipo de servicio ofrecido por este servidor?"
+
+#: ../../Zotlabs/Module/Admin.php:484
+msgid "Register text"
+msgstr "Texto del registro"
+
+#: ../../Zotlabs/Module/Admin.php:484
+msgid "Will be displayed prominently on the registration page."
+msgstr "Se mostrará de forma destacada en la página de registro."
+
+#: ../../Zotlabs/Module/Admin.php:485
+msgid "Site homepage to show visitors (default: login box)"
+msgstr "Página personal que se mostrará a los visitantes (por defecto: la página de identificación)"
+
+#: ../../Zotlabs/Module/Admin.php:485
+msgid ""
+"example: 'public' to show public stream, 'page/sys/home' to show a system "
+"webpage called 'home' or 'include:home.html' to include a file."
+msgstr "ejemplo: 'public' para mostrar contenido público, 'page/sys/home' para mostrar la página web definida como \"home\" o 'include:home.html' para mostrar el contenido de un fichero."
+
+#: ../../Zotlabs/Module/Admin.php:486
+msgid "Preserve site homepage URL"
+msgstr "Preservar la dirección de la página personal"
+
+#: ../../Zotlabs/Module/Admin.php:486
+msgid ""
+"Present the site homepage in a frame at the original location instead of "
+"redirecting"
+msgstr "Presenta la página personal del sitio en un marco en la ubicación original, en vez de redirigirla."
+
+#: ../../Zotlabs/Module/Admin.php:487
+msgid "Accounts abandoned after x days"
+msgstr "Cuentas abandonadas después de x días"
+
+#: ../../Zotlabs/Module/Admin.php:487
+msgid ""
+"Will not waste system resources polling external sites for abandonded "
+"accounts. Enter 0 for no time limit."
+msgstr "Para evitar consumir recursos del sistema intentando poner al día las cuentas abandonadas. Introduzca 0 para no tener límite de tiempo."
+
+#: ../../Zotlabs/Module/Admin.php:488
+msgid "Allowed friend domains"
+msgstr "Dominios amigos permitidos"
+
+#: ../../Zotlabs/Module/Admin.php:488
+msgid ""
+"Comma separated list of domains which are allowed to establish friendships "
+"with this site. Wildcards are accepted. Empty to allow any domains"
+msgstr "Lista separada por comas de dominios a los que está permitido establecer relaciones de amistad con este sitio. Se permiten comodines. Dejar en claro para aceptar cualquier dominio."
+
+#: ../../Zotlabs/Module/Admin.php:489
+msgid "Allowed email domains"
+msgstr "Se aceptan dominios de correo electrónico"
+
+#: ../../Zotlabs/Module/Admin.php:489
+msgid ""
+"Comma separated list of domains which are allowed in email addresses for "
+"registrations to this site. Wildcards are accepted. Empty to allow any "
+"domains"
+msgstr "Lista separada por comas de los dominios de los que se acepta una dirección de correo electrónico para registros en este sitio. Se permiten comodines. Dejar en claro para aceptar cualquier dominio. "
+
+#: ../../Zotlabs/Module/Admin.php:490
+msgid "Not allowed email domains"
+msgstr "No se permiten dominios de correo electrónico"
+
+#: ../../Zotlabs/Module/Admin.php:490
+msgid ""
+"Comma separated list of domains which are not allowed in email addresses for"
+" registrations to this site. Wildcards are accepted. Empty to allow any "
+"domains, unless allowed domains have been defined."
+msgstr "Lista separada por comas de los dominios de los que no se acepta una dirección de correo electrónico para registros en este sitio. Se permiten comodines. Dejar en claro para no aceptar cualquier dominio, excepto los que se hayan autorizado."
+
+#: ../../Zotlabs/Module/Admin.php:491
+msgid "Verify Email Addresses"
+msgstr "Verificar las direcciones de correo electrónico"
+
+#: ../../Zotlabs/Module/Admin.php:491
+msgid ""
+"Check to verify email addresses used in account registration (recommended)."
+msgstr "Activar para la verificación de la dirección de correo electrónico en el registro de una cuenta (recomendado)."
+
+#: ../../Zotlabs/Module/Admin.php:492
+msgid "Force publish"
+msgstr "Forzar la publicación"
+
+#: ../../Zotlabs/Module/Admin.php:492
+msgid ""
+"Check to force all profiles on this site to be listed in the site directory."
+msgstr "Intentar forzar todos los perfiles para que sean listados en el directorio de este sitio."
+
+#: ../../Zotlabs/Module/Admin.php:493
+msgid "Import Public Streams"
+msgstr "Importar contenido público"
+
+#: ../../Zotlabs/Module/Admin.php:493
+msgid ""
+"Import and allow access to public content pulled from other sites. Warning: "
+"this content is unmoderated."
+msgstr "Importar y permitir acceso al contenido público sacado de otros sitios. Advertencia: este contenido no está moderado, por lo que podría encontrar cosas inapropiadas u ofensivas."
+
+#: ../../Zotlabs/Module/Admin.php:494
+msgid "Login on Homepage"
+msgstr "Iniciar sesión en la página personal"
+
+#: ../../Zotlabs/Module/Admin.php:494
+msgid ""
+"Present a login box to visitors on the home page if no other content has "
+"been configured."
+msgstr "Presentar a los visitantes una casilla de identificación en la página de inicio, si no se ha configurado otro tipo de contenido."
+
+#: ../../Zotlabs/Module/Admin.php:495
+msgid "Enable context help"
+msgstr "Habilitar la ayuda contextual"
+
+#: ../../Zotlabs/Module/Admin.php:495
+msgid ""
+"Display contextual help for the current page when the help button is "
+"pressed."
+msgstr "Ver la ayuda contextual para la página actual cuando se pulse el botón de Ayuda."
+
+#: ../../Zotlabs/Module/Admin.php:497
+msgid "Directory Server URL"
+msgstr "URL del servidor de directorio"
+
+#: ../../Zotlabs/Module/Admin.php:497
+msgid "Default directory server"
+msgstr "Servidor de directorio predeterminado"
+
+#: ../../Zotlabs/Module/Admin.php:499
+msgid "Proxy user"
+msgstr "Usuario del proxy"
+
+#: ../../Zotlabs/Module/Admin.php:500
+msgid "Proxy URL"
+msgstr "Dirección del proxy"
+
+#: ../../Zotlabs/Module/Admin.php:501
+msgid "Network timeout"
+msgstr "Tiempo de espera de la red"
+
+#: ../../Zotlabs/Module/Admin.php:501
+msgid "Value is in seconds. Set to 0 for unlimited (not recommended)."
+msgstr "Valor en segundos. Poner a 0 para que no haya tiempo límite (no recomendado)"
+
+#: ../../Zotlabs/Module/Admin.php:502
+msgid "Delivery interval"
+msgstr "Intervalo de entrega"
+
+#: ../../Zotlabs/Module/Admin.php:502
+msgid ""
+"Delay background delivery processes by this many seconds to reduce system "
+"load. Recommend: 4-5 for shared hosts, 2-3 for virtual private servers. 0-1 "
+"for large dedicated servers."
+msgstr "Retrasar los procesos de transmisión en segundo plano por esta cantidad de segundos para reducir la carga del sistema. Recomendado: 4-5 para sitios compartidos, 2-3 para servidores virtuales privados, 0-1 para grandes servidores dedicados."
+
+#: ../../Zotlabs/Module/Admin.php:503
+msgid "Deliveries per process"
+msgstr "Intentos de envío por proceso"
+
+#: ../../Zotlabs/Module/Admin.php:503
+msgid ""
+"Number of deliveries to attempt in a single operating system process. Adjust"
+" if necessary to tune system performance. Recommend: 1-5."
+msgstr "Numero de envíos a intentar en un único proceso del sistema operativo. Ajustar si es necesario mejorar el rendimiento. Se recomienda: 1-5."
+
+#: ../../Zotlabs/Module/Admin.php:504
+msgid "Poll interval"
+msgstr "Intervalo máximo de tiempo entre dos mensajes sucesivos"
+
+#: ../../Zotlabs/Module/Admin.php:504
+msgid ""
+"Delay background polling processes by this many seconds to reduce system "
+"load. If 0, use delivery interval."
+msgstr "Retrasar el intervalo de envío en segundo plano, en esta cantidad de segundos, para reducir la carga del sistema. Si es 0, usar el intervalo de entrega."
+
+#: ../../Zotlabs/Module/Admin.php:505
+msgid "Maximum Load Average"
+msgstr "Carga media máxima"
+
+#: ../../Zotlabs/Module/Admin.php:505
+msgid ""
+"Maximum system load before delivery and poll processes are deferred - "
+"default 50."
+msgstr "Carga máxima del sistema antes de que los procesos de entrega y envío se hayan retardado - por defecto, 50."
+
+#: ../../Zotlabs/Module/Admin.php:506
+msgid "Expiration period in days for imported (grid/network) content"
+msgstr "Caducidad del contenido importado de otros sitios (en días)"
+
+#: ../../Zotlabs/Module/Admin.php:506
+msgid "0 for no expiration of imported content"
+msgstr "0 para que no caduque el contenido importado"
+
+#: ../../Zotlabs/Module/Admin.php:643 ../../Zotlabs/Module/Admin.php:644
+#: ../../Zotlabs/Module/Settings.php:720
+msgid "Off"
+msgstr "Desactivado"
+
+#: ../../Zotlabs/Module/Admin.php:643 ../../Zotlabs/Module/Admin.php:644
+#: ../../Zotlabs/Module/Settings.php:720
+msgid "On"
+msgstr "Activado"
+
+#: ../../Zotlabs/Module/Admin.php:644
+#, php-format
+msgid "Lock feature %s"
+msgstr "Bloquear la funcionalidad %s"
+
+#: ../../Zotlabs/Module/Admin.php:652
+msgid "Manage Additional Features"
+msgstr "Gestionar las funcionalidades"
+
+#: ../../Zotlabs/Module/Admin.php:669
+msgid "No server found"
+msgstr "Servidor no encontrado"
+
+#: ../../Zotlabs/Module/Admin.php:676 ../../Zotlabs/Module/Admin.php:1006
+msgid "ID"
+msgstr "ID"
+
+#: ../../Zotlabs/Module/Admin.php:676
+msgid "for channel"
+msgstr "por canal"
+
+#: ../../Zotlabs/Module/Admin.php:676
+msgid "on server"
+msgstr "en el servidor"
+
+#: ../../Zotlabs/Module/Admin.php:676 ../../Zotlabs/Module/Connections.php:270
+msgid "Status"
+msgstr "Estado"
+
+#: ../../Zotlabs/Module/Admin.php:678
+msgid "Server"
+msgstr "Servidor"
+
+#: ../../Zotlabs/Module/Admin.php:718 ../../include/widgets.php:1337
+msgid "Security"
+msgstr "Seguridad"
+
+#: ../../Zotlabs/Module/Admin.php:720
+msgid "Block public"
+msgstr "Bloquear páginas públicas"
+
+#: ../../Zotlabs/Module/Admin.php:720
+msgid ""
+"Check to block public access to all otherwise public personal pages on this "
+"site unless you are currently authenticated."
+msgstr "Habilitar para impedir ver las páginas personales de este sitio a quien no esté actualmente autenticado."
+
+#: ../../Zotlabs/Module/Admin.php:721
+msgid "Allow communications only from these sites"
+msgstr "Permitir la comunicación solo desde estos sitios"
+
+#: ../../Zotlabs/Module/Admin.php:721
+msgid ""
+"One site per line. Leave empty to allow communication from anywhere by "
+"default"
+msgstr "Un sitio por línea. Dejar en blanco para permitir por defecto la comunicación desde cualquiera"
+
+#: ../../Zotlabs/Module/Admin.php:722
+msgid "Block communications from these sites"
+msgstr "Bloquear la comunicación desde estos sitios"
+
+#: ../../Zotlabs/Module/Admin.php:723
+msgid "Allow communications only from these channels"
+msgstr "Permitir la comunicación solo desde estos canales"
+
+#: ../../Zotlabs/Module/Admin.php:723
+msgid ""
+"One channel (hash) per line. Leave empty to allow from any channel by "
+"default"
+msgstr "Un canal (hash) por línea. Dejar en blanco para permitir por defecto la comunicación desde cualquiera"
+
+#: ../../Zotlabs/Module/Admin.php:724
+msgid "Block communications from these channels"
+msgstr "Bloquear la comunicación desde estos canales"
+
+#: ../../Zotlabs/Module/Admin.php:725
+msgid "Allow embedded HTML content only from these domains"
+msgstr "Permitir contenido con HTML incorporado solo desde estos dominios"
+
+#: ../../Zotlabs/Module/Admin.php:725
+msgid "One site per line. Leave empty to allow from any site by default"
+msgstr "Un sitio por línea. Dejar en blanco para permitirlo por defecto desde cualquier sitio"
+
+#: ../../Zotlabs/Module/Admin.php:726
+msgid "Block embedded HTML from these domains"
+msgstr "Bloquear contenido con HTML incorporado desde estos dominios"
+
+#: ../../Zotlabs/Module/Admin.php:728
+msgid "Cooperative embed security"
+msgstr "Seguridad cooperativa incorporada"
+
+#: ../../Zotlabs/Module/Admin.php:728
+msgid "Enable to share embed security with other compatible sites/hubs"
+msgstr "Habilitar la compartición de seguridad incorporada con otros sitios compatibles"
+
+#: ../../Zotlabs/Module/Admin.php:743
+msgid "Update has been marked successful"
+msgstr "La actualización ha sido marcada como exitosa"
+
+#: ../../Zotlabs/Module/Admin.php:753
+#, php-format
+msgid "Executing %s failed. Check system logs."
+msgstr "La ejecución de %s ha fallado. Mirar en los informes del sistema."
+
+#: ../../Zotlabs/Module/Admin.php:756
+#, php-format
+msgid "Update %s was successfully applied."
+msgstr "La actualización de %s se ha realizado exitosamente."
+
+#: ../../Zotlabs/Module/Admin.php:760
+#, php-format
+msgid "Update %s did not return a status. Unknown if it succeeded."
+msgstr "La actualización de %s no ha devuelto ningún estado. No se sabe si ha tenido éxito."
+
+#: ../../Zotlabs/Module/Admin.php:763
+#, php-format
+msgid "Update function %s could not be found."
+msgstr "No se encuentra la función de actualización de %s."
+
+#: ../../Zotlabs/Module/Admin.php:779
+msgid "No failed updates."
+msgstr "No ha fallado ninguna actualización."
+
+#: ../../Zotlabs/Module/Admin.php:783
+msgid "Failed Updates"
+msgstr "Han fallado las actualizaciones"
+
+#: ../../Zotlabs/Module/Admin.php:785
+msgid "Mark success (if update was manually applied)"
+msgstr "Marcar como exitosa (si la actualización se ha hecho manualmente)"
+
+#: ../../Zotlabs/Module/Admin.php:786
+msgid "Attempt to execute this update step automatically"
+msgstr "Intentar ejecutar este paso de actualización automáticamente"
+
+#: ../../Zotlabs/Module/Admin.php:817
+msgid "Queue Statistics"
+msgstr "Estadísticas de la cola"
+
+#: ../../Zotlabs/Module/Admin.php:818
+msgid "Total Entries"
+msgstr "Total de entradas"
+
+#: ../../Zotlabs/Module/Admin.php:819
+msgid "Priority"
+msgstr "Prioridad"
+
+#: ../../Zotlabs/Module/Admin.php:820
+msgid "Destination URL"
+msgstr "Dirección de destino"
+
+#: ../../Zotlabs/Module/Admin.php:821
+msgid "Mark hub permanently offline"
+msgstr "Marcar el servidor como permanentemente fuera de línea"
+
+#: ../../Zotlabs/Module/Admin.php:822
+msgid "Empty queue for this hub"
+msgstr "Vaciar la cola para este servidor"
+
+#: ../../Zotlabs/Module/Admin.php:823
+msgid "Last known contact"
+msgstr "Último contacto conocido"
+
+#: ../../Zotlabs/Module/Admin.php:859
+#, php-format
+msgid "%s account blocked/unblocked"
+msgid_plural "%s account blocked/unblocked"
+msgstr[0] "%s cuenta bloqueada/desbloqueada"
+msgstr[1] "%s cuenta bloqueada/desbloqueada"
+
+#: ../../Zotlabs/Module/Admin.php:867
+#, php-format
+msgid "%s account deleted"
+msgid_plural "%s accounts deleted"
+msgstr[0] "%s cuentas eliminadas"
+msgstr[1] "%s cuentas eliminadas"
+
+#: ../../Zotlabs/Module/Admin.php:903
+msgid "Account not found"
+msgstr "Cuenta no encontrada"
+
+#: ../../Zotlabs/Module/Admin.php:915
+#, php-format
+msgid "Account '%s' deleted"
+msgstr "La cuenta '%s' ha sido eliminada"
+
+#: ../../Zotlabs/Module/Admin.php:923
+#, php-format
+msgid "Account '%s' blocked"
+msgstr "La cuenta '%s' ha sido bloqueada"
+
+#: ../../Zotlabs/Module/Admin.php:931
+#, php-format
+msgid "Account '%s' unblocked"
+msgstr "La cuenta '%s' ha sido desbloqueada"
+
+#: ../../Zotlabs/Module/Admin.php:993 ../../Zotlabs/Module/Admin.php:1005
+msgid "Users"
+msgstr "Usuarios"
+
+#: ../../Zotlabs/Module/Admin.php:995 ../../Zotlabs/Module/Admin.php:1159
+msgid "select all"
+msgstr "seleccionar todo"
+
+#: ../../Zotlabs/Module/Admin.php:996
+msgid "User registrations waiting for confirm"
+msgstr "Registros de usuario en espera de aprobación"
+
+#: ../../Zotlabs/Module/Admin.php:997
+msgid "Request date"
+msgstr "Fecha de solicitud"
+
+#: ../../Zotlabs/Module/Admin.php:997 ../../Zotlabs/Module/Admin.php:1006
+#: ../../Zotlabs/Module/Id.php:17 ../../Zotlabs/Module/Id.php:18
+#: ../../include/contact_selectors.php:81 ../../boot.php:1604
+msgid "Email"
+msgstr "Correo electrónico"
+
+#: ../../Zotlabs/Module/Admin.php:998
+msgid "No registrations."
+msgstr "Sin registros."
+
+#: ../../Zotlabs/Module/Admin.php:999 ../../Zotlabs/Module/Connections.php:275
+msgid "Approve"
+msgstr "Aprobar"
+
+#: ../../Zotlabs/Module/Admin.php:1000
+msgid "Deny"
+msgstr "Rechazar"
+
+#: ../../Zotlabs/Module/Admin.php:1002 ../../Zotlabs/Module/Connedit.php:541
+msgid "Block"
+msgstr "Bloquear"
+
+#: ../../Zotlabs/Module/Admin.php:1003 ../../Zotlabs/Module/Connedit.php:541
+msgid "Unblock"
+msgstr "Desbloquear"
+
+#: ../../Zotlabs/Module/Admin.php:1006 ../../include/group.php:267
+msgid "All Channels"
+msgstr "Todos los canales"
+
+#: ../../Zotlabs/Module/Admin.php:1006
+msgid "Register date"
+msgstr "Fecha de registro"
+
+#: ../../Zotlabs/Module/Admin.php:1006
+msgid "Last login"
+msgstr "Último acceso"
+
+#: ../../Zotlabs/Module/Admin.php:1006
+msgid "Expires"
+msgstr "Caduca"
+
+#: ../../Zotlabs/Module/Admin.php:1006
+msgid "Service Class"
+msgstr "Clase de servicio"
+
+#: ../../Zotlabs/Module/Admin.php:1008
+msgid ""
+"Selected accounts will be deleted!\\n\\nEverything these accounts had posted"
+" on this site will be permanently deleted!\\n\\nAre you sure?"
+msgstr "¡Las cuentas seleccionadas van a ser eliminadas!\\n\\n¡Todo lo que estas cuentas han publicado en este sitio será borrado de forma permanente!\\n\\n¿Está seguro de querer hacerlo?"
+
+#: ../../Zotlabs/Module/Admin.php:1009
+msgid ""
+"The account {0} will be deleted!\\n\\nEverything this account has posted on "
+"this site will be permanently deleted!\\n\\nAre you sure?"
+msgstr "¡La cuenta {0} va a ser eliminada!\\n\\n¡Todo lo que esta cuenta ha publicado en este sitio será borrado de forma permanente!\\n\\n¿Está seguro de querer hacerlo?"
+
+#: ../../Zotlabs/Module/Admin.php:1045
+#, php-format
+msgid "%s channel censored/uncensored"
+msgid_plural "%s channels censored/uncensored"
+msgstr[0] "%s canales censurados/no censurados"
+msgstr[1] "%s canales censurados/no censurados"
+
+#: ../../Zotlabs/Module/Admin.php:1054
+#, php-format
+msgid "%s channel code allowed/disallowed"
+msgid_plural "%s channels code allowed/disallowed"
+msgstr[0] "%s código permitido/no permitido al canal"
+msgstr[1] "%s código permitido/no permitido al canal"
+
+#: ../../Zotlabs/Module/Admin.php:1061
+#, php-format
+msgid "%s channel deleted"
+msgid_plural "%s channels deleted"
+msgstr[0] "%s canales eliminados"
+msgstr[1] "%s canales eliminados"
+
+#: ../../Zotlabs/Module/Admin.php:1081
+msgid "Channel not found"
+msgstr "Canal no encontrado"
+
+#: ../../Zotlabs/Module/Admin.php:1092
+#, php-format
+msgid "Channel '%s' deleted"
+msgstr "Canal '%s' eliminado"
+
+#: ../../Zotlabs/Module/Admin.php:1104
+#, php-format
+msgid "Channel '%s' censored"
+msgstr "Canal '%s' censurado"
+
+#: ../../Zotlabs/Module/Admin.php:1104
+#, php-format
+msgid "Channel '%s' uncensored"
+msgstr "Canal '%s' no censurado"
+
+#: ../../Zotlabs/Module/Admin.php:1115
+#, php-format
+msgid "Channel '%s' code allowed"
+msgstr "Código permitido al canal '%s'"
+
+#: ../../Zotlabs/Module/Admin.php:1115
+#, php-format
+msgid "Channel '%s' code disallowed"
+msgstr "Código no permitido al canal '%s'"
+
+#: ../../Zotlabs/Module/Admin.php:1157 ../../include/widgets.php:1336
+msgid "Channels"
+msgstr "Canales"
+
+#: ../../Zotlabs/Module/Admin.php:1161
+msgid "Censor"
+msgstr "Censurar"
+
+#: ../../Zotlabs/Module/Admin.php:1162
+msgid "Uncensor"
+msgstr "No censurar"
+
+#: ../../Zotlabs/Module/Admin.php:1163
+msgid "Allow Code"
+msgstr "Permitir código"
+
+#: ../../Zotlabs/Module/Admin.php:1164
+msgid "Disallow Code"
+msgstr "No permitir código"
+
+#: ../../Zotlabs/Module/Admin.php:1165 ../../include/conversation.php:1629
+msgid "Channel"
+msgstr "Canal"
+
+#: ../../Zotlabs/Module/Admin.php:1166
+msgid "UID"
+msgstr "UID"
+
+#: ../../Zotlabs/Module/Admin.php:1166 ../../Zotlabs/Module/Locs.php:118
+#: ../../Zotlabs/Module/Profiles.php:469
+msgid "Address"
+msgstr "Dirección"
+
+#: ../../Zotlabs/Module/Admin.php:1168
+msgid ""
+"Selected channels will be deleted!\\n\\nEverything that was posted in these "
+"channels on this site will be permanently deleted!\\n\\nAre you sure?"
+msgstr "Los canales seleccionados se eliminarán!\\n\\nTodo lo publicado por estos canales en este sitio se borrarán definitivamente!\\n\\n¿Está seguro de querer hacerlo?"
+
+#: ../../Zotlabs/Module/Admin.php:1169
+msgid ""
+"The channel {0} will be deleted!\\n\\nEverything that was posted in this "
+"channel on this site will be permanently deleted!\\n\\nAre you sure?"
+msgstr "El canal {0} va a ser eliminado!\\n\\nTodo lo publicado por el canal en este sitio se borrará definitivamente!\\n\\n¿Está seguro de querer hacerlo?"
+
+#: ../../Zotlabs/Module/Admin.php:1226
+#, php-format
+msgid "Plugin %s disabled."
+msgstr "Extensión %s desactivada."
+
+#: ../../Zotlabs/Module/Admin.php:1230
+#, php-format
+msgid "Plugin %s enabled."
+msgstr "Extensión %s activada."
+
+#: ../../Zotlabs/Module/Admin.php:1240 ../../Zotlabs/Module/Admin.php:1466
+msgid "Disable"
+msgstr "Desactivar"
+
+#: ../../Zotlabs/Module/Admin.php:1243 ../../Zotlabs/Module/Admin.php:1468
+msgid "Enable"
+msgstr "Activar"
+
+#: ../../Zotlabs/Module/Admin.php:1272 ../../Zotlabs/Module/Admin.php:1333
+#: ../../include/widgets.php:1339
+msgid "Plugins"
+msgstr "Extensiones"
+
+#: ../../Zotlabs/Module/Admin.php:1273 ../../Zotlabs/Module/Admin.php:1495
+msgid "Toggle"
+msgstr "Cambiar"
+
+#: ../../Zotlabs/Module/Admin.php:1274 ../../Zotlabs/Module/Admin.php:1496
+#: ../../include/apps.php:134 ../../include/widgets.php:589
+#: ../../include/nav.php:211
+msgid "Settings"
+msgstr "Ajustes"
+
+#: ../../Zotlabs/Module/Admin.php:1281 ../../Zotlabs/Module/Admin.php:1505
+msgid "Author: "
+msgstr "Autor:"
+
+#: ../../Zotlabs/Module/Admin.php:1282 ../../Zotlabs/Module/Admin.php:1506
+msgid "Maintainer: "
+msgstr "Mantenedor:"
+
+#: ../../Zotlabs/Module/Admin.php:1283
+msgid "Minimum project version: "
+msgstr "Versión mínima del proyecto:"
+
+#: ../../Zotlabs/Module/Admin.php:1284
+msgid "Maximum project version: "
+msgstr "Versión máxima del proyecto:"
+
+#: ../../Zotlabs/Module/Admin.php:1285
+msgid "Minimum PHP version: "
+msgstr "Versión mínima de PHP:"
+
+#: ../../Zotlabs/Module/Admin.php:1286
+msgid "Requires: "
+msgstr "Se requiere:"
+
+#: ../../Zotlabs/Module/Admin.php:1287 ../../Zotlabs/Module/Admin.php:1338
+msgid "Disabled - version incompatibility"
+msgstr "Deshabilitado - versiones incompatibles"
+
+#: ../../Zotlabs/Module/Admin.php:1431
+msgid "No themes found."
+msgstr "No se han encontrado temas."
+
+#: ../../Zotlabs/Module/Admin.php:1487
+msgid "Screenshot"
+msgstr "Instantánea de pantalla"
+
+#: ../../Zotlabs/Module/Admin.php:1494 ../../Zotlabs/Module/Admin.php:1528
+#: ../../include/widgets.php:1340
+msgid "Themes"
+msgstr "Temas"
+
+#: ../../Zotlabs/Module/Admin.php:1533
+msgid "[Experimental]"
+msgstr "[Experimental]"
+
+#: ../../Zotlabs/Module/Admin.php:1534
+msgid "[Unsupported]"
+msgstr "[No soportado]"
+
+#: ../../Zotlabs/Module/Admin.php:1558
+msgid "Log settings updated."
+msgstr "Actualizado el informe de configuraciones."
+
+#: ../../Zotlabs/Module/Admin.php:1613 ../../include/widgets.php:1361
+#: ../../include/widgets.php:1371
+msgid "Logs"
+msgstr "Informes"
+
+#: ../../Zotlabs/Module/Admin.php:1615
+msgid "Clear"
+msgstr "Vaciar"
+
+#: ../../Zotlabs/Module/Admin.php:1621
+msgid "Debugging"
+msgstr "Depuración"
+
+#: ../../Zotlabs/Module/Admin.php:1622
+msgid "Log file"
+msgstr "Fichero de informe"
+
+#: ../../Zotlabs/Module/Admin.php:1622
+msgid ""
+"Must be writable by web server. Relative to your Red top-level directory."
+msgstr "Debe tener permisos de escritura por el servidor web. La ruta es relativa al directorio de instalación de Hubzilla."
+
+#: ../../Zotlabs/Module/Admin.php:1623
+msgid "Log level"
+msgstr "Nivel de depuración"
+
+#: ../../Zotlabs/Module/Admin.php:1690
+msgid "New Profile Field"
+msgstr "Nuevo campo en el perfil"
+
+#: ../../Zotlabs/Module/Admin.php:1691 ../../Zotlabs/Module/Admin.php:1711
+msgid "Field nickname"
+msgstr "Alias del campo"
+
+#: ../../Zotlabs/Module/Admin.php:1691 ../../Zotlabs/Module/Admin.php:1711
+msgid "System name of field"
+msgstr "Nombre del campo en el sistema"
+
+#: ../../Zotlabs/Module/Admin.php:1692 ../../Zotlabs/Module/Admin.php:1712
+msgid "Input type"
+msgstr "Tipo de entrada"
+
+#: ../../Zotlabs/Module/Admin.php:1693 ../../Zotlabs/Module/Admin.php:1713
+msgid "Field Name"
+msgstr "Nombre del campo"
+
+#: ../../Zotlabs/Module/Admin.php:1693 ../../Zotlabs/Module/Admin.php:1713
+msgid "Label on profile pages"
+msgstr "Etiqueta a mostrar en la página del perfil"
+
+#: ../../Zotlabs/Module/Admin.php:1694 ../../Zotlabs/Module/Admin.php:1714
+msgid "Help text"
+msgstr "Texto de ayuda"
+
+#: ../../Zotlabs/Module/Admin.php:1694 ../../Zotlabs/Module/Admin.php:1714
+msgid "Additional info (optional)"
+msgstr "Información adicional (opcional)"
+
+#: ../../Zotlabs/Module/Admin.php:1695 ../../Zotlabs/Module/Admin.php:1715
+#: ../../Zotlabs/Module/Filer.php:53 ../../Zotlabs/Module/Rbmark.php:32
+#: ../../Zotlabs/Module/Rbmark.php:104 ../../include/widgets.php:201
+#: ../../include/text.php:905 ../../include/text.php:917
+msgid "Save"
+msgstr "Guardar"
+
+#: ../../Zotlabs/Module/Admin.php:1704
+msgid "Field definition not found"
+msgstr "Definición del campo no encontrada"
+
+#: ../../Zotlabs/Module/Admin.php:1710
+msgid "Edit Profile Field"
+msgstr "Modificar el campo del perfil"
+
+#: ../../Zotlabs/Module/Admin.php:1768 ../../include/widgets.php:1342
+msgid "Profile Fields"
+msgstr "Campos del perfil"
+
+#: ../../Zotlabs/Module/Admin.php:1769
+msgid "Basic Profile Fields"
+msgstr "Campos básicos del perfil"
+
+#: ../../Zotlabs/Module/Admin.php:1770
+msgid "Advanced Profile Fields"
+msgstr "Campos avanzados del perfil"
+
+#: ../../Zotlabs/Module/Admin.php:1770
+msgid "(In addition to basic fields)"
+msgstr "(Además de los campos básicos)"
+
+#: ../../Zotlabs/Module/Admin.php:1772
+msgid "All available fields"
+msgstr "Todos los campos disponibles"
+
+#: ../../Zotlabs/Module/Admin.php:1773
+msgid "Custom Fields"
+msgstr "Campos personalizados"
+
+#: ../../Zotlabs/Module/Admin.php:1777
+msgid "Create Custom Field"
+msgstr "Crear un campo personalizado"
+
+#: ../../Zotlabs/Module/Api.php:61 ../../Zotlabs/Module/Api.php:85
+msgid "Authorize application connection"
+msgstr "Autorizar una conexión de aplicación"
+
+#: ../../Zotlabs/Module/Api.php:62
+msgid "Return to your app and insert this Securty Code:"
+msgstr "Volver a su aplicación e introducir este código de seguridad:"
+
+#: ../../Zotlabs/Module/Api.php:72
+msgid "Please login to continue."
+msgstr "Por favor inicie sesión para continuar."
+
+#: ../../Zotlabs/Module/Api.php:87
+msgid ""
+"Do you want to authorize this application to access your posts and contacts,"
+" and/or create new posts for you?"
+msgstr "¿Desea autorizar a esta aplicación a acceder a sus publicaciones y contactos, y/o crear nuevas publicaciones por usted?"
+
+#: ../../Zotlabs/Module/Appman.php:32 ../../Zotlabs/Module/Appman.php:48
+msgid "App installed."
+msgstr "Aplicación instalada."
+
+#: ../../Zotlabs/Module/Appman.php:41
+msgid "Malformed app."
+msgstr "Aplicación con errores"
+
+#: ../../Zotlabs/Module/Appman.php:84
+msgid "Embed code"
+msgstr "Código incorporado"
+
+#: ../../Zotlabs/Module/Appman.php:90
+msgid "Edit App"
+msgstr "Modificar la aplicación"
+
+#: ../../Zotlabs/Module/Appman.php:90
+msgid "Create App"
+msgstr "Crear una aplicación"
+
+#: ../../Zotlabs/Module/Appman.php:95
+msgid "Name of app"
+msgstr "Nombre de la aplicación"
+
+#: ../../Zotlabs/Module/Appman.php:95 ../../Zotlabs/Module/Appman.php:96
+#: ../../Zotlabs/Module/Events.php:448 ../../Zotlabs/Module/Events.php:453
+#: ../../Zotlabs/Module/Profiles.php:712 ../../Zotlabs/Module/Profiles.php:716
+#: ../../include/datetime.php:246
+msgid "Required"
+msgstr "Obligatorio"
+
+#: ../../Zotlabs/Module/Appman.php:96
+msgid "Location (URL) of app"
+msgstr "Dirección (URL) de la aplicación"
+
+#: ../../Zotlabs/Module/Appman.php:97 ../../Zotlabs/Module/Events.php:461
+#: ../../Zotlabs/Module/Rbmark.php:101
+msgid "Description"
+msgstr "Descripción"
+
+#: ../../Zotlabs/Module/Appman.php:98
+msgid "Photo icon URL"
+msgstr "Dirección del icono"
+
+#: ../../Zotlabs/Module/Appman.php:98
+msgid "80 x 80 pixels - optional"
+msgstr "80 x 80 pixels - opcional"
+
+#: ../../Zotlabs/Module/Appman.php:99
+msgid "Version ID"
+msgstr "Versión"
+
+#: ../../Zotlabs/Module/Appman.php:100
+msgid "Price of app"
+msgstr "Precio de la aplicación"
+
+#: ../../Zotlabs/Module/Appman.php:101
+msgid "Location (URL) to purchase app"
+msgstr "Dirección (URL) donde adquirir la aplicación"
+
+#: ../../Zotlabs/Module/Apps.php:40 ../../include/widgets.php:102
+#: ../../include/nav.php:165
+msgid "Apps"
+msgstr "Aplicaciones"
+
+#: ../../Zotlabs/Module/Attach.php:13
+msgid "Item not available."
+msgstr "Elemento no disponible"
+
+#: ../../Zotlabs/Module/Block.php:31 ../../Zotlabs/Module/Page.php:40
+msgid "Invalid item."
+msgstr "Elemento no válido."
+
+#: ../../Zotlabs/Module/Block.php:43 ../../Zotlabs/Module/Cal.php:65
+#: ../../Zotlabs/Module/Page.php:56 ../../Zotlabs/Module/Wall_upload.php:33
+msgid "Channel not found."
+msgstr "Canal no encontrado."
+
+#: ../../Zotlabs/Module/Blocks.php:99 ../../Zotlabs/Module/Blocks.php:154
+msgid "Block Name"
+msgstr "Nombre del bloque"
+
+#: ../../Zotlabs/Module/Blocks.php:153 ../../include/text.php:2278
+msgid "Blocks"
+msgstr "Bloques"
+
+#: ../../Zotlabs/Module/Blocks.php:155
+msgid "Block Title"
+msgstr "Título del bloque"
+
+#: ../../Zotlabs/Module/Blocks.php:156 ../../Zotlabs/Module/Layouts.php:186
+#: ../../Zotlabs/Module/Menu.php:114 ../../Zotlabs/Module/Webpages.php:200
+#: ../../include/page_widgets.php:44
+msgid "Created"
+msgstr "Creado"
+
+#: ../../Zotlabs/Module/Blocks.php:157 ../../Zotlabs/Module/Layouts.php:187
+#: ../../Zotlabs/Module/Menu.php:115 ../../Zotlabs/Module/Webpages.php:201
+#: ../../include/page_widgets.php:45
+msgid "Edited"
+msgstr "Editado"
+
+#: ../../Zotlabs/Module/Blocks.php:160 ../../Zotlabs/Module/Layouts.php:189
+#: ../../Zotlabs/Module/Photos.php:1071 ../../Zotlabs/Module/Webpages.php:190
+#: ../../include/conversation.php:1209
+msgid "Share"
+msgstr "Compartir"
+
+#: ../../Zotlabs/Module/Blocks.php:165 ../../Zotlabs/Module/Layouts.php:193
+#: ../../Zotlabs/Module/Pubsites.php:46 ../../Zotlabs/Module/Webpages.php:195
+#: ../../include/page_widgets.php:39
+msgid "View"
+msgstr "Ver"
+
+#: ../../Zotlabs/Module/Bookmarks.php:53
+msgid "Bookmark added"
+msgstr "Marcador añadido"
+
+#: ../../Zotlabs/Module/Bookmarks.php:75
+msgid "My Bookmarks"
+msgstr "Mis marcadores"
+
+#: ../../Zotlabs/Module/Bookmarks.php:86
+msgid "My Connections Bookmarks"
+msgstr "Marcadores de mis conexiones"
+
+#: ../../Zotlabs/Module/Cal.php:41 ../../Zotlabs/Module/Photos.php:45
+#: ../../include/js_strings.php:13
+msgid "everybody"
+msgstr "cualquiera"
+
+#: ../../Zotlabs/Module/Cal.php:72
+msgid "Permissions denied."
+msgstr "Permisos denegados."
+
+#: ../../Zotlabs/Module/Cal.php:262 ../../Zotlabs/Module/Events.php:585
+msgid "l, F j"
+msgstr "l j F"
+
+#: ../../Zotlabs/Module/Cal.php:311 ../../Zotlabs/Module/Events.php:634
+#: ../../include/text.php:1743
+msgid "Link to Source"
+msgstr "Enlazar con la entrada en su ubicación original"
+
+#: ../../Zotlabs/Module/Cal.php:334 ../../Zotlabs/Module/Events.php:662
+msgid "Edit Event"
+msgstr "Editar el evento"
+
+#: ../../Zotlabs/Module/Cal.php:334 ../../Zotlabs/Module/Events.php:662
+msgid "Create Event"
+msgstr "Crear un evento"
+
+#: ../../Zotlabs/Module/Cal.php:335 ../../Zotlabs/Module/Cal.php:342
+#: ../../Zotlabs/Module/Events.php:663 ../../Zotlabs/Module/Events.php:670
+#: ../../Zotlabs/Module/Photos.php:948
+msgid "Previous"
+msgstr "Anterior"
+
+#: ../../Zotlabs/Module/Cal.php:336 ../../Zotlabs/Module/Cal.php:343
+#: ../../Zotlabs/Module/Events.php:664 ../../Zotlabs/Module/Events.php:671
+#: ../../Zotlabs/Module/Photos.php:957 ../../Zotlabs/Module/Setup.php:290
+msgid "Next"
+msgstr "Siguiente"
+
+#: ../../Zotlabs/Module/Cal.php:337 ../../Zotlabs/Module/Events.php:665
+#: ../../include/widgets.php:706
+msgid "Export"
+msgstr "Exportar"
+
+#: ../../Zotlabs/Module/Cal.php:340 ../../Zotlabs/Module/Events.php:668
+#: ../../include/widgets.php:707
+msgid "Import"
+msgstr "Importar"
+
+#: ../../Zotlabs/Module/Cal.php:344 ../../Zotlabs/Module/Events.php:672
+msgid "Today"
+msgstr "Hoy"
+
+#: ../../Zotlabs/Module/Channel.php:28 ../../Zotlabs/Module/Chat.php:23
+msgid "You must be logged in to see this page."
+msgstr "Debe haber iniciado sesión para poder ver esta página."
+
+#: ../../Zotlabs/Module/Channel.php:40
+msgid "Posts and comments"
+msgstr "Publicaciones y comentarios"
+
+#: ../../Zotlabs/Module/Channel.php:41
+msgid "Only posts"
+msgstr "Solo publicaciones"
+
+#: ../../Zotlabs/Module/Channel.php:101
+msgid "Insufficient permissions. Request redirected to profile page."
+msgstr "Permisos insuficientes. Petición redirigida a la página del perfil."
+
+#: ../../Zotlabs/Module/Channel.php:135 ../../Zotlabs/Module/Network.php:173
+#: ../../Zotlabs/Module/Rpost.php:118
+msgid "Public"
+msgstr "Público"
+
+#: ../../Zotlabs/Module/Chat.php:179
+msgid "Room not found"
+msgstr "Sala no encontrada"
+
+#: ../../Zotlabs/Module/Chat.php:195
+msgid "Leave Room"
+msgstr "Abandonar la sala"
+
+#: ../../Zotlabs/Module/Chat.php:196
+msgid "Delete Room"
+msgstr "Eliminar esta sala"
+
+#: ../../Zotlabs/Module/Chat.php:197
+msgid "I am away right now"
+msgstr "Estoy ausente momentáneamente"
+
+#: ../../Zotlabs/Module/Chat.php:198
+msgid "I am online"
+msgstr "Estoy conectado/a"
+
+#: ../../Zotlabs/Module/Chat.php:200
+msgid "Bookmark this room"
+msgstr "Añadir esta sala a Marcadores"
+
+#: ../../Zotlabs/Module/Chat.php:203 ../../Zotlabs/Module/Mail.php:206
+#: ../../Zotlabs/Module/Mail.php:320 ../../include/conversation.php:1170
+msgid "Please enter a link URL:"
+msgstr "Por favor, introduzca la dirección del enlace:"
+
+#: ../../Zotlabs/Module/Chat.php:204 ../../Zotlabs/Module/Editpost.php:163
+#: ../../Zotlabs/Module/Mail.php:259 ../../Zotlabs/Module/Mail.php:389
+#: ../../include/ItemObject.php:715 ../../include/conversation.php:1274
+msgid "Encrypt text"
+msgstr "Cifrar texto"
+
+#: ../../Zotlabs/Module/Chat.php:205 ../../Zotlabs/Module/Editblock.php:149
+#: ../../Zotlabs/Module/Editlayout.php:147
+#: ../../Zotlabs/Module/Editpost.php:126
+#: ../../Zotlabs/Module/Editwebpage.php:189 ../../Zotlabs/Module/Mail.php:253
+#: ../../Zotlabs/Module/Mail.php:383 ../../include/conversation.php:1225
+msgid "Insert web link"
+msgstr "Insertar enlace web"
+
+#: ../../Zotlabs/Module/Chat.php:216
+msgid "Feature disabled."
+msgstr "Funcionalidad deshabilitada."
+
+#: ../../Zotlabs/Module/Chat.php:230
+msgid "New Chatroom"
+msgstr "Nueva sala de chat"
+
+#: ../../Zotlabs/Module/Chat.php:231
+msgid "Chatroom name"
+msgstr "Nombre de la sala de chat"
+
+#: ../../Zotlabs/Module/Chat.php:232
+msgid "Expiration of chats (minutes)"
+msgstr "Caducidad de los mensajes en los chats (en minutos)"
+
+#: ../../Zotlabs/Module/Chat.php:233 ../../Zotlabs/Module/Filestorage.php:151
+#: ../../Zotlabs/Module/Photos.php:670 ../../Zotlabs/Module/Photos.php:1044
+#: ../../Zotlabs/Module/Thing.php:313 ../../Zotlabs/Module/Thing.php:359
+#: ../../include/acl_selectors.php:251
+msgid "Permissions"
+msgstr "Permisos"
+
+#: ../../Zotlabs/Module/Chat.php:244
+#, php-format
+msgid "%1$s's Chatrooms"
+msgstr "Salas de chat de %1$s"
+
+#: ../../Zotlabs/Module/Chat.php:249
+msgid "No chatrooms available"
+msgstr "No hay salas de chat disponibles"
+
+#: ../../Zotlabs/Module/Chat.php:250 ../../Zotlabs/Module/Manage.php:141
+#: ../../Zotlabs/Module/Profiles.php:781
+msgid "Create New"
+msgstr "Crear"
+
+#: ../../Zotlabs/Module/Chat.php:253
+msgid "Expiration"
+msgstr "Caducidad"
+
+#: ../../Zotlabs/Module/Chat.php:254
+msgid "min"
+msgstr "min"
+
+#: ../../Zotlabs/Module/Chatsvc.php:115
+msgid "Away"
+msgstr "Ausente"
+
+#: ../../Zotlabs/Module/Chatsvc.php:120
+msgid "Online"
+msgstr "Conectado/a"
+
+#: ../../Zotlabs/Module/Common.php:14
+msgid "No channel."
+msgstr "Ningún canal."
+
+#: ../../Zotlabs/Module/Common.php:43
+msgid "Common connections"
+msgstr "Conexiones comunes"
+
+#: ../../Zotlabs/Module/Common.php:48
+msgid "No connections in common."
+msgstr "Ninguna conexión en común."
+
+#: ../../Zotlabs/Module/Connect.php:60 ../../Zotlabs/Module/Connect.php:108
+msgid "Continue"
+msgstr "Continuar"
+
+#: ../../Zotlabs/Module/Connect.php:89
+msgid "Premium Channel Setup"
+msgstr "Configuración del canal premium"
+
+#: ../../Zotlabs/Module/Connect.php:91
+msgid "Enable premium channel connection restrictions"
+msgstr "Habilitar restricciones de conexión del canal premium"
+
+#: ../../Zotlabs/Module/Connect.php:92
+msgid ""
+"Please enter your restrictions or conditions, such as paypal receipt, usage "
+"guidelines, etc."
+msgstr "Por favor introduzca sus restricciones o condiciones, como recibo de paypal, normas de uso, etc."
+
+#: ../../Zotlabs/Module/Connect.php:94 ../../Zotlabs/Module/Connect.php:114
+msgid ""
+"This channel may require additional steps or acknowledgement of the "
+"following conditions prior to connecting:"
+msgstr "Este canal puede requerir antes de conectar unos pasos adicionales o el conocimiento de las siguientes condiciones:"
+
+#: ../../Zotlabs/Module/Connect.php:95
+msgid ""
+"Potential connections will then see the following text before proceeding:"
+msgstr "Las posibles conexiones verán, por tanto, el siguiente texto antes de proceder:"
+
+#: ../../Zotlabs/Module/Connect.php:96 ../../Zotlabs/Module/Connect.php:117
+msgid ""
+"By continuing, I certify that I have complied with any instructions provided"
+" on this page."
+msgstr "Al continuar, certifico que he cumplido con todas las instrucciones proporcionadas en esta página."
+
+#: ../../Zotlabs/Module/Connect.php:105
+msgid "(No specific instructions have been provided by the channel owner.)"
+msgstr "(No ha sido proporcionada ninguna instrucción específica por el propietario del canal.)"
+
+#: ../../Zotlabs/Module/Connect.php:113
+msgid "Restricted or Premium Channel"
+msgstr "Canal premium o restringido"
+
+#: ../../Zotlabs/Module/Connections.php:56
+#: ../../Zotlabs/Module/Connections.php:161
+#: ../../Zotlabs/Module/Connections.php:242
+msgid "Blocked"
+msgstr "Bloqueadas"
+
+#: ../../Zotlabs/Module/Connections.php:61
+#: ../../Zotlabs/Module/Connections.php:168
+#: ../../Zotlabs/Module/Connections.php:241
+msgid "Ignored"
+msgstr "Ignoradas"
+
+#: ../../Zotlabs/Module/Connections.php:66
+#: ../../Zotlabs/Module/Connections.php:182
+#: ../../Zotlabs/Module/Connections.php:240
+msgid "Hidden"
+msgstr "Ocultas"
+
+#: ../../Zotlabs/Module/Connections.php:71
+#: ../../Zotlabs/Module/Connections.php:175
+#: ../../Zotlabs/Module/Connections.php:239
+msgid "Archived"
+msgstr "Archivadas"
+
+#: ../../Zotlabs/Module/Connections.php:76
+#: ../../Zotlabs/Module/Connections.php:86 ../../Zotlabs/Module/Menu.php:116
+#: ../../include/conversation.php:1553
+msgid "New"
+msgstr "Nuevas"
+
+#: ../../Zotlabs/Module/Connections.php:92
+#: ../../Zotlabs/Module/Connections.php:107
+#: ../../Zotlabs/Module/Connedit.php:597 ../../include/widgets.php:448
+msgid "All"
+msgstr "Todos/as"
+
+#: ../../Zotlabs/Module/Connections.php:138
+msgid "New Connections"
+msgstr "Nuevas conexiones"
+
+#: ../../Zotlabs/Module/Connections.php:141
+msgid "Show pending (new) connections"
+msgstr "Mostrar conexiones (nuevas) pendientes"
+
+#: ../../Zotlabs/Module/Connections.php:145
+#: ../../Zotlabs/Module/Profperm.php:144
+msgid "All Connections"
+msgstr "Todas las conexiones"
+
+#: ../../Zotlabs/Module/Connections.php:148
+msgid "Show all connections"
+msgstr "Mostrar todas las conexiones"
+
+#: ../../Zotlabs/Module/Connections.php:164
+msgid "Only show blocked connections"
+msgstr "Mostrar solo las conexiones bloqueadas"
+
+#: ../../Zotlabs/Module/Connections.php:171
+msgid "Only show ignored connections"
+msgstr "Mostrar solo conexiones ignoradas"
+
+#: ../../Zotlabs/Module/Connections.php:178
+msgid "Only show archived connections"
+msgstr "Mostrar solo las conexiones archivadas"
+
+#: ../../Zotlabs/Module/Connections.php:185
+msgid "Only show hidden connections"
+msgstr "Mostrar solo las conexiones ocultas"
+
+#: ../../Zotlabs/Module/Connections.php:238
+msgid "Pending approval"
+msgstr "Pendiente de aprobación"
+
+#: ../../Zotlabs/Module/Connections.php:254
+#, php-format
+msgid "%1$s [%2$s]"
+msgstr "%1$s [%2$s]"
+
+#: ../../Zotlabs/Module/Connections.php:255
+msgid "Edit connection"
+msgstr "Editar conexión"
+
+#: ../../Zotlabs/Module/Connections.php:256
+msgid "Delete connection"
+msgstr "Eliminar conexión"
+
+#: ../../Zotlabs/Module/Connections.php:265
+msgid "Channel address"
+msgstr "Dirección del canal"
+
+#: ../../Zotlabs/Module/Connections.php:267
+msgid "Network"
+msgstr "Red"
+
+#: ../../Zotlabs/Module/Connections.php:272
+msgid "Connected"
+msgstr "Conectado/a"
+
+#: ../../Zotlabs/Module/Connections.php:274
+msgid "Approve connection"
+msgstr "Aprobar esta conexión"
+
+#: ../../Zotlabs/Module/Connections.php:276
+msgid "Ignore connection"
+msgstr "Ignorar esta conexión"
+
+#: ../../Zotlabs/Module/Connections.php:277
+#: ../../Zotlabs/Module/Connedit.php:549
+#: ../../Zotlabs/Module/Notifications.php:55
+msgid "Ignore"
+msgstr "Ignorar"
+
+#: ../../Zotlabs/Module/Connections.php:278
+msgid "Recent activity"
+msgstr "Actividad reciente"
+
+#: ../../Zotlabs/Module/Connections.php:302 ../../include/text.php:834
+#: ../../include/nav.php:189
+msgid "Connections"
+msgstr "Conexiones"
+
+#: ../../Zotlabs/Module/Connections.php:306 ../../Zotlabs/Module/Search.php:44
+#: ../../include/apps.php:147 ../../include/text.php:904
+#: ../../include/text.php:916 ../../include/nav.php:167
+msgid "Search"
+msgstr "Buscar"
+
+#: ../../Zotlabs/Module/Connections.php:307
+msgid "Search your connections"
+msgstr "Buscar sus conexiones"
+
+#: ../../Zotlabs/Module/Connections.php:308
+msgid "Connections search"
+msgstr "Buscar conexiones"
+
+#: ../../Zotlabs/Module/Connections.php:309
+#: ../../Zotlabs/Module/Directory.php:388
+#: ../../Zotlabs/Module/Directory.php:393 ../../include/contact_widgets.php:26
+msgid "Find"
+msgstr "Encontrar"
+
+#: ../../Zotlabs/Module/Connedit.php:80
+msgid "Could not access contact record."
+msgstr "No se ha podido acceder al registro de contacto."
+
+#: ../../Zotlabs/Module/Connedit.php:104
+msgid "Could not locate selected profile."
+msgstr "No se ha podido localizar el perfil seleccionado."
+
+#: ../../Zotlabs/Module/Connedit.php:227
+msgid "Connection updated."
+msgstr "Conexión actualizada."
+
+#: ../../Zotlabs/Module/Connedit.php:229
+msgid "Failed to update connection record."
+msgstr "Error al actualizar el registro de la conexión."
+
+#: ../../Zotlabs/Module/Connedit.php:276
+msgid "is now connected to"
+msgstr "ahora está conectado/a"
+
+#: ../../Zotlabs/Module/Connedit.php:411
+msgid "Could not access address book record."
+msgstr "No se pudo acceder al registro en su libreta de direcciones."
+
+#: ../../Zotlabs/Module/Connedit.php:425
+msgid "Refresh failed - channel is currently unavailable."
+msgstr "Recarga fallida - no se puede encontrar el canal en este momento."
+
+#: ../../Zotlabs/Module/Connedit.php:440 ../../Zotlabs/Module/Connedit.php:449
+#: ../../Zotlabs/Module/Connedit.php:458 ../../Zotlabs/Module/Connedit.php:467
+#: ../../Zotlabs/Module/Connedit.php:480
+msgid "Unable to set address book parameters."
+msgstr "No ha sido posible establecer los parámetros de la libreta de direcciones."
+
+#: ../../Zotlabs/Module/Connedit.php:504
+msgid "Connection has been removed."
+msgstr "La conexión ha sido eliminada."
+
+#: ../../Zotlabs/Module/Connedit.php:520 ../../include/conversation.php:959
+#: ../../include/nav.php:86
+msgid "View Profile"
+msgstr "Ver el perfil"
+
+#: ../../Zotlabs/Module/Connedit.php:523
+#, php-format
+msgid "View %s's profile"
+msgstr "Ver el perfil de %s"
+
+#: ../../Zotlabs/Module/Connedit.php:527
+msgid "Refresh Permissions"
+msgstr "Recargar los permisos"
+
+#: ../../Zotlabs/Module/Connedit.php:530
+msgid "Fetch updated permissions"
+msgstr "Obtener los permisos actualizados"
+
+#: ../../Zotlabs/Module/Connedit.php:534
+msgid "Recent Activity"
+msgstr "Actividad reciente"
+
+#: ../../Zotlabs/Module/Connedit.php:537
+msgid "View recent posts and comments"
+msgstr "Ver publicaciones y comentarios recientes"
+
+#: ../../Zotlabs/Module/Connedit.php:544
+msgid "Block (or Unblock) all communications with this connection"
+msgstr "Bloquear (o desbloquear) todas las comunicaciones con esta conexión"
+
+#: ../../Zotlabs/Module/Connedit.php:545
+msgid "This connection is blocked!"
+msgstr "¡Esta conexión está bloqueada!"
+
+#: ../../Zotlabs/Module/Connedit.php:549
+msgid "Unignore"
+msgstr "Dejar de ignorar"
+
+#: ../../Zotlabs/Module/Connedit.php:552
+msgid "Ignore (or Unignore) all inbound communications from this connection"
+msgstr "Ignorar (o dejar de ignorar) todas las comunicaciones entrantes de esta conexión"
+
+#: ../../Zotlabs/Module/Connedit.php:553
+msgid "This connection is ignored!"
+msgstr "¡Esta conexión es ignorada!"
+
+#: ../../Zotlabs/Module/Connedit.php:557
+msgid "Unarchive"
+msgstr "Desarchivar"
+
+#: ../../Zotlabs/Module/Connedit.php:557
+msgid "Archive"
+msgstr "Archivar"
+
+#: ../../Zotlabs/Module/Connedit.php:560
+msgid ""
+"Archive (or Unarchive) this connection - mark channel dead but keep content"
+msgstr "Archiva (o desarchiva) esta conexión - marca el canal como muerto aunque mantiene sus contenidos"
+
+#: ../../Zotlabs/Module/Connedit.php:561
+msgid "This connection is archived!"
+msgstr "¡Esta conexión esta archivada!"
+
+#: ../../Zotlabs/Module/Connedit.php:565
+msgid "Unhide"
+msgstr "Mostrar"
+
+#: ../../Zotlabs/Module/Connedit.php:565
+msgid "Hide"
+msgstr "Ocultar"
+
+#: ../../Zotlabs/Module/Connedit.php:568
+msgid "Hide or Unhide this connection from your other connections"
+msgstr "Ocultar o mostrar esta conexión a sus otras conexiones"
+
+#: ../../Zotlabs/Module/Connedit.php:569
+msgid "This connection is hidden!"
+msgstr "¡Esta conexión está oculta!"
+
+#: ../../Zotlabs/Module/Connedit.php:576
+msgid "Delete this connection"
+msgstr "Eliminar esta conexión"
+
+#: ../../Zotlabs/Module/Connedit.php:593 ../../include/widgets.php:444
+msgid "Me"
+msgstr "Yo"
+
+#: ../../Zotlabs/Module/Connedit.php:594 ../../include/widgets.php:445
+msgid "Family"
+msgstr "Familia"
+
+#: ../../Zotlabs/Module/Connedit.php:595 ../../Zotlabs/Module/Settings.php:340
+#: ../../Zotlabs/Module/Settings.php:344 ../../Zotlabs/Module/Settings.php:345
+#: ../../Zotlabs/Module/Settings.php:348 ../../Zotlabs/Module/Settings.php:359
+#: ../../include/identity.php:389 ../../include/identity.php:390
+#: ../../include/identity.php:397 ../../include/profile_selectors.php:80
+#: ../../include/widgets.php:446
+msgid "Friends"
+msgstr "Amigos/as"
+
+#: ../../Zotlabs/Module/Connedit.php:596 ../../include/widgets.php:447
+msgid "Acquaintances"
+msgstr "Conocidos/as"
+
+#: ../../Zotlabs/Module/Connedit.php:657
+msgid "Approve this connection"
+msgstr "Aprobar esta conexión"
+
+#: ../../Zotlabs/Module/Connedit.php:657
+msgid "Accept connection to allow communication"
+msgstr "Aceptar la conexión para permitir la comunicación"
+
+#: ../../Zotlabs/Module/Connedit.php:662
+msgid "Set Affinity"
+msgstr "Ajustar la afinidad"
+
+#: ../../Zotlabs/Module/Connedit.php:665
+msgid "Set Profile"
+msgstr "Ajustar el perfil"
+
+#: ../../Zotlabs/Module/Connedit.php:668
+msgid "Set Affinity & Profile"
+msgstr "Ajustar la afinidad y el perfil"
+
+#: ../../Zotlabs/Module/Connedit.php:701
+msgid "none"
+msgstr "-"
+
+#: ../../Zotlabs/Module/Connedit.php:705 ../../include/widgets.php:565
+msgid "Connection Default Permissions"
+msgstr "Permisos predeterminados de conexión"
+
+#: ../../Zotlabs/Module/Connedit.php:705 ../../include/items.php:5159
+#, php-format
+msgid "Connection: %s"
+msgstr "Conexión: %s"
+
+#: ../../Zotlabs/Module/Connedit.php:706
+msgid "Apply these permissions automatically"
+msgstr "Aplicar estos permisos automaticamente"
+
+#: ../../Zotlabs/Module/Connedit.php:706
+msgid "Connection requests will be approved without your interaction"
+msgstr "Las solicitudes de conexión serán aprobadas sin su intervención"
+
+#: ../../Zotlabs/Module/Connedit.php:708
+msgid "This connection's primary address is"
+msgstr "La dirección primaria de esta conexión es"
+
+#: ../../Zotlabs/Module/Connedit.php:709
+msgid "Available locations:"
+msgstr "Ubicaciones disponibles:"
+
+#: ../../Zotlabs/Module/Connedit.php:713
+msgid ""
+"The permissions indicated on this page will be applied to all new "
+"connections."
+msgstr "Los permisos indicados en esta página serán aplicados en todas las nuevas conexiones."
+
+#: ../../Zotlabs/Module/Connedit.php:715
+msgid "Slide to adjust your degree of friendship"
+msgstr "Deslizar para ajustar el grado de amistad"
+
+#: ../../Zotlabs/Module/Connedit.php:716 ../../Zotlabs/Module/Rate.php:161
+#: ../../include/js_strings.php:20
+msgid "Rating"
+msgstr "Valoración"
+
+#: ../../Zotlabs/Module/Connedit.php:717
+msgid "Slide to adjust your rating"
+msgstr "Deslizar para ajustar su valoración"
+
+#: ../../Zotlabs/Module/Connedit.php:718 ../../Zotlabs/Module/Connedit.php:723
+msgid "Optionally explain your rating"
+msgstr "Opcionalmente, puede explicar su valoración"
+
+#: ../../Zotlabs/Module/Connedit.php:720
+msgid "Custom Filter"
+msgstr "Filtro personalizado"
+
+#: ../../Zotlabs/Module/Connedit.php:721
+msgid "Only import posts with this text"
+msgstr "Importar solo entradas que contengan este texto"
+
+#: ../../Zotlabs/Module/Connedit.php:721 ../../Zotlabs/Module/Connedit.php:722
+msgid ""
+"words one per line or #tags or /patterns/ or lang=xx, leave blank to import "
+"all posts"
+msgstr "Una sola opción por línea: palabras, #etiquetas, /patrones/ o lang=xx. Dejar en blanco para importarlo todo"
+
+#: ../../Zotlabs/Module/Connedit.php:722
+msgid "Do not import posts with this text"
+msgstr "No importar entradas que contengan este texto"
+
+#: ../../Zotlabs/Module/Connedit.php:724
+msgid "This information is public!"
+msgstr "¡Esta información es pública!"
+
+#: ../../Zotlabs/Module/Connedit.php:729
+msgid "Connection Pending Approval"
+msgstr "Conexión pendiente de aprobación"
+
+#: ../../Zotlabs/Module/Connedit.php:732
+msgid "inherited"
+msgstr "heredado"
+
+#: ../../Zotlabs/Module/Connedit.php:734
+#, php-format
+msgid ""
+"Please choose the profile you would like to display to %s when viewing your "
+"profile securely."
+msgstr "Por favor, escoja el perfil que quiere mostrar a %s cuando esté viendo su perfil de forma segura."
+
+#: ../../Zotlabs/Module/Connedit.php:736
+msgid "Their Settings"
+msgstr "Sus ajustes"
+
+#: ../../Zotlabs/Module/Connedit.php:737
+msgid "My Settings"
+msgstr "Mis ajustes"
+
+#: ../../Zotlabs/Module/Connedit.php:739
+msgid "Individual Permissions"
+msgstr "Permisos individuales"
+
+#: ../../Zotlabs/Module/Connedit.php:740
+msgid ""
+"Some permissions may be inherited from your channel's <a "
+"href=\"settings\"><strong>privacy settings</strong></a>, which have higher "
+"priority than individual settings. You can <strong>not</strong> change those"
+" settings here."
+msgstr "Algunos permisos pueden ser heredados de los <a href=\"settings\"><strong>ajustes de privacidad</strong></a> de sus canales, los cuales tienen una prioridad más alta que los ajustes individuales. <strong>No</strong> puede cambiar estos ajustes aquí."
+
+#: ../../Zotlabs/Module/Connedit.php:741
+msgid ""
+"Some permissions may be inherited from your channel's <a "
+"href=\"settings\"><strong>privacy settings</strong></a>, which have higher "
+"priority than individual settings. You can change those settings here but "
+"they wont have any impact unless the inherited setting changes."
+msgstr "Algunos permisos pueden ser heredados de los <a href=\"settings\"><strong>ajustes de privacidad</strong></a> de sus canales, los cuales tienen una prioridad más alta que los ajustes individuales. Puede cambiar estos ajustes aquí, pero no tendrán ningún consecuencia hasta que cambie los ajustes heredados."
+
+#: ../../Zotlabs/Module/Connedit.php:742
+msgid "Last update:"
+msgstr "Última actualización:"
+
+#: ../../Zotlabs/Module/Cover_photo.php:58
+#: ../../Zotlabs/Module/Profile_photo.php:79
+msgid "Image uploaded but image cropping failed."
+msgstr "Imagen actualizada, pero el recorte de la imagen ha fallado. "
+
+#: ../../Zotlabs/Module/Cover_photo.php:134
+#: ../../Zotlabs/Module/Cover_photo.php:181
+msgid "Cover Photos"
+msgstr "Imágenes de portada del perfil"
+
+#: ../../Zotlabs/Module/Cover_photo.php:154
+#: ../../Zotlabs/Module/Profile_photo.php:133
+msgid "Image resize failed."
+msgstr "El ajuste del tamaño de la imagen ha fallado."
+
+#: ../../Zotlabs/Module/Cover_photo.php:168
+#: ../../Zotlabs/Module/Profile_photo.php:192 ../../include/photos.php:146
+msgid "Unable to process image"
+msgstr "No ha sido posible procesar la imagen"
+
+#: ../../Zotlabs/Module/Cover_photo.php:192
+#: ../../Zotlabs/Module/Profile_photo.php:217
+msgid "Image upload failed."
+msgstr "La carga de la imagen ha fallado."
+
+#: ../../Zotlabs/Module/Cover_photo.php:210
+#: ../../Zotlabs/Module/Profile_photo.php:236
+msgid "Unable to process image."
+msgstr "No ha sido posible procesar la imagen."
+
+#: ../../Zotlabs/Module/Cover_photo.php:233 ../../include/items.php:5587
+msgid "female"
+msgstr "mujer"
+
+#: ../../Zotlabs/Module/Cover_photo.php:234 ../../include/items.php:5588
+#, php-format
+msgid "%1$s updated her %2$s"
+msgstr "%1$s ha actualizado su %2$s"
+
+#: ../../Zotlabs/Module/Cover_photo.php:235 ../../include/items.php:5589
+msgid "male"
+msgstr "hombre"
+
+#: ../../Zotlabs/Module/Cover_photo.php:236 ../../include/items.php:5590
+#, php-format
+msgid "%1$s updated his %2$s"
+msgstr "%1$s ha actualizado su %2$s"
+
+#: ../../Zotlabs/Module/Cover_photo.php:238 ../../include/items.php:5592
+#, php-format
+msgid "%1$s updated their %2$s"
+msgstr "%1$s ha actualizado su %2$s"
+
+#: ../../Zotlabs/Module/Cover_photo.php:240 ../../include/identity.php:1800
+msgid "cover photo"
+msgstr "Imagen de portada del perfil"
+
+#: ../../Zotlabs/Module/Cover_photo.php:303
+#: ../../Zotlabs/Module/Cover_photo.php:318
+#: ../../Zotlabs/Module/Profile_photo.php:283
+#: ../../Zotlabs/Module/Profile_photo.php:324
+msgid "Photo not available."
+msgstr "Foto no disponible."
+
+#: ../../Zotlabs/Module/Cover_photo.php:354
+#: ../../Zotlabs/Module/Profile_photo.php:365
+msgid "Upload File:"
+msgstr "Subir fichero:"
+
+#: ../../Zotlabs/Module/Cover_photo.php:355
+#: ../../Zotlabs/Module/Profile_photo.php:366
+msgid "Select a profile:"
+msgstr "Seleccionar un perfil:"
+
+#: ../../Zotlabs/Module/Cover_photo.php:356
+msgid "Upload Cover Photo"
+msgstr "Subir imagen de portada del perfil"
+
+#: ../../Zotlabs/Module/Cover_photo.php:361
+#: ../../Zotlabs/Module/Profile_photo.php:374
+#: ../../Zotlabs/Module/Settings.php:983
+msgid "or"
+msgstr "o"
+
+#: ../../Zotlabs/Module/Cover_photo.php:361
+#: ../../Zotlabs/Module/Profile_photo.php:374
+msgid "skip this step"
+msgstr "Omitir este paso"
+
+#: ../../Zotlabs/Module/Cover_photo.php:361
+#: ../../Zotlabs/Module/Profile_photo.php:374
+msgid "select a photo from your photo albums"
+msgstr "Seleccione una foto de sus álbumes de fotos"
+
+#: ../../Zotlabs/Module/Cover_photo.php:377
+#: ../../Zotlabs/Module/Profile_photo.php:390
+msgid "Crop Image"
+msgstr "Recortar imagen"
+
+#: ../../Zotlabs/Module/Cover_photo.php:378
+#: ../../Zotlabs/Module/Profile_photo.php:391
+msgid "Please adjust the image cropping for optimum viewing."
+msgstr "Por favor ajuste el recorte de la imagen para una visión óptima."
+
+#: ../../Zotlabs/Module/Cover_photo.php:380
+#: ../../Zotlabs/Module/Profile_photo.php:393
+msgid "Done Editing"
+msgstr "Edición completada"
+
+#: ../../Zotlabs/Module/Dav.php:127
+msgid "$Projectname channel"
+msgstr "Canal $Projectname"
+
+#: ../../Zotlabs/Module/Directory.php:63 ../../Zotlabs/Module/Display.php:21
+#: ../../Zotlabs/Module/Photos.php:521 ../../Zotlabs/Module/Ratings.php:86
+#: ../../Zotlabs/Module/Search.php:17
+#: ../../Zotlabs/Module/Viewconnections.php:21
+msgid "Public access denied."
+msgstr "Acceso público denegado."
+
+#: ../../Zotlabs/Module/Directory.php:243
+#, php-format
+msgid "%d rating"
+msgid_plural "%d ratings"
+msgstr[0] "%d valoración"
+msgstr[1] "%d valoraciones"
+
+#: ../../Zotlabs/Module/Directory.php:254
+msgid "Gender: "
+msgstr "Género:"
+
+#: ../../Zotlabs/Module/Directory.php:256
+msgid "Status: "
+msgstr "Estado:"
+
+#: ../../Zotlabs/Module/Directory.php:258
+msgid "Homepage: "
+msgstr "Página personal:"
+
+#: ../../Zotlabs/Module/Directory.php:306 ../../include/identity.php:1322
+msgid "Age:"
+msgstr "Edad:"
+
+#: ../../Zotlabs/Module/Directory.php:311 ../../include/identity.php:1022
+#: ../../include/bb2diaspora.php:509 ../../include/event.php:52
+#: ../../include/text.php:1452
+msgid "Location:"
+msgstr "Ubicación:"
+
+#: ../../Zotlabs/Module/Directory.php:317
+msgid "Description:"
+msgstr "Descripción:"
+
+#: ../../Zotlabs/Module/Directory.php:322 ../../include/identity.php:1338
+msgid "Hometown:"
+msgstr "Lugar de nacimiento:"
+
+#: ../../Zotlabs/Module/Directory.php:324 ../../include/identity.php:1346
+msgid "About:"
+msgstr "Sobre mí:"
+
+#: ../../Zotlabs/Module/Directory.php:325 ../../Zotlabs/Module/Match.php:68
+#: ../../Zotlabs/Module/Suggest.php:56 ../../include/identity.php:1007
+#: ../../include/conversation.php:961 ../../include/Contact.php:101
+#: ../../include/widgets.php:147 ../../include/widgets.php:184
+msgid "Connect"
+msgstr "Conectar"
+
+#: ../../Zotlabs/Module/Directory.php:326
+msgid "Public Forum:"
+msgstr "Foro público:"
+
+#: ../../Zotlabs/Module/Directory.php:329
+msgid "Keywords: "
+msgstr "Palabras clave:"
+
+#: ../../Zotlabs/Module/Directory.php:332
+msgid "Don't suggest"
+msgstr "No sugerir:"
+
+#: ../../Zotlabs/Module/Directory.php:334
+msgid "Common connections:"
+msgstr "Conexiones comunes:"
+
+#: ../../Zotlabs/Module/Directory.php:383
+msgid "Global Directory"
+msgstr "Directorio global:"
+
+#: ../../Zotlabs/Module/Directory.php:383
+msgid "Local Directory"
+msgstr "Directorio local:"
+
+#: ../../Zotlabs/Module/Directory.php:389
+msgid "Finding:"
+msgstr "Encontrar:"
+
+#: ../../Zotlabs/Module/Directory.php:392 ../../Zotlabs/Module/Suggest.php:64
+#: ../../include/contact_widgets.php:27
+msgid "Channel Suggestions"
+msgstr "Sugerencias de canales"
+
+#: ../../Zotlabs/Module/Directory.php:394
+msgid "next page"
+msgstr "siguiente página"
+
+#: ../../Zotlabs/Module/Directory.php:394
+msgid "previous page"
+msgstr "página anterior"
+
+#: ../../Zotlabs/Module/Directory.php:395
+msgid "Sort options"
+msgstr "Ordenar opciones"
+
+#: ../../Zotlabs/Module/Directory.php:396
+msgid "Alphabetic"
+msgstr "Alfabético"
+
+#: ../../Zotlabs/Module/Directory.php:397
+msgid "Reverse Alphabetic"
+msgstr "Alfabético inverso"
+
+#: ../../Zotlabs/Module/Directory.php:398
+msgid "Newest to Oldest"
+msgstr "De más nuevo a más antiguo"
+
+#: ../../Zotlabs/Module/Directory.php:399
+msgid "Oldest to Newest"
+msgstr "De más antiguo a más nuevo"
+
+#: ../../Zotlabs/Module/Directory.php:416
+msgid "No entries (some entries may be hidden)."
+msgstr "Sin entradas (algunas entradas pueden estar ocultas)."
+
+#: ../../Zotlabs/Module/Dirsearch.php:25 ../../Zotlabs/Module/Regdir.php:49
+msgid "This site is not a directory server"
+msgstr "Este sitio no es un servidor de directorio"
+
+#: ../../Zotlabs/Module/Dirsearch.php:33
+msgid "This directory server requires an access token"
+msgstr "El servidor de este directorio necesita un \"token\" de acceso"
+
+#: ../../Zotlabs/Module/Dreport.php:10 ../../Zotlabs/Module/Dreport.php:49
+#: ../../Zotlabs/Module/Group.php:72 ../../Zotlabs/Module/Import_items.php:112
+#: ../../Zotlabs/Module/Like.php:284 ../../Zotlabs/Module/Profperm.php:28
+#: ../../Zotlabs/Module/Subthread.php:62 ../../include/items.php:423
+#: ../../index.php:173
+msgid "Permission denied"
+msgstr "Permiso denegado"
+
+#: ../../Zotlabs/Module/Dreport.php:27
+msgid "Invalid message"
+msgstr "Mensaje no válido"
+
+#: ../../Zotlabs/Module/Dreport.php:59
+msgid "no results"
+msgstr "sin resultados"
+
+#: ../../Zotlabs/Module/Dreport.php:64
+#, php-format
+msgid "Delivery report for %1$s"
+msgstr "Informe de entrega para %1$s"
+
+#: ../../Zotlabs/Module/Dreport.php:78
+msgid "channel sync processed"
+msgstr "se ha realizado la sincronización del canal"
+
+#: ../../Zotlabs/Module/Dreport.php:82
+msgid "queued"
+msgstr "encolado"
+
+#: ../../Zotlabs/Module/Dreport.php:86
+msgid "posted"
+msgstr "enviado"
+
+#: ../../Zotlabs/Module/Dreport.php:90
+msgid "accepted for delivery"
+msgstr "aceptado para el envío"
+
+#: ../../Zotlabs/Module/Dreport.php:94
+msgid "updated"
+msgstr "actualizado"
+
+#: ../../Zotlabs/Module/Dreport.php:97
+msgid "update ignored"
+msgstr "actualización ignorada"
+
+#: ../../Zotlabs/Module/Dreport.php:100
+msgid "permission denied"
+msgstr "permiso denegado"
+
+#: ../../Zotlabs/Module/Dreport.php:104
+msgid "recipient not found"
+msgstr "destinatario no encontrado"
+
+#: ../../Zotlabs/Module/Dreport.php:107
+msgid "mail recalled"
+msgstr "mensaje de correo revocado"
+
+#: ../../Zotlabs/Module/Dreport.php:110
+msgid "duplicate mail received"
+msgstr "se ha recibido mensaje duplicado"
+
+#: ../../Zotlabs/Module/Dreport.php:113
+msgid "mail delivered"
+msgstr "correo enviado"
+
+#: ../../Zotlabs/Module/Editblock.php:82 ../../Zotlabs/Module/Editblock.php:98
+#: ../../Zotlabs/Module/Editlayout.php:80 ../../Zotlabs/Module/Editpost.php:24
+#: ../../Zotlabs/Module/Editwebpage.php:81
+msgid "Item not found"
+msgstr "Elemento no encontrado"
+
+#: ../../Zotlabs/Module/Editblock.php:122
+msgid "Delete block?"
+msgstr "¿Borrar bloque?"
+
+#: ../../Zotlabs/Module/Editblock.php:141
+#: ../../Zotlabs/Module/Editlayout.php:140
+#: ../../Zotlabs/Module/Editpost.php:119
+#: ../../Zotlabs/Module/Editwebpage.php:182 ../../include/ItemObject.php:704
+#: ../../include/conversation.php:1216
+msgid "Bold"
+msgstr "Negrita"
+
+#: ../../Zotlabs/Module/Editblock.php:142
+#: ../../Zotlabs/Module/Editlayout.php:141
+#: ../../Zotlabs/Module/Editpost.php:120
+#: ../../Zotlabs/Module/Editwebpage.php:183 ../../include/ItemObject.php:705
+#: ../../include/conversation.php:1217
+msgid "Italic"
+msgstr "Itálico "
+
+#: ../../Zotlabs/Module/Editblock.php:143
+#: ../../Zotlabs/Module/Editlayout.php:142
+#: ../../Zotlabs/Module/Editpost.php:121
+#: ../../Zotlabs/Module/Editwebpage.php:184 ../../include/ItemObject.php:706
+#: ../../include/conversation.php:1218
+msgid "Underline"
+msgstr "Subrayar"
+
+#: ../../Zotlabs/Module/Editblock.php:144
+#: ../../Zotlabs/Module/Editlayout.php:143
+#: ../../Zotlabs/Module/Editpost.php:122
+#: ../../Zotlabs/Module/Editwebpage.php:185 ../../include/ItemObject.php:707
+#: ../../include/conversation.php:1219
+msgid "Quote"
+msgstr "Citar"
+
+#: ../../Zotlabs/Module/Editblock.php:145
+#: ../../Zotlabs/Module/Editlayout.php:144
+#: ../../Zotlabs/Module/Editpost.php:123
+#: ../../Zotlabs/Module/Editwebpage.php:186 ../../include/ItemObject.php:708
+#: ../../include/conversation.php:1220
+msgid "Code"
+msgstr "Código"
+
+#: ../../Zotlabs/Module/Editblock.php:147
+#: ../../Zotlabs/Module/Editlayout.php:145
+#: ../../Zotlabs/Module/Editpost.php:124
+#: ../../Zotlabs/Module/Editwebpage.php:187
+#: ../../include/conversation.php:1221
+msgid "Upload photo"
+msgstr "Subir foto"
+
+#: ../../Zotlabs/Module/Editblock.php:148
+#: ../../Zotlabs/Module/Editlayout.php:146
+#: ../../Zotlabs/Module/Editpost.php:125
+#: ../../Zotlabs/Module/Editwebpage.php:188 ../../Zotlabs/Module/Mail.php:252
+#: ../../Zotlabs/Module/Mail.php:382 ../../include/conversation.php:1223
+msgid "Attach file"
+msgstr "Adjuntar fichero"
+
+#: ../../Zotlabs/Module/Editblock.php:150
+#: ../../Zotlabs/Module/Editlayout.php:148
+#: ../../Zotlabs/Module/Editpost.php:127
+#: ../../Zotlabs/Module/Editwebpage.php:190
+msgid "Insert YouTube video"
+msgstr "Insertar vídeo de YouTube"
+
+#: ../../Zotlabs/Module/Editblock.php:151
+#: ../../Zotlabs/Module/Editlayout.php:149
+#: ../../Zotlabs/Module/Editpost.php:128
+#: ../../Zotlabs/Module/Editwebpage.php:191
+msgid "Insert Vorbis [.ogg] video"
+msgstr "Insertar vídeo Vorbis [.ogg]"
+
+#: ../../Zotlabs/Module/Editblock.php:152
+#: ../../Zotlabs/Module/Editlayout.php:150
+#: ../../Zotlabs/Module/Editpost.php:129
+#: ../../Zotlabs/Module/Editwebpage.php:192
+msgid "Insert Vorbis [.ogg] audio"
+msgstr "Insertar audio Vorbis [.ogg]"
+
+#: ../../Zotlabs/Module/Editblock.php:153
+#: ../../Zotlabs/Module/Editlayout.php:151
+#: ../../Zotlabs/Module/Editpost.php:130
+#: ../../Zotlabs/Module/Editwebpage.php:193
+#: ../../include/conversation.php:1231
+msgid "Set your location"
+msgstr "Establecer su ubicación"
+
+#: ../../Zotlabs/Module/Editblock.php:154
+#: ../../Zotlabs/Module/Editlayout.php:152
+#: ../../Zotlabs/Module/Editpost.php:131
+#: ../../Zotlabs/Module/Editwebpage.php:194
+#: ../../include/conversation.php:1236
+msgid "Clear browser location"
+msgstr "Eliminar los datos de localización geográfica del navegador"
+
+#: ../../Zotlabs/Module/Editblock.php:155
+#: ../../Zotlabs/Module/Editlayout.php:153
+#: ../../Zotlabs/Module/Editpost.php:135
+#: ../../Zotlabs/Module/Editwebpage.php:195
+#: ../../Zotlabs/Module/Photos.php:1072 ../../include/ItemObject.php:389
+#: ../../include/conversation.php:740 ../../include/conversation.php:1244
+msgid "Please wait"
+msgstr "Espere por favor"
+
+#: ../../Zotlabs/Module/Editblock.php:156
+#: ../../Zotlabs/Module/Editlayout.php:154
+#: ../../Zotlabs/Module/Editpost.php:136
+#: ../../Zotlabs/Module/Editwebpage.php:196
+#: ../../Zotlabs/Module/Events.php:470 ../../include/conversation.php:1245
+msgid "Permission settings"
+msgstr "Configuración de permisos"
+
+#: ../../Zotlabs/Module/Editblock.php:164
+#: ../../Zotlabs/Module/Editlayout.php:161
+#: ../../Zotlabs/Module/Editpost.php:144
+#: ../../Zotlabs/Module/Editwebpage.php:205
+#: ../../include/conversation.php:1254
+msgid "Public post"
+msgstr "Entrada pública"
+
+#: ../../Zotlabs/Module/Editblock.php:167
+#: ../../Zotlabs/Module/Editpost.php:147
+#: ../../Zotlabs/Module/Editwebpage.php:210
+#: ../../include/conversation.php:1239
+msgid "Title (optional)"
+msgstr "Título (opcional)"
+
+#: ../../Zotlabs/Module/Editblock.php:170
+#: ../../Zotlabs/Module/Editlayout.php:168
+#: ../../Zotlabs/Module/Editpost.php:149
+#: ../../Zotlabs/Module/Editwebpage.php:212
+#: ../../include/conversation.php:1243
+msgid "Categories (optional, comma-separated list)"
+msgstr "Categorías (opcional, lista separada por comas)"
+
+#: ../../Zotlabs/Module/Editblock.php:171
+#: ../../Zotlabs/Module/Editlayout.php:169
+#: ../../Zotlabs/Module/Editpost.php:150
+#: ../../Zotlabs/Module/Editwebpage.php:213
+#: ../../include/conversation.php:1256
+msgid "Example: bob@example.com, mary@example.com"
+msgstr "Ejemplo: roberto@ejemplo.com, maría@ejemplo.com"
+
+#: ../../Zotlabs/Module/Editblock.php:176
+#: ../../Zotlabs/Module/Editpost.php:155
+#: ../../Zotlabs/Module/Editwebpage.php:217
+#: ../../Zotlabs/Module/Events.php:469 ../../Zotlabs/Module/Photos.php:1092
+#: ../../Zotlabs/Module/Webpages.php:196 ../../include/ItemObject.php:712
+#: ../../include/conversation.php:1186 ../../include/page_widgets.php:40
+msgid "Preview"
+msgstr "Previsualizar"
+
+#: ../../Zotlabs/Module/Editblock.php:181
+#: ../../Zotlabs/Module/Editlayout.php:178
+#: ../../Zotlabs/Module/Editpost.php:161
+#: ../../Zotlabs/Module/Editwebpage.php:222 ../../Zotlabs/Module/Mail.php:257
+#: ../../Zotlabs/Module/Mail.php:387 ../../include/conversation.php:1269
+msgid "Set expiration date"
+msgstr "Configurar fecha de caducidad"
+
+#: ../../Zotlabs/Module/Editblock.php:186
+msgid "Edit Block"
+msgstr "Modificar este bloque"
+
+#: ../../Zotlabs/Module/Editlayout.php:116
+msgid "Delete layout?"
+msgstr "¿Borrar la plantilla?"
+
+#: ../../Zotlabs/Module/Editlayout.php:164
+#: ../../Zotlabs/Module/Layouts.php:128
+msgid "Layout Description (Optional)"
+msgstr "Descripción de la plantilla (opcional)"
+
+#: ../../Zotlabs/Module/Editlayout.php:166
+#: ../../Zotlabs/Module/Layouts.php:125 ../../Zotlabs/Module/Layouts.php:184
+msgid "Layout Name"
+msgstr "Nombre de la plantilla"
+
+#: ../../Zotlabs/Module/Editlayout.php:183
+msgid "Edit Layout"
+msgstr "Modificar la plantilla"
+
+#: ../../Zotlabs/Module/Editpost.php:35
+msgid "Item is not editable"
+msgstr "El elemento no es editable"
+
+#: ../../Zotlabs/Module/Editpost.php:60 ../../Zotlabs/Module/Mail.php:207
+#: ../../Zotlabs/Module/Mail.php:321 ../../include/conversation.php:1176
+msgid "Expires YYYY-MM-DD HH:MM"
+msgstr "Caduca YYYY-MM-DD HH:MM"
+
+#: ../../Zotlabs/Module/Editpost.php:61
+msgid "Delete item?"
+msgstr "¿Borrar elemento?"
+
+#: ../../Zotlabs/Module/Editpost.php:132 ../../include/conversation.php:1233
+msgid "Toggle voting"
+msgstr "Cambiar votación"
+
+#: ../../Zotlabs/Module/Editpost.php:165 ../../include/conversation.php:1276
+msgid "OK"
+msgstr "OK"
+
+#: ../../Zotlabs/Module/Editpost.php:166 ../../Zotlabs/Module/Fbrowser.php:66
+#: ../../Zotlabs/Module/Fbrowser.php:88 ../../Zotlabs/Module/Settings.php:589
+#: ../../Zotlabs/Module/Settings.php:615 ../../Zotlabs/Module/Tagrm.php:15
+#: ../../Zotlabs/Module/Tagrm.php:138 ../../include/conversation.php:1277
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: ../../Zotlabs/Module/Editpost.php:171 ../../Zotlabs/Module/Rpost.php:134
+msgid "Edit post"
+msgstr "Editar la entrada"
+
+#: ../../Zotlabs/Module/Editwebpage.php:157
+msgid "Delete webpage?"
+msgstr "¿Eliminar la página web?"
+
+#: ../../Zotlabs/Module/Editwebpage.php:177
+msgid "Page link title"
+msgstr "Título del enlace de la página"
+
+#: ../../Zotlabs/Module/Editwebpage.php:227
+msgid "Edit Webpage"
+msgstr "Editar la página web"
+
+#: ../../Zotlabs/Module/Events.php:25
+msgid "Calendar entries imported."
+msgstr "Entradas de calendario importadas."
+
+#: ../../Zotlabs/Module/Events.php:27
+msgid "No calendar entries found."
+msgstr "No se han encontrado entradas de calendario."
+
+#: ../../Zotlabs/Module/Events.php:104
+msgid "Event can not end before it has started."
+msgstr "Un evento no puede terminar antes de que haya comenzado."
+
+#: ../../Zotlabs/Module/Events.php:106 ../../Zotlabs/Module/Events.php:115
+#: ../../Zotlabs/Module/Events.php:135
+msgid "Unable to generate preview."
+msgstr "No se puede crear la vista previa."
+
+#: ../../Zotlabs/Module/Events.php:113
+msgid "Event title and start time are required."
+msgstr "Se requieren el título del evento y su hora de inicio."
+
+#: ../../Zotlabs/Module/Events.php:133 ../../Zotlabs/Module/Events.php:258
+msgid "Event not found."
+msgstr "Evento no encontrado."
+
+#: ../../Zotlabs/Module/Events.php:253 ../../Zotlabs/Module/Like.php:373
+#: ../../Zotlabs/Module/Tagger.php:51 ../../include/conversation.php:123
+#: ../../include/event.php:915 ../../include/text.php:1970
+msgid "event"
+msgstr "evento"
+
+#: ../../Zotlabs/Module/Events.php:448
+msgid "Edit event title"
+msgstr "Editar el título del evento"
+
+#: ../../Zotlabs/Module/Events.php:448
+msgid "Event title"
+msgstr "Título del evento"
+
+#: ../../Zotlabs/Module/Events.php:450
+msgid "Categories (comma-separated list)"
+msgstr "Categorías (lista separada por comas)"
+
+#: ../../Zotlabs/Module/Events.php:451
+msgid "Edit Category"
+msgstr "Editar la categoría"
+
+#: ../../Zotlabs/Module/Events.php:451
+msgid "Category"
+msgstr "Categoría"
+
+#: ../../Zotlabs/Module/Events.php:454
+msgid "Edit start date and time"
+msgstr "Modificar la fecha y hora de comienzo"
+
+#: ../../Zotlabs/Module/Events.php:454
+msgid "Start date and time"
+msgstr "Fecha y hora de comienzo"
+
+#: ../../Zotlabs/Module/Events.php:455 ../../Zotlabs/Module/Events.php:458
+msgid "Finish date and time are not known or not relevant"
+msgstr "La fecha y hora de terminación no se conocen o no son relevantes"
+
+#: ../../Zotlabs/Module/Events.php:457
+msgid "Edit finish date and time"
+msgstr "Modificar la fecha y hora de terminación"
+
+#: ../../Zotlabs/Module/Events.php:457
+msgid "Finish date and time"
+msgstr "Fecha y hora de terminación"
+
+#: ../../Zotlabs/Module/Events.php:459 ../../Zotlabs/Module/Events.php:460
+msgid "Adjust for viewer timezone"
+msgstr "Ajustar para obtener el visor de los husos horarios"
+
+#: ../../Zotlabs/Module/Events.php:459
+msgid ""
+"Important for events that happen in a particular place. Not practical for "
+"global holidays."
+msgstr "Importante para los eventos que suceden en un lugar determinado. No es práctico para los globales."
+
+#: ../../Zotlabs/Module/Events.php:461
+msgid "Edit Description"
+msgstr "Editar la descripción"
+
+#: ../../Zotlabs/Module/Events.php:463
+msgid "Edit Location"
+msgstr "Modificar la dirección"
+
+#: ../../Zotlabs/Module/Events.php:463 ../../Zotlabs/Module/Locs.php:117
+#: ../../Zotlabs/Module/Profiles.php:476 ../../Zotlabs/Module/Profiles.php:701
+#: ../../Zotlabs/Module/Pubsites.php:40 ../../include/js_strings.php:25
+msgid "Location"
+msgstr "Ubicación"
+
+#: ../../Zotlabs/Module/Events.php:466 ../../Zotlabs/Module/Events.php:468
+msgid "Share this event"
+msgstr "Compartir este evento"
+
+#: ../../Zotlabs/Module/Events.php:473
+msgid "Advanced Options"
+msgstr "Opciones avanzadas"
+
+#: ../../Zotlabs/Module/Events.php:607
+msgid "Edit event"
+msgstr "Editar evento"
+
+#: ../../Zotlabs/Module/Events.php:609
+msgid "Delete event"
+msgstr "Borrar evento"
+
+#: ../../Zotlabs/Module/Events.php:643
+msgid "calendar"
+msgstr "calendario"
+
+#: ../../Zotlabs/Module/Events.php:703
+msgid "Event removed"
+msgstr "Evento borrado"
+
+#: ../../Zotlabs/Module/Events.php:706
+msgid "Failed to remove event"
+msgstr "Error al eliminar el evento"
+
+#: ../../Zotlabs/Module/Fbrowser.php:29 ../../include/apps.php:139
+#: ../../include/conversation.php:1650 ../../include/nav.php:92
+msgid "Photos"
+msgstr "Fotos"
+
+#: ../../Zotlabs/Module/Ffsapi.php:12
+msgid "Share content from Firefox to $Projectname"
+msgstr "Compartir contenido desde Firefox a $Projectname"
+
+#: ../../Zotlabs/Module/Ffsapi.php:15
+msgid "Activate the Firefox $Projectname provider"
+msgstr "Servicio de compartición de Firefox: activar el proveedor $Projectname "
+
+#: ../../Zotlabs/Module/Filer.php:52 ../../include/conversation.php:1174
+msgid "Save to Folder:"
+msgstr "Guardar en carpeta:"
+
+#: ../../Zotlabs/Module/Filer.php:52
+msgid "- select -"
+msgstr "- seleccionar -"
+
+#: ../../Zotlabs/Module/Filestorage.php:86
+msgid "Permission Denied."
+msgstr "Permiso denegado"
+
+#: ../../Zotlabs/Module/Filestorage.php:102
+msgid "File not found."
+msgstr "Fichero no encontrado."
+
+#: ../../Zotlabs/Module/Filestorage.php:145
+msgid "Edit file permissions"
+msgstr "Modificar los permisos del fichero"
+
+#: ../../Zotlabs/Module/Filestorage.php:154
+msgid "Set/edit permissions"
+msgstr "Establecer/editar los permisos"
+
+#: ../../Zotlabs/Module/Filestorage.php:155
+msgid "Include all files and sub folders"
+msgstr "Incluir todos los ficheros y subcarpetas"
+
+#: ../../Zotlabs/Module/Filestorage.php:156
+msgid "Return to file list"
+msgstr "Volver a la lista de ficheros"
+
+#: ../../Zotlabs/Module/Filestorage.php:158
+msgid "Copy/paste this code to attach file to a post"
+msgstr "Copiar/pegar este código para adjuntar el fichero al envío"
+
+#: ../../Zotlabs/Module/Filestorage.php:159
+msgid "Copy/paste this URL to link file from a web page"
+msgstr "Copiar/pegar esta dirección para enlazar el fichero desde una página web"
+
+#: ../../Zotlabs/Module/Filestorage.php:161
+msgid "Share this file"
+msgstr "Compartir este fichero"
+
+#: ../../Zotlabs/Module/Filestorage.php:162
+msgid "Show URL to this file"
+msgstr "Mostrar la dirección de este fichero"
+
+#: ../../Zotlabs/Module/Filestorage.php:163
+msgid "Notify your contacts about this file"
+msgstr "Avisar a sus contactos sobre este fichero"
+
+#: ../../Zotlabs/Module/Follow.php:31
+msgid "Channel added."
+msgstr "Canal añadido."
+
+#: ../../Zotlabs/Module/Fsuggest.php:24 ../../Zotlabs/Module/Fsuggest.php:96
+msgid "Contact not found."
+msgstr "Contacto no encontrado"
+
+#: ../../Zotlabs/Module/Fsuggest.php:67
+msgid "Friend suggestion sent."
+msgstr "Enviar sugerencia a un amigo."
+
+#: ../../Zotlabs/Module/Fsuggest.php:101
+msgid "Suggest Friends"
+msgstr "Sugerir amigos"
+
+#: ../../Zotlabs/Module/Fsuggest.php:103
+#, php-format
+msgid "Suggest a friend for %s"
+msgstr "Sugerir un amigo a %s"
+
+#: ../../Zotlabs/Module/Group.php:24
+msgid "Privacy group created."
+msgstr "El grupo de canales ha sido creado."
+
+#: ../../Zotlabs/Module/Group.php:30
+msgid "Could not create privacy group."
+msgstr "No se puede crear el grupo de canales"
+
+#: ../../Zotlabs/Module/Group.php:42 ../../Zotlabs/Module/Group.php:141
+#: ../../include/items.php:5126
+msgid "Privacy group not found."
+msgstr "Grupo de canales no encontrado."
+
+#: ../../Zotlabs/Module/Group.php:58
+msgid "Privacy group updated."
+msgstr "Grupo de canales actualizado."
+
+#: ../../Zotlabs/Module/Group.php:90
+msgid "Create a group of channels."
+msgstr "Crear un grupo de canales."
+
+#: ../../Zotlabs/Module/Group.php:91 ../../Zotlabs/Module/Group.php:184
+msgid "Privacy group name: "
+msgstr "Nombre del grupo de canales:"
+
+#: ../../Zotlabs/Module/Group.php:93 ../../Zotlabs/Module/Group.php:187
+msgid "Members are visible to other channels"
+msgstr "Los miembros son visibles para otros canales"
+
+#: ../../Zotlabs/Module/Group.php:111
+msgid "Privacy group removed."
+msgstr "Grupo de canales eliminado."
+
+#: ../../Zotlabs/Module/Group.php:113
+msgid "Unable to remove privacy group."
+msgstr "Imposible eliminar el grupo de canales."
+
+#: ../../Zotlabs/Module/Group.php:183
+msgid "Privacy group editor"
+msgstr "Editor de grupos de canales"
+
+#: ../../Zotlabs/Module/Group.php:197
+msgid "Members"
+msgstr "Miembros"
+
+#: ../../Zotlabs/Module/Group.php:199
+msgid "All Connected Channels"
+msgstr "Todos los canales conectados"
+
+#: ../../Zotlabs/Module/Group.php:231
+msgid "Click on a channel to add or remove."
+msgstr "Haga clic en un canal para agregarlo o quitarlo."
+
+#: ../../Zotlabs/Module/Help.php:26
+msgid "Documentation Search"
+msgstr "Búsqueda de Documentación"
+
+#: ../../Zotlabs/Module/Help.php:67 ../../Zotlabs/Module/Help.php:73
+#: ../../Zotlabs/Module/Help.php:79
+msgid "Help:"
+msgstr "Ayuda:"
+
+#: ../../Zotlabs/Module/Help.php:85 ../../Zotlabs/Module/Help.php:90
+#: ../../Zotlabs/Module/Layouts.php:181 ../../include/apps.php:142
+#: ../../include/nav.php:161
+msgid "Help"
+msgstr "Ayuda"
+
+#: ../../Zotlabs/Module/Help.php:120
+msgid "$Projectname Documentation"
+msgstr "Documentación de $Projectname"
+
+#: ../../Zotlabs/Module/Home.php:61 ../../Zotlabs/Module/Home.php:69
+#: ../../Zotlabs/Module/Siteinfo.php:65
+msgid "$Projectname"
+msgstr "$Projectname"
+
+#: ../../Zotlabs/Module/Home.php:79
+#, php-format
+msgid "Welcome to %s"
+msgstr "Bienvenido a %s"
+
+#: ../../Zotlabs/Module/Id.php:13
+msgid "First Name"
+msgstr "Nombre"
+
+#: ../../Zotlabs/Module/Id.php:14
+msgid "Last Name"
+msgstr "Apellido"
+
+#: ../../Zotlabs/Module/Id.php:15
+msgid "Nickname"
+msgstr "Sobrenombre o Alias"
+
+#: ../../Zotlabs/Module/Id.php:16
+msgid "Full Name"
+msgstr "Nombre completo"
+
+#: ../../Zotlabs/Module/Id.php:19 ../../Zotlabs/Module/Id.php:20
+#: ../../Zotlabs/Module/Id.php:21 ../../include/apps.php:155
+msgid "Profile Photo"
+msgstr "Foto del perfil"
+
+#: ../../Zotlabs/Module/Id.php:22
+msgid "Profile Photo 16px"
+msgstr "Foto del perfil 16px"
+
+#: ../../Zotlabs/Module/Id.php:23
+msgid "Profile Photo 32px"
+msgstr "Foto del perfil 32px"
+
+#: ../../Zotlabs/Module/Id.php:24
+msgid "Profile Photo 48px"
+msgstr "Foto del perfil 48px"
+
+#: ../../Zotlabs/Module/Id.php:25
+msgid "Profile Photo 64px"
+msgstr "Foto del perfil 64px"
+
+#: ../../Zotlabs/Module/Id.php:26
+msgid "Profile Photo 80px"
+msgstr "Foto del perfil 80px"
+
+#: ../../Zotlabs/Module/Id.php:27
+msgid "Profile Photo 128px"
+msgstr "Foto del perfil 128px"
+
+#: ../../Zotlabs/Module/Id.php:28
+msgid "Timezone"
+msgstr "Huso horario"
+
+#: ../../Zotlabs/Module/Id.php:29 ../../Zotlabs/Module/Profiles.php:734
+msgid "Homepage URL"
+msgstr "Dirección de la página personal"
+
+#: ../../Zotlabs/Module/Id.php:30 ../../include/apps.php:153
+msgid "Language"
+msgstr "Idioma"
+
+#: ../../Zotlabs/Module/Id.php:31
+msgid "Birth Year"
+msgstr "Año de nacimiento"
+
+#: ../../Zotlabs/Module/Id.php:32
+msgid "Birth Month"
+msgstr "Mes de nacimiento"
+
+#: ../../Zotlabs/Module/Id.php:33
+msgid "Birth Day"
+msgstr "Día de nacimiento"
+
+#: ../../Zotlabs/Module/Id.php:34
+msgid "Birthdate"
+msgstr "Fecha de nacimiento"
+
+#: ../../Zotlabs/Module/Id.php:35 ../../Zotlabs/Module/Profiles.php:453
+msgid "Gender"
+msgstr "Género"
+
+#: ../../Zotlabs/Module/Id.php:108 ../../include/profile_selectors.php:6
+#: ../../include/profile_selectors.php:23
+msgid "Male"
+msgstr "Hombre"
+
+#: ../../Zotlabs/Module/Id.php:110 ../../include/profile_selectors.php:6
+#: ../../include/profile_selectors.php:23
+msgid "Female"
+msgstr "Mujer"
+
+#: ../../Zotlabs/Module/Impel.php:41 ../../include/bbcode.php:193
+msgid "webpage"
+msgstr "página web"
+
+#: ../../Zotlabs/Module/Impel.php:46 ../../include/bbcode.php:199
+msgid "block"
+msgstr "bloque"
+
+#: ../../Zotlabs/Module/Impel.php:51 ../../include/bbcode.php:196
+msgid "layout"
+msgstr "plantilla"
+
+#: ../../Zotlabs/Module/Impel.php:58 ../../include/bbcode.php:202
+msgid "menu"
+msgstr "menú"
+
+#: ../../Zotlabs/Module/Impel.php:196
+#, php-format
+msgid "%s element installed"
+msgstr "%s elemento instalado"
+
+#: ../../Zotlabs/Module/Impel.php:199
+#, php-format
+msgid "%s element installation failed"
+msgstr "Elemento con instalación fallida: %s"
+
+#: ../../Zotlabs/Module/Import.php:32
+#, php-format
+msgid "Your service plan only allows %d channels."
+msgstr "Su paquete de servicios solo permite %d canales."
+
+#: ../../Zotlabs/Module/Import.php:70 ../../Zotlabs/Module/Import_items.php:42
+msgid "Nothing to import."
+msgstr "No hay nada para importar."
+
+#: ../../Zotlabs/Module/Import.php:94 ../../Zotlabs/Module/Import_items.php:66
+msgid "Unable to download data from old server"
+msgstr "No se han podido descargar datos de su antiguo servidor"
+
+#: ../../Zotlabs/Module/Import.php:100
+#: ../../Zotlabs/Module/Import_items.php:72
+msgid "Imported file is empty."
+msgstr "El fichero importado está vacío."
+
+#: ../../Zotlabs/Module/Import.php:122
+#: ../../Zotlabs/Module/Import_items.php:86
+#, php-format
+msgid "Warning: Database versions differ by %1$d updates."
+msgstr "Atención: Las versiones de la base de datos difieren en %1$d actualizaciones."
+
+#: ../../Zotlabs/Module/Import.php:150 ../../include/import.php:80
+msgid "Cloned channel not found. Import failed."
+msgstr "No se ha podido importar el canal porque el canal clonado no se ha encontrado."
+
+#: ../../Zotlabs/Module/Import.php:160
+msgid "No channel. Import failed."
+msgstr "No hay canal. La importación ha fallado"
+
+#: ../../Zotlabs/Module/Import.php:506
+#: ../../include/Import/import_diaspora.php:143
+msgid "Import completed."
+msgstr "Importación completada."
+
+#: ../../Zotlabs/Module/Import.php:528
+msgid "You must be logged in to use this feature."
+msgstr "Debe estar registrado para poder usar esta funcionalidad."
+
+#: ../../Zotlabs/Module/Import.php:533
+msgid "Import Channel"
+msgstr "Importar canal"
+
+#: ../../Zotlabs/Module/Import.php:534
+msgid ""
+"Use this form to import an existing channel from a different server/hub. You"
+" may retrieve the channel identity from the old server/hub via the network "
+"or provide an export file."
+msgstr "Emplee este formulario para importar un canal desde un servidor/hub diferente. Puede recuperar el canal desde el antiguo servidor/hub a través de la red o proporcionando un fichero de exportación."
+
+#: ../../Zotlabs/Module/Import.php:535
+#: ../../Zotlabs/Module/Import_items.php:119
+msgid "File to Upload"
+msgstr "Fichero para subir"
+
+#: ../../Zotlabs/Module/Import.php:536
+msgid "Or provide the old server/hub details"
+msgstr "O proporcione los detalles de su antiguo servidor/hub"
+
+#: ../../Zotlabs/Module/Import.php:537
+msgid "Your old identity address (xyz@example.com)"
+msgstr "Su identidad en el antiguo servidor (canal@ejemplo.com)"
+
+#: ../../Zotlabs/Module/Import.php:538
+msgid "Your old login email address"
+msgstr "Su antigua dirección de correo electrónico"
+
+#: ../../Zotlabs/Module/Import.php:539
+msgid "Your old login password"
+msgstr "Su antigua contraseña"
+
+#: ../../Zotlabs/Module/Import.php:540
+msgid ""
+"For either option, please choose whether to make this hub your new primary "
+"address, or whether your old location should continue this role. You will be"
+" able to post from either location, but only one can be marked as the "
+"primary location for files, photos, and media."
+msgstr "Para cualquiera de las opciones, elija si hacer de este servidor su nueva dirección primaria, o si su antigua dirección debe continuar con este papel. Usted podrá publicar desde cualquier ubicación, pero sólo una puede estar marcada como la ubicación principal para los ficheros, fotos y otras imágenes o vídeos."
+
+#: ../../Zotlabs/Module/Import.php:541
+msgid "Make this hub my primary location"
+msgstr "Convertir este servidor en mi ubicación primaria"
+
+#: ../../Zotlabs/Module/Import.php:542
+msgid ""
+"Import existing posts if possible (experimental - limited by available "
+"memory"
+msgstr "Importar el contenido publicado si es posible (experimental - limitado por la memoria disponible"
+
+#: ../../Zotlabs/Module/Import.php:543
+msgid ""
+"This process may take several minutes to complete. Please submit the form "
+"only once and leave this page open until finished."
+msgstr "Este proceso puede tardar varios minutos en completarse. Por favor envíe el formulario una sola vez y mantenga esta página abierta hasta que termine."
+
+#: ../../Zotlabs/Module/Import_items.php:102
+msgid "Import completed"
+msgstr "Importación completada"
+
+#: ../../Zotlabs/Module/Import_items.php:117
+msgid "Import Items"
+msgstr "Importar elementos"
+
+#: ../../Zotlabs/Module/Import_items.php:118
+msgid ""
+"Use this form to import existing posts and content from an export file."
+msgstr "Utilice este formulario para importar entradas existentes y contenido desde un archivo de exportación."
+
+#: ../../Zotlabs/Module/Invite.php:29
+msgid "Total invitation limit exceeded."
+msgstr "Se ha superado el límite máximo de invitaciones."
+
+#: ../../Zotlabs/Module/Invite.php:53
+#, php-format
+msgid "%s : Not a valid email address."
+msgstr "%s : No es una dirección de correo electrónico válida. "
+
+#: ../../Zotlabs/Module/Invite.php:63
+msgid "Please join us on $Projectname"
+msgstr "Únase a nosotros en $Projectname"
+
+#: ../../Zotlabs/Module/Invite.php:74
+msgid "Invitation limit exceeded. Please contact your site administrator."
+msgstr "Excedido el límite de invitaciones. Por favor, contacte con el Administrador de su sitio."
+
+#: ../../Zotlabs/Module/Invite.php:79
+#, php-format
+msgid "%s : Message delivery failed."
+msgstr "%s : Falló el envío del mensaje."
+
+#: ../../Zotlabs/Module/Invite.php:83
+#, php-format
+msgid "%d message sent."
+msgid_plural "%d messages sent."
+msgstr[0] "%d mensajes enviados."
+msgstr[1] "%d mensajes enviados."
+
+#: ../../Zotlabs/Module/Invite.php:102
+msgid "You have no more invitations available"
+msgstr "No tiene más invitaciones disponibles"
+
+#: ../../Zotlabs/Module/Invite.php:133
+msgid "Send invitations"
+msgstr "Enviar invitaciones"
+
+#: ../../Zotlabs/Module/Invite.php:134
+msgid "Enter email addresses, one per line:"
+msgstr "Introduzca las direcciones de correo electrónico, una por línea:"
+
+#: ../../Zotlabs/Module/Invite.php:135 ../../Zotlabs/Module/Mail.php:250
+msgid "Your message:"
+msgstr "Su mensaje:"
+
+#: ../../Zotlabs/Module/Invite.php:136
+msgid "Please join my community on $Projectname."
+msgstr "Por favor, únase a mi comunidad en $Projectname."
+
+#: ../../Zotlabs/Module/Invite.php:138
+msgid "You will need to supply this invitation code:"
+msgstr "Tendrá que suministrar este código de invitación:"
+
+#: ../../Zotlabs/Module/Invite.php:139
+msgid ""
+"1. Register at any $Projectname location (they are all inter-connected)"
+msgstr "1. Regístrese en cualquier sitio de $Projectname (están todos interconectados)"
+
+#: ../../Zotlabs/Module/Invite.php:141
+msgid "2. Enter my $Projectname network address into the site searchbar."
+msgstr "2. Introduzca mi dirección $Projectname en la caja de búsqueda del sitio."
+
+#: ../../Zotlabs/Module/Invite.php:142
+msgid "or visit"
+msgstr "o visitar"
+
+#: ../../Zotlabs/Module/Invite.php:144
+msgid "3. Click [Connect]"
+msgstr "3. Pulse [conectar]"
+
+#: ../../Zotlabs/Module/Item.php:178
+msgid "Unable to locate original post."
+msgstr "No ha sido posible encontrar la entrada original."
+
+#: ../../Zotlabs/Module/Item.php:427
+msgid "Empty post discarded."
+msgstr "La entrada vacía ha sido desechada."
+
+#: ../../Zotlabs/Module/Item.php:467
+msgid "Executable content type not permitted to this channel."
+msgstr "Contenido de tipo ejecutable no permitido en este canal."
+
+#: ../../Zotlabs/Module/Item.php:847
+msgid "Duplicate post suppressed."
+msgstr "Se ha suprimido la entrada duplicada."
+
+#: ../../Zotlabs/Module/Item.php:977
+msgid "System error. Post not saved."
+msgstr "Error del sistema. La entrada no se ha podido salvar."
+
+#: ../../Zotlabs/Module/Item.php:1241
+msgid "Unable to obtain post information from database."
+msgstr "No ha sido posible obtener información de la entrada en la base de datos."
+
+#: ../../Zotlabs/Module/Item.php:1248
+#, php-format
+msgid "You have reached your limit of %1$.0f top level posts."
+msgstr "Ha alcanzado su límite de %1$.0f entradas en la página principal."
+
+#: ../../Zotlabs/Module/Item.php:1255
+#, php-format
+msgid "You have reached your limit of %1$.0f webpages."
+msgstr "Ha alcanzado su límite de %1$.0f páginas web."
+
+#: ../../Zotlabs/Module/Layouts.php:179 ../../include/text.php:2280
+msgid "Layouts"
+msgstr "Plantillas"
+
+#: ../../Zotlabs/Module/Layouts.php:181
+msgid "Comanche page description language help"
+msgstr "Página de ayuda del lenguaje de descripción de páginas (PDL) Comanche"
+
+#: ../../Zotlabs/Module/Layouts.php:185
+msgid "Layout Description"
+msgstr "Descripción de la plantilla"
+
+#: ../../Zotlabs/Module/Layouts.php:190
+msgid "Download PDL file"
+msgstr "Descargar el fichero PDL"
+
+#: ../../Zotlabs/Module/Like.php:19
+msgid "Like/Dislike"
+msgstr "Me gusta/No me gusta"
+
+#: ../../Zotlabs/Module/Like.php:24
+msgid "This action is restricted to members."
+msgstr "Esta acción está restringida solo para miembros."
+
+#: ../../Zotlabs/Module/Like.php:25
+msgid ""
+"Please <a href=\"rmagic\">login with your $Projectname ID</a> or <a "
+"href=\"register\">register as a new $Projectname member</a> to continue."
+msgstr "Por favor, <a href=\"rmagic\">identifíquese con su $Projectname ID</a> o <a href=\"register\">rregístrese como un nuevo $Projectname member</a> para continuar."
+
+#: ../../Zotlabs/Module/Like.php:105 ../../Zotlabs/Module/Like.php:131
+#: ../../Zotlabs/Module/Like.php:169
+msgid "Invalid request."
+msgstr "Solicitud incorrecta."
+
+#: ../../Zotlabs/Module/Like.php:117 ../../include/conversation.php:126
+msgid "channel"
+msgstr "el canal"
+
+#: ../../Zotlabs/Module/Like.php:146
+msgid "thing"
+msgstr "elemento"
+
+#: ../../Zotlabs/Module/Like.php:192
+msgid "Channel unavailable."
+msgstr "Canal no disponible."
+
+#: ../../Zotlabs/Module/Like.php:240
+msgid "Previous action reversed."
+msgstr "Acción anterior revocada."
+
+#: ../../Zotlabs/Module/Like.php:371 ../../Zotlabs/Module/Subthread.php:87
+#: ../../Zotlabs/Module/Tagger.php:47 ../../include/conversation.php:120
+#: ../../include/text.php:1967
+msgid "photo"
+msgstr "foto"
+
+#: ../../Zotlabs/Module/Like.php:371 ../../Zotlabs/Module/Subthread.php:87
+#: ../../include/conversation.php:148 ../../include/text.php:1973
+msgid "status"
+msgstr "el mensaje de estado"
+
+#: ../../Zotlabs/Module/Like.php:420 ../../include/conversation.php:164
+#, php-format
+msgid "%1$s likes %2$s's %3$s"
+msgstr "A %1$s le gusta %3$s de %2$s"
+
+#: ../../Zotlabs/Module/Like.php:422 ../../include/conversation.php:167
+#, php-format
+msgid "%1$s doesn't like %2$s's %3$s"
+msgstr "A %1$s no le gusta %3$s de %2$s"
+
+#: ../../Zotlabs/Module/Like.php:424
+#, php-format
+msgid "%1$s agrees with %2$s's %3$s"
+msgstr "%3$s de %2$s: %1$s está de acuerdo"
+
+#: ../../Zotlabs/Module/Like.php:426
+#, php-format
+msgid "%1$s doesn't agree with %2$s's %3$s"
+msgstr "%3$s de %2$s: %1$s no está de acuerdo"
+
+#: ../../Zotlabs/Module/Like.php:428
+#, php-format
+msgid "%1$s abstains from a decision on %2$s's %3$s"
+msgstr "%3$s de %2$s: %1$s se abstiene"
+
+#: ../../Zotlabs/Module/Like.php:430
+#, php-format
+msgid "%1$s is attending %2$s's %3$s"
+msgstr "%3$s de %2$s: %1$s participa"
+
+#: ../../Zotlabs/Module/Like.php:432
+#, php-format
+msgid "%1$s is not attending %2$s's %3$s"
+msgstr "%3$s de %2$s: %1$s no participa"
+
+#: ../../Zotlabs/Module/Like.php:434
+#, php-format
+msgid "%1$s may attend %2$s's %3$s"
+msgstr "%3$s de %2$s: %1$s quizá participe"
+
+#: ../../Zotlabs/Module/Like.php:537
+msgid "Action completed."
+msgstr "Acción completada."
+
+#: ../../Zotlabs/Module/Like.php:538
+msgid "Thank you."
+msgstr "Gracias."
+
+#: ../../Zotlabs/Module/Lockview.php:61
+msgid "Remote privacy information not available."
+msgstr "La información privada remota no está disponible."
+
+#: ../../Zotlabs/Module/Lockview.php:82
+msgid "Visible to:"
+msgstr "Visible para:"
+
+#: ../../Zotlabs/Module/Locs.php:25 ../../Zotlabs/Module/Locs.php:54
+msgid "Location not found."
+msgstr "Dirección no encontrada."
+
+#: ../../Zotlabs/Module/Locs.php:62
+msgid "Location lookup failed."
+msgstr "Ha fallado la búsqueda de la dirección."
+
+#: ../../Zotlabs/Module/Locs.php:66
+msgid ""
+"Please select another location to become primary before removing the primary"
+" location."
+msgstr "Por favor, seleccione una copia de su canal (un clon) para convertirlo en primario antes de eliminar su canal principal."
+
+#: ../../Zotlabs/Module/Locs.php:95
+msgid "Syncing locations"
+msgstr "Sincronización de ubicaciones"
+
+#: ../../Zotlabs/Module/Locs.php:105
+msgid "No locations found."
+msgstr "No encontrada ninguna dirección."
+
+#: ../../Zotlabs/Module/Locs.php:116
+msgid "Manage Channel Locations"
+msgstr "Gestionar las direcciones del canal"
+
+#: ../../Zotlabs/Module/Locs.php:119
+msgid "Primary"
+msgstr "Primario"
+
+#: ../../Zotlabs/Module/Locs.php:120 ../../Zotlabs/Module/Menu.php:113
+msgid "Drop"
+msgstr "Eliminar"
+
+#: ../../Zotlabs/Module/Locs.php:122
+msgid "Sync Now"
+msgstr "Sincronizar ahora"
+
+#: ../../Zotlabs/Module/Locs.php:123
+msgid "Please wait several minutes between consecutive operations."
+msgstr "Por favor, espere algunos minutos entre operaciones consecutivas."
+
+#: ../../Zotlabs/Module/Locs.php:124
+msgid ""
+"When possible, drop a location by logging into that website/hub and removing"
+" your channel."
+msgstr "Cuando sea posible, elimine una ubicación iniciando sesión en el sitio web o \"hub\" y borrando su canal."
+
+#: ../../Zotlabs/Module/Locs.php:125
+msgid "Use this form to drop the location if the hub is no longer operating."
+msgstr "Utilice este formulario para eliminar la dirección si el \"hub\" no está funcionando desde hace tiempo."
+
+#: ../../Zotlabs/Module/Lostpass.php:19
+msgid "No valid account found."
+msgstr "No se ha encontrado una cuenta válida."
+
+#: ../../Zotlabs/Module/Lostpass.php:33
+msgid "Password reset request issued. Check your email."
+msgstr "Se ha recibido una solicitud de restablecimiento de contraseña. Consulte su correo electrónico."
+
+#: ../../Zotlabs/Module/Lostpass.php:39 ../../Zotlabs/Module/Lostpass.php:107
+#, php-format
+msgid "Site Member (%s)"
+msgstr "Usuario del sitio (%s)"
+
+#: ../../Zotlabs/Module/Lostpass.php:44
+#, php-format
+msgid "Password reset requested at %s"
+msgstr "Se ha solicitado restablecer la contraseña en %s"
+
+#: ../../Zotlabs/Module/Lostpass.php:67
+msgid ""
+"Request could not be verified. (You may have previously submitted it.) "
+"Password reset failed."
+msgstr "La solicitud no ha podido ser verificada. (Puede que la haya enviado con anterioridad) El restablecimiento de la contraseña ha fallado."
+
+#: ../../Zotlabs/Module/Lostpass.php:90 ../../boot.php:1610
+msgid "Password Reset"
+msgstr "Restablecer la contraseña"
+
+#: ../../Zotlabs/Module/Lostpass.php:91
+msgid "Your password has been reset as requested."
+msgstr "Su contraseña ha sido restablecida según lo solicitó."
+
+#: ../../Zotlabs/Module/Lostpass.php:92
+msgid "Your new password is"
+msgstr "Su nueva contraseña es"
+
+#: ../../Zotlabs/Module/Lostpass.php:93
+msgid "Save or copy your new password - and then"
+msgstr "Guarde o copie su nueva contraseña - y después"
+
+#: ../../Zotlabs/Module/Lostpass.php:94
+msgid "click here to login"
+msgstr "pulse aquí para conectarse"
+
+#: ../../Zotlabs/Module/Lostpass.php:95
+msgid ""
+"Your password may be changed from the <em>Settings</em> page after "
+"successful login."
+msgstr "Puede cambiar la contraseña en la página <em>Ajustes</em> una vez iniciada la sesión."
+
+#: ../../Zotlabs/Module/Lostpass.php:112
+#, php-format
+msgid "Your password has changed at %s"
+msgstr "Su contraseña en %s ha sido cambiada"
+
+#: ../../Zotlabs/Module/Lostpass.php:127
+msgid "Forgot your Password?"
+msgstr "¿Ha olvidado su contraseña?"
+
+#: ../../Zotlabs/Module/Lostpass.php:128
+msgid ""
+"Enter your email address and submit to have your password reset. Then check "
+"your email for further instructions."
+msgstr "Introduzca y envíe su dirección de correo electrónico para el restablecimiento de su contraseña. Luego revise su correo para obtener más instrucciones."
+
+#: ../../Zotlabs/Module/Lostpass.php:129
+msgid "Email Address"
+msgstr "Dirección de correo electrónico"
+
+#: ../../Zotlabs/Module/Lostpass.php:130
+msgid "Reset"
+msgstr "Reiniciar"
+
+#: ../../Zotlabs/Module/Magic.php:73
+msgid "Hub not found."
+msgstr "Servidor no encontrado"
+
+#: ../../Zotlabs/Module/Mail.php:38
+msgid "Unable to lookup recipient."
+msgstr "Imposible asociar a un destinatario."
+
+#: ../../Zotlabs/Module/Mail.php:46
+msgid "Unable to communicate with requested channel."
+msgstr "Imposible comunicar con el canal solicitado."
+
+#: ../../Zotlabs/Module/Mail.php:53
+msgid "Cannot verify requested channel."
+msgstr "No se puede verificar el canal solicitado."
+
+#: ../../Zotlabs/Module/Mail.php:79
+msgid "Selected channel has private message restrictions. Send failed."
+msgstr "El canal seleccionado tiene restricciones sobre los mensajes privados. El envío falló."
+
+#: ../../Zotlabs/Module/Mail.php:144
+msgid "Messages"
+msgstr "Mensajes"
+
+#: ../../Zotlabs/Module/Mail.php:179
+msgid "Message recalled."
+msgstr "Mensaje revocado."
+
+#: ../../Zotlabs/Module/Mail.php:192
+msgid "Conversation removed."
+msgstr "Conversación eliminada."
+
+#: ../../Zotlabs/Module/Mail.php:235
+msgid "Requested channel is not in this network"
+msgstr "El canal solicitado no existe en esta red"
+
+#: ../../Zotlabs/Module/Mail.php:243
+msgid "Send Private Message"
+msgstr "Enviar un mensaje privado"
+
+#: ../../Zotlabs/Module/Mail.php:244 ../../Zotlabs/Module/Mail.php:374
+msgid "To:"
+msgstr "Para:"
+
+#: ../../Zotlabs/Module/Mail.php:247 ../../Zotlabs/Module/Mail.php:376
+msgid "Subject:"
+msgstr "Asunto:"
+
+#: ../../Zotlabs/Module/Mail.php:254
+msgid "Send"
+msgstr "Enviar"
+
+#: ../../Zotlabs/Module/Mail.php:346
+msgid "Delete message"
+msgstr "Borrar mensaje"
+
+#: ../../Zotlabs/Module/Mail.php:347
+msgid "Delivery report"
+msgstr "Informe de transmisión"
+
+#: ../../Zotlabs/Module/Mail.php:348
+msgid "Recall message"
+msgstr "Revocar el mensaje"
+
+#: ../../Zotlabs/Module/Mail.php:350
+msgid "Message has been recalled."
+msgstr "El mensaje ha sido revocado."
+
+#: ../../Zotlabs/Module/Mail.php:367
+msgid "Delete Conversation"
+msgstr "Eliminar conversación"
+
+#: ../../Zotlabs/Module/Mail.php:369
+msgid ""
+"No secure communications available. You <strong>may</strong> be able to "
+"respond from the sender's profile page."
+msgstr "Comunicación segura no disponible. Pero <strong>puede</strong> responder desde la página del perfil del remitente."
+
+#: ../../Zotlabs/Module/Mail.php:373
+msgid "Send Reply"
+msgstr "Responder"
+
+#: ../../Zotlabs/Module/Mail.php:378
+#, php-format
+msgid "Your message for %s (%s):"
+msgstr "Su mensaje para %s (%s):"
+
+#: ../../Zotlabs/Module/Manage.php:134
+#: ../../Zotlabs/Module/New_channel.php:121
+#, php-format
+msgid "You have created %1$.0f of %2$.0f allowed channels."
+msgstr "Ha creado %1$.0f de %2$.0f canales permitidos."
+
+#: ../../Zotlabs/Module/Manage.php:141
+msgid "Create a new channel"
+msgstr "Crear un nuevo canal"
+
+#: ../../Zotlabs/Module/Manage.php:162 ../../include/apps.php:132
+#: ../../include/nav.php:209
+msgid "Channel Manager"
+msgstr "Administración de canales"
+
+#: ../../Zotlabs/Module/Manage.php:163
+msgid "Current Channel"
+msgstr "Canal actual"
+
+#: ../../Zotlabs/Module/Manage.php:165
+msgid "Switch to one of your channels by selecting it."
+msgstr "Cambiar a uno de sus canales seleccionándolo."
+
+#: ../../Zotlabs/Module/Manage.php:166
+msgid "Default Channel"
+msgstr "Canal principal"
+
+#: ../../Zotlabs/Module/Manage.php:167
+msgid "Make Default"
+msgstr "Convertir en predeterminado"
+
+#: ../../Zotlabs/Module/Manage.php:170
+#, php-format
+msgid "%d new messages"
+msgstr "%d mensajes nuevos"
+
+#: ../../Zotlabs/Module/Manage.php:171
+#, php-format
+msgid "%d new introductions"
+msgstr "%d nuevas isolicitudes de conexión"
+
+#: ../../Zotlabs/Module/Manage.php:173
+msgid "Delegated Channel"
+msgstr "Canal delegado"
+
+#: ../../Zotlabs/Module/Match.php:26
+msgid "Profile Match"
+msgstr "Perfil compatible"
+
+#: ../../Zotlabs/Module/Match.php:35
+msgid "No keywords to match. Please add keywords to your default profile."
+msgstr "No hay palabras clave en el perfil principal para poder encontrar perfiles compatibles. Por favor, añada palabras clave a su perfil principal."
+
+#: ../../Zotlabs/Module/Match.php:67
+msgid "is interested in:"
+msgstr "está interesado en:"
+
+#: ../../Zotlabs/Module/Match.php:74
+msgid "No matches"
+msgstr "No se han encontrado perfiles compatibles"
+
+#: ../../Zotlabs/Module/Menu.php:49
+msgid "Unable to update menu."
+msgstr "No se puede actualizar el menú."
+
+#: ../../Zotlabs/Module/Menu.php:60
+msgid "Unable to create menu."
+msgstr "No se puede crear el menú."
+
+#: ../../Zotlabs/Module/Menu.php:98 ../../Zotlabs/Module/Menu.php:110
+msgid "Menu Name"
+msgstr "Nombre del menú"
+
+#: ../../Zotlabs/Module/Menu.php:98
+msgid "Unique name (not visible on webpage) - required"
+msgstr "Nombre único (no será visible en la página web) - requerido"
+
+#: ../../Zotlabs/Module/Menu.php:99 ../../Zotlabs/Module/Menu.php:111
+msgid "Menu Title"
+msgstr "Título del menú"
+
+#: ../../Zotlabs/Module/Menu.php:99
+msgid "Visible on webpage - leave empty for no title"
+msgstr "Visible en la página web - no ponga nada si no desea un título"
+
+#: ../../Zotlabs/Module/Menu.php:100
+msgid "Allow Bookmarks"
+msgstr "Permitir marcadores"
+
+#: ../../Zotlabs/Module/Menu.php:100 ../../Zotlabs/Module/Menu.php:157
+msgid "Menu may be used to store saved bookmarks"
+msgstr "El menú se puede usar para guardar marcadores"
+
+#: ../../Zotlabs/Module/Menu.php:101 ../../Zotlabs/Module/Menu.php:159
+msgid "Submit and proceed"
+msgstr "Enviar y proceder"
+
+#: ../../Zotlabs/Module/Menu.php:107 ../../include/text.php:2279
+msgid "Menus"
+msgstr "Menús"
+
+#: ../../Zotlabs/Module/Menu.php:117
+msgid "Bookmarks allowed"
+msgstr "Marcadores permitidos"
+
+#: ../../Zotlabs/Module/Menu.php:119
+msgid "Delete this menu"
+msgstr "Borrar este menú"
+
+#: ../../Zotlabs/Module/Menu.php:120 ../../Zotlabs/Module/Menu.php:154
+msgid "Edit menu contents"
+msgstr "Editar los contenidos del menú"
+
+#: ../../Zotlabs/Module/Menu.php:121
+msgid "Edit this menu"
+msgstr "Modificar este menú"
+
+#: ../../Zotlabs/Module/Menu.php:136
+msgid "Menu could not be deleted."
+msgstr "El menú no puede ser eliminado."
+
+#: ../../Zotlabs/Module/Menu.php:144 ../../Zotlabs/Module/Mitem.php:28
+msgid "Menu not found."
+msgstr "Menú no encontrado"
+
+#: ../../Zotlabs/Module/Menu.php:149
+msgid "Edit Menu"
+msgstr "Modificar el menú"
+
+#: ../../Zotlabs/Module/Menu.php:153
+msgid "Add or remove entries to this menu"
+msgstr "Añadir o quitar entradas en este menú"
+
+#: ../../Zotlabs/Module/Menu.php:155
+msgid "Menu name"
+msgstr "Nombre del menú"
+
+#: ../../Zotlabs/Module/Menu.php:155
+msgid "Must be unique, only seen by you"
+msgstr "Debe ser único, solo será visible para usted"
+
+#: ../../Zotlabs/Module/Menu.php:156
+msgid "Menu title"
+msgstr "Título del menú"
+
+#: ../../Zotlabs/Module/Menu.php:156
+msgid "Menu title as seen by others"
+msgstr "El título del menú tal como será visto por los demás"
+
+#: ../../Zotlabs/Module/Menu.php:157
+msgid "Allow bookmarks"
+msgstr "Permitir marcadores"
+
+#: ../../Zotlabs/Module/Menu.php:166 ../../Zotlabs/Module/Mitem.php:120
+#: ../../Zotlabs/Module/Xchan.php:41
+msgid "Not found."
+msgstr "No encontrado."
+
+#: ../../Zotlabs/Module/Mitem.php:52
+msgid "Unable to create element."
+msgstr "Imposible crear el elemento."
+
+#: ../../Zotlabs/Module/Mitem.php:76
+msgid "Unable to update menu element."
+msgstr "No es posible actualizar el elemento del menú."
+
+#: ../../Zotlabs/Module/Mitem.php:92
+msgid "Unable to add menu element."
+msgstr "No es posible añadir el elemento al menú"
+
+#: ../../Zotlabs/Module/Mitem.php:153 ../../Zotlabs/Module/Mitem.php:226
+msgid "Menu Item Permissions"
+msgstr "Permisos del elemento del menú"
+
+#: ../../Zotlabs/Module/Mitem.php:154 ../../Zotlabs/Module/Mitem.php:227
+#: ../../Zotlabs/Module/Settings.php:1066
+msgid "(click to open/close)"
+msgstr "(pulsar para abrir o cerrar)"
+
+#: ../../Zotlabs/Module/Mitem.php:156 ../../Zotlabs/Module/Mitem.php:172
+msgid "Link Name"
+msgstr "Nombre del enlace"
+
+#: ../../Zotlabs/Module/Mitem.php:157 ../../Zotlabs/Module/Mitem.php:231
+msgid "Link or Submenu Target"
+msgstr "Destino del enlace o submenú"
+
+#: ../../Zotlabs/Module/Mitem.php:157
+msgid "Enter URL of the link or select a menu name to create a submenu"
+msgstr "Introducir la dirección del enlace o seleccionar el nombre de un submenú"
+
+#: ../../Zotlabs/Module/Mitem.php:158 ../../Zotlabs/Module/Mitem.php:232
+msgid "Use magic-auth if available"
+msgstr "Usar la autenticación mágica si está disponible"
+
+#: ../../Zotlabs/Module/Mitem.php:159 ../../Zotlabs/Module/Mitem.php:233
+msgid "Open link in new window"
+msgstr "Abrir el enlace en una nueva ventana"
+
+#: ../../Zotlabs/Module/Mitem.php:160 ../../Zotlabs/Module/Mitem.php:234
+msgid "Order in list"
+msgstr "Orden en la lista"
+
+#: ../../Zotlabs/Module/Mitem.php:160 ../../Zotlabs/Module/Mitem.php:234
+msgid "Higher numbers will sink to bottom of listing"
+msgstr "Los números más altos irán al final de la lista"
+
+#: ../../Zotlabs/Module/Mitem.php:161
+msgid "Submit and finish"
+msgstr "Enviar y terminar"
+
+#: ../../Zotlabs/Module/Mitem.php:162
+msgid "Submit and continue"
+msgstr "Enviar y continuar"
+
+#: ../../Zotlabs/Module/Mitem.php:170
+msgid "Menu:"
+msgstr "Menú:"
+
+#: ../../Zotlabs/Module/Mitem.php:173
+msgid "Link Target"
+msgstr "Destino del enlace"
+
+#: ../../Zotlabs/Module/Mitem.php:176
+msgid "Edit menu"
+msgstr "Editar menú"
+
+#: ../../Zotlabs/Module/Mitem.php:179
+msgid "Edit element"
+msgstr "Editar el elemento"
+
+#: ../../Zotlabs/Module/Mitem.php:180
+msgid "Drop element"
+msgstr "Eliminar el elemento"
+
+#: ../../Zotlabs/Module/Mitem.php:181
+msgid "New element"
+msgstr "Nuevo elemento"
+
+#: ../../Zotlabs/Module/Mitem.php:182
+msgid "Edit this menu container"
+msgstr "Modificar el contenedor del menú"
+
+#: ../../Zotlabs/Module/Mitem.php:183
+msgid "Add menu element"
+msgstr "Añadir un elemento al menú"
+
+#: ../../Zotlabs/Module/Mitem.php:184
+msgid "Delete this menu item"
+msgstr "Eliminar este elemento del menú"
+
+#: ../../Zotlabs/Module/Mitem.php:185
+msgid "Edit this menu item"
+msgstr "Modificar este elemento del menú"
+
+#: ../../Zotlabs/Module/Mitem.php:202
+msgid "Menu item not found."
+msgstr "Este elemento del menú no se ha encontrado"
+
+#: ../../Zotlabs/Module/Mitem.php:215
+msgid "Menu item deleted."
+msgstr "Este elemento del menú ha sido borrado"
+
+#: ../../Zotlabs/Module/Mitem.php:217
+msgid "Menu item could not be deleted."
+msgstr "Este elemento del menú no puede ser borrado."
+
+#: ../../Zotlabs/Module/Mitem.php:224
+msgid "Edit Menu Element"
+msgstr "Editar elemento del menú"
+
+#: ../../Zotlabs/Module/Mitem.php:230
+msgid "Link text"
+msgstr "Texto del enlace"
+
+#: ../../Zotlabs/Module/Mood.php:67 ../../include/conversation.php:260
+#, php-format
+msgctxt "mood"
+msgid "%1$s is %2$s"
+msgstr "%1$s está %2$s"
+
+#: ../../Zotlabs/Module/Mood.php:135 ../../include/apps.php:144
+msgid "Mood"
+msgstr "Estado de ánimo"
+
+#: ../../Zotlabs/Module/Mood.php:136
+msgid "Set your current mood and tell your friends"
+msgstr "Describir su estado de ánimo para comunicárselo a sus amigos"
+
+#: ../../Zotlabs/Module/Network.php:95
+msgid "No such group"
+msgstr "No se encuentra el grupo"
+
+#: ../../Zotlabs/Module/Network.php:135
+msgid "No such channel"
+msgstr "No se encuentra el canal"
+
+#: ../../Zotlabs/Module/Network.php:140
+msgid "forum"
+msgstr "foro"
+
+#: ../../Zotlabs/Module/Network.php:152
+msgid "Search Results For:"
+msgstr "Buscar resultados para:"
+
+#: ../../Zotlabs/Module/Network.php:216
+msgid "Privacy group is empty"
+msgstr "El grupo de canales está vacío"
+
+#: ../../Zotlabs/Module/Network.php:225
+msgid "Privacy group: "
+msgstr "Grupo de canales: "
+
+#: ../../Zotlabs/Module/Network.php:251
+msgid "Invalid connection."
+msgstr "Conexión no válida."
+
+#: ../../Zotlabs/Module/New_channel.php:128
+#: ../../Zotlabs/Module/Register.php:231
+msgid "Name or caption"
+msgstr "Nombre o descripción"
+
+#: ../../Zotlabs/Module/New_channel.php:128
+#: ../../Zotlabs/Module/Register.php:231
+msgid "Examples: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \"Aviation Group\""
+msgstr "Ejemplos: \"Juan García\", \"Luisa y sus caballos\", \"Fútbol\", \"Grupo de aviación\""
+
+#: ../../Zotlabs/Module/New_channel.php:130
+#: ../../Zotlabs/Module/Register.php:233
+msgid "Choose a short nickname"
+msgstr "Elija un alias corto"
+
+#: ../../Zotlabs/Module/New_channel.php:130
+#: ../../Zotlabs/Module/Register.php:233
+#, php-format
+msgid ""
+"Your nickname will be used to create an easy to remember channel address "
+"e.g. nickname%s"
+msgstr "Su alias se usará para crear una dirección de canal fácil de recordar, p. ej.: alias%s"
+
+#: ../../Zotlabs/Module/New_channel.php:132
+#: ../../Zotlabs/Module/Register.php:235
+msgid "Channel role and privacy"
+msgstr "Clase de canal y privacidad"
+
+#: ../../Zotlabs/Module/New_channel.php:132
+#: ../../Zotlabs/Module/Register.php:235
+msgid "Select a channel role with your privacy requirements."
+msgstr "Seleccione un tipo de canal con sus requisitos de privacidad"
+
+#: ../../Zotlabs/Module/New_channel.php:132
+#: ../../Zotlabs/Module/Register.php:235
+msgid "Read more about roles"
+msgstr "Leer más sobre los roles"
+
+#: ../../Zotlabs/Module/New_channel.php:135
+msgid "Create Channel"
+msgstr "Crear un canal"
+
+#: ../../Zotlabs/Module/New_channel.php:136
+msgid ""
+"A channel is your identity on this network. It can represent a person, a "
+"blog, or a forum to name a few. Channels can make connections with other "
+"channels to share information with highly detailed permissions."
+msgstr "Un canal es su identidad en esta red. Puede representar a una persona, un blog o un foro, por nombrar unos pocos ejemplos. Los canales se pueden conectar con otros canales para compartir información con una gama de permisos extremadamente detallada."
+
+#: ../../Zotlabs/Module/New_channel.php:137
+msgid ""
+"or <a href=\"import\">import an existing channel</a> from another location."
+msgstr "O <a href=\"import\">importar un canal existente</a> desde otro lugar."
+
+#: ../../Zotlabs/Module/Notifications.php:30
+msgid "Invalid request identifier."
+msgstr "Petición inválida del identificador."
+
+#: ../../Zotlabs/Module/Notifications.php:39
+msgid "Discard"
+msgstr "Descartar"
+
+#: ../../Zotlabs/Module/Notifications.php:98
+#: ../../Zotlabs/Module/Notify.php:57
+msgid "No more system notifications."
+msgstr "No hay más notificaciones del sistema"
+
+#: ../../Zotlabs/Module/Notifications.php:102
+#: ../../Zotlabs/Module/Notify.php:61
+msgid "System Notifications"
+msgstr "Notificaciones del sistema"
+
+#: ../../Zotlabs/Module/Notifications.php:103 ../../include/nav.php:194
+msgid "Mark all system notifications seen"
+msgstr "Marcar todas las notificaciones de sistema como leídas"
+
+#: ../../Zotlabs/Module/Oexchange.php:27
+msgid "Unable to find your hub."
+msgstr "No se puede encontrar su servidor."
+
+#: ../../Zotlabs/Module/Oexchange.php:41
+msgid "Post successful."
+msgstr "Enviado con éxito."
+
+#: ../../Zotlabs/Module/Openid.php:30
+msgid "OpenID protocol error. No ID returned."
+msgstr "Error del protocolo OpenID. Ningún ID recibido como respuesta."
+
+#: ../../Zotlabs/Module/Openid.php:193 ../../include/auth.php:226
+msgid "Login failed."
+msgstr "El acceso ha fallado."
+
+#: ../../Zotlabs/Module/Page.php:133
+msgid ""
+"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod "
+"tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,"
+" quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo "
+"consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse "
+"cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat "
+"non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
+msgstr "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
+
+#: ../../Zotlabs/Module/Pconfig.php:26 ../../Zotlabs/Module/Pconfig.php:59
+msgid "This setting requires special processing and editing has been blocked."
+msgstr "Este ajuste necesita de un proceso especial y la edición ha sido bloqueada."
+
+#: ../../Zotlabs/Module/Pconfig.php:48
+msgid "Configuration Editor"
+msgstr "Editor de configuración"
+
+#: ../../Zotlabs/Module/Pconfig.php:49
+msgid ""
+"Warning: Changing some settings could render your channel inoperable. Please"
+" leave this page unless you are comfortable with and knowledgeable about how"
+" to correctly use this feature."
+msgstr "Atención: El cambio de algunos ajustes puede volver inutilizable su canal. Por favor, abandone la página excepto que esté seguro y sepa cómo usar correctamente esta característica."
+
+#: ../../Zotlabs/Module/Pdledit.php:18
+msgid "Layout updated."
+msgstr "Plantilla actualizada."
+
+#: ../../Zotlabs/Module/Pdledit.php:34 ../../Zotlabs/Module/Pdledit.php:61
+msgid "Edit System Page Description"
+msgstr "Editor del Sistema de Descripción de Páginas"
+
+#: ../../Zotlabs/Module/Pdledit.php:56
+msgid "Layout not found."
+msgstr "Plantilla no encontrada"
+
+#: ../../Zotlabs/Module/Pdledit.php:62
+msgid "Module Name:"
+msgstr "Nombre del módulo:"
+
+#: ../../Zotlabs/Module/Pdledit.php:63
+msgid "Layout Help"
+msgstr "Ayuda para el diseño de plantillas de página"
+
+#: ../../Zotlabs/Module/Photos.php:83
+msgid "Page owner information could not be retrieved."
+msgstr "La información del propietario de la página no pudo ser recuperada."
+
+#: ../../Zotlabs/Module/Photos.php:98 ../../Zotlabs/Module/Photos.php:742
+#: ../../Zotlabs/Module/Profile_photo.php:114
+#: ../../Zotlabs/Module/Profile_photo.php:206
+#: ../../Zotlabs/Module/Profile_photo.php:294
+#: ../../include/photo/photo_driver.php:722
+msgid "Profile Photos"
+msgstr "Fotos del perfil"
+
+#: ../../Zotlabs/Module/Photos.php:104 ../../Zotlabs/Module/Photos.php:148
+msgid "Album not found."
+msgstr "Álbum no encontrado."
+
+#: ../../Zotlabs/Module/Photos.php:131
+msgid "Delete Album"
+msgstr "Borrar álbum"
+
+#: ../../Zotlabs/Module/Photos.php:152
+msgid ""
+"Multiple storage folders exist with this album name, but within different "
+"directories. Please remove the desired folder or folders using the Files "
+"manager"
+msgstr "Hay varias carpetas con este nombre de álbum, pero dentro de diferentes directorios. Por favor, elimine la carpeta o carpetas que desee utilizando el administrador de ficheros"
+
+#: ../../Zotlabs/Module/Photos.php:209 ../../Zotlabs/Module/Photos.php:1052
+msgid "Delete Photo"
+msgstr "Borrar foto"
+
+#: ../../Zotlabs/Module/Photos.php:532
+msgid "No photos selected"
+msgstr "No hay fotos seleccionadas"
+
+#: ../../Zotlabs/Module/Photos.php:581
+msgid "Access to this item is restricted."
+msgstr "El acceso a este elemento está restringido."
+
+#: ../../Zotlabs/Module/Photos.php:620
+#, php-format
+msgid "%1$.2f MB of %2$.2f MB photo storage used."
+msgstr "%1$.2f MB de %2$.2f MB de almacenamiento de fotos utilizado."
+
+#: ../../Zotlabs/Module/Photos.php:623
+#, php-format
+msgid "%1$.2f MB photo storage used."
+msgstr "%1$.2f MB de almacenamiento de fotos utilizado."
+
+#: ../../Zotlabs/Module/Photos.php:659
+msgid "Upload Photos"
+msgstr "Subir fotos"
+
+#: ../../Zotlabs/Module/Photos.php:663
+msgid "Enter an album name"
+msgstr "Introducir un nombre de álbum"
+
+#: ../../Zotlabs/Module/Photos.php:664
+msgid "or select an existing album (doubleclick)"
+msgstr "o seleccionar uno existente (doble click)"
+
+#: ../../Zotlabs/Module/Photos.php:665
+msgid "Create a status post for this upload"
+msgstr "Crear un mensaje de estado para esta subida"
+
+#: ../../Zotlabs/Module/Photos.php:666
+msgid "Caption (optional):"
+msgstr "Título (opcional):"
+
+#: ../../Zotlabs/Module/Photos.php:667
+msgid "Description (optional):"
+msgstr "Descripción (opcional):"
+
+#: ../../Zotlabs/Module/Photos.php:694
+msgid "Album name could not be decoded"
+msgstr "El nombre del álbum no ha podido ser descifrado"
+
+#: ../../Zotlabs/Module/Photos.php:742 ../../Zotlabs/Module/Photos.php:1282
+#: ../../Zotlabs/Module/Photos.php:1299
+msgid "Contact Photos"
+msgstr "Fotos de contacto"
+
+#: ../../Zotlabs/Module/Photos.php:765
+msgid "Show Newest First"
+msgstr "Mostrar lo más reciente primero"
+
+#: ../../Zotlabs/Module/Photos.php:767
+msgid "Show Oldest First"
+msgstr "Mostrar lo más antiguo primero"
+
+#: ../../Zotlabs/Module/Photos.php:791 ../../Zotlabs/Module/Photos.php:1332
+#: ../../include/widgets.php:1451
+msgid "View Photo"
+msgstr "Ver foto"
+
+#: ../../Zotlabs/Module/Photos.php:822 ../../include/widgets.php:1468
+msgid "Edit Album"
+msgstr "Editar álbum"
+
+#: ../../Zotlabs/Module/Photos.php:869
+msgid "Permission denied. Access to this item may be restricted."
+msgstr "Permiso denegado. El acceso a este elemento puede estar restringido."
+
+#: ../../Zotlabs/Module/Photos.php:871
+msgid "Photo not available"
+msgstr "Foto no disponible"
+
+#: ../../Zotlabs/Module/Photos.php:929
+msgid "Use as profile photo"
+msgstr "Usar como foto del perfil"
+
+#: ../../Zotlabs/Module/Photos.php:930
+msgid "Use as cover photo"
+msgstr "Usar como imagen de portada del perfil"
+
+#: ../../Zotlabs/Module/Photos.php:937
+msgid "Private Photo"
+msgstr "Foto privada"
+
+#: ../../Zotlabs/Module/Photos.php:952
+msgid "View Full Size"
+msgstr "Ver tamaño completo"
+
+#: ../../Zotlabs/Module/Photos.php:997 ../../Zotlabs/Module/Tagrm.php:137
+msgid "Remove"
+msgstr "Eliminar"
+
+#: ../../Zotlabs/Module/Photos.php:1031
+msgid "Edit photo"
+msgstr "Editar foto"
+
+#: ../../Zotlabs/Module/Photos.php:1033
+msgid "Rotate CW (right)"
+msgstr "Girar CW (a la derecha)"
+
+#: ../../Zotlabs/Module/Photos.php:1034
+msgid "Rotate CCW (left)"
+msgstr "Girar CCW (a la izquierda)"
+
+#: ../../Zotlabs/Module/Photos.php:1037
+msgid "Enter a new album name"
+msgstr "Introducir un nuevo nombre de álbum"
+
+#: ../../Zotlabs/Module/Photos.php:1038
+msgid "or select an existing one (doubleclick)"
+msgstr "o seleccionar uno (doble click) existente"
+
+#: ../../Zotlabs/Module/Photos.php:1041
+msgid "Caption"
+msgstr "Título"
+
+#: ../../Zotlabs/Module/Photos.php:1043
+msgid "Add a Tag"
+msgstr "Añadir una etiqueta"
+
+#: ../../Zotlabs/Module/Photos.php:1047
+msgid "Example: @bob, @Barbara_Jensen, @jim@example.com"
+msgstr "Ejemplos: @eva, @Carmen_Osuna, @jaime@ejemplo.com"
+
+#: ../../Zotlabs/Module/Photos.php:1050
+msgid "Flag as adult in album view"
+msgstr "Marcar como \"solo para adultos\" en el álbum"
+
+#: ../../Zotlabs/Module/Photos.php:1069 ../../include/ItemObject.php:254
+msgid "I like this (toggle)"
+msgstr "Me gusta (cambiar)"
+
+#: ../../Zotlabs/Module/Photos.php:1070 ../../include/ItemObject.php:255
+msgid "I don't like this (toggle)"
+msgstr "No me gusta esto (cambiar)"
+
+#: ../../Zotlabs/Module/Photos.php:1088 ../../Zotlabs/Module/Photos.php:1206
+#: ../../include/ItemObject.php:700
+msgid "This is you"
+msgstr "Este es usted"
+
+#: ../../Zotlabs/Module/Photos.php:1090 ../../Zotlabs/Module/Photos.php:1208
+#: ../../include/ItemObject.php:702 ../../include/js_strings.php:6
+msgid "Comment"
+msgstr "Comentar"
+
+#: ../../Zotlabs/Module/Photos.php:1106 ../../include/conversation.php:574
+msgctxt "title"
+msgid "Likes"
+msgstr "Me gusta"
+
+#: ../../Zotlabs/Module/Photos.php:1106 ../../include/conversation.php:574
+msgctxt "title"
+msgid "Dislikes"
+msgstr "No me gusta"
+
+#: ../../Zotlabs/Module/Photos.php:1107 ../../include/conversation.php:575
+msgctxt "title"
+msgid "Agree"
+msgstr "De acuerdo"
+
+#: ../../Zotlabs/Module/Photos.php:1107 ../../include/conversation.php:575
+msgctxt "title"
+msgid "Disagree"
+msgstr "En desacuerdo"
+
+#: ../../Zotlabs/Module/Photos.php:1107 ../../include/conversation.php:575
+msgctxt "title"
+msgid "Abstain"
+msgstr "Abstención"
+
+#: ../../Zotlabs/Module/Photos.php:1108 ../../include/conversation.php:576
+msgctxt "title"
+msgid "Attending"
+msgstr "Participaré"
+
+#: ../../Zotlabs/Module/Photos.php:1108 ../../include/conversation.php:576
+msgctxt "title"
+msgid "Not attending"
+msgstr "No participaré"
+
+#: ../../Zotlabs/Module/Photos.php:1108 ../../include/conversation.php:576
+msgctxt "title"
+msgid "Might attend"
+msgstr "Quizá participe"
+
+#: ../../Zotlabs/Module/Photos.php:1125 ../../Zotlabs/Module/Photos.php:1137
+#: ../../include/ItemObject.php:175 ../../include/ItemObject.php:187
+#: ../../include/conversation.php:1736
+msgid "View all"
+msgstr "Ver todo"
+
+#: ../../Zotlabs/Module/Photos.php:1129 ../../include/identity.php:1297
+#: ../../include/ItemObject.php:179 ../../include/conversation.php:1760
+#: ../../include/taxonomy.php:415
+msgctxt "noun"
+msgid "Like"
+msgid_plural "Likes"
+msgstr[0] "Me gusta"
+msgstr[1] "Me gusta"
+
+#: ../../Zotlabs/Module/Photos.php:1134 ../../include/ItemObject.php:184
+#: ../../include/conversation.php:1763
+msgctxt "noun"
+msgid "Dislike"
+msgid_plural "Dislikes"
+msgstr[0] "No me gusta"
+msgstr[1] "No me gusta"
+
+#: ../../Zotlabs/Module/Photos.php:1242
+msgid "In This Photo:"
+msgstr "En esta foto:"
+
+#: ../../Zotlabs/Module/Photos.php:1247
+msgid "Map"
+msgstr "Mapa"
+
+#: ../../Zotlabs/Module/Photos.php:1255 ../../include/ItemObject.php:378
+msgctxt "noun"
+msgid "Likes"
+msgstr "Me gusta"
+
+#: ../../Zotlabs/Module/Photos.php:1256 ../../include/ItemObject.php:379
+msgctxt "noun"
+msgid "Dislikes"
+msgstr "No me gusta"
+
+#: ../../Zotlabs/Module/Photos.php:1261 ../../include/ItemObject.php:384
+#: ../../include/acl_selectors.php:252
+msgid "Close"
+msgstr "Cerrar"
+
+#: ../../Zotlabs/Module/Photos.php:1338
+msgid "View Album"
+msgstr "Ver álbum"
+
+#: ../../Zotlabs/Module/Photos.php:1349 ../../Zotlabs/Module/Photos.php:1362
+#: ../../Zotlabs/Module/Photos.php:1363
+msgid "Recent Photos"
+msgstr "Fotos recientes"
+
+#: ../../Zotlabs/Module/Ping.php:264
+msgid "sent you a private message"
+msgstr "le ha enviado un mensaje privado"
+
+#: ../../Zotlabs/Module/Ping.php:312
+msgid "added your channel"
+msgstr "añadió este canal a sus conexiones"
+
+#: ../../Zotlabs/Module/Ping.php:322 ../../include/identity.php:1116
+#: ../../include/identity.php:1192
+msgid "g A l F d"
+msgstr "g A l d F"
+
+#: ../../Zotlabs/Module/Ping.php:345 ../../include/identity.php:1162
+#: ../../include/identity.php:1232
+msgid "[today]"
+msgstr "[hoy]"
+
+#: ../../Zotlabs/Module/Ping.php:354
+msgid "posted an event"
+msgstr "publicó un evento"
+
+#: ../../Zotlabs/Module/Poke.php:168 ../../include/apps.php:145
+#: ../../include/conversation.php:965
+msgid "Poke"
+msgstr "Toques y otras cosas"
+
+#: ../../Zotlabs/Module/Poke.php:169
+msgid "Poke somebody"
+msgstr "Dar un toque a alguien"
+
+#: ../../Zotlabs/Module/Poke.php:172
+msgid "Poke/Prod"
+msgstr "Toque/Incitación"
+
+#: ../../Zotlabs/Module/Poke.php:173
+msgid "Poke, prod or do other things to somebody"
+msgstr "Dar un toque, incitar o hacer otras cosas a alguien"
+
+#: ../../Zotlabs/Module/Poke.php:180
+msgid "Recipient"
+msgstr "Destinatario"
+
+#: ../../Zotlabs/Module/Poke.php:181
+msgid "Choose what you wish to do to recipient"
+msgstr "Elegir qué desea enviar al destinatario"
+
+#: ../../Zotlabs/Module/Poke.php:184 ../../Zotlabs/Module/Poke.php:185
+msgid "Make this post private"
+msgstr "Convertir en privado este envío"
+
+#: ../../Zotlabs/Module/Probe.php:28 ../../Zotlabs/Module/Probe.php:34
+#, php-format
+msgid "Fetching URL returns error: %1$s"
+msgstr "Al intentar obtener la dirección, retorna el error: %1$s"
+
+#: ../../Zotlabs/Module/Profile_photo.php:179
+msgid ""
+"Shift-reload the page or clear browser cache if the new photo does not "
+"display immediately."
+msgstr "Recargue la página o limpie el caché del navegador si la nueva foto no se muestra inmediatamente."
+
+#: ../../Zotlabs/Module/Profile_photo.php:367
+msgid "Upload Profile Photo"
+msgstr "Subir foto de perfil"
+
+#: ../../Zotlabs/Module/Profiles.php:23 ../../Zotlabs/Module/Profiles.php:188
+#: ../../Zotlabs/Module/Profiles.php:245 ../../Zotlabs/Module/Profiles.php:624
+msgid "Profile not found."
+msgstr "Perfil no encontrado."
+
+#: ../../Zotlabs/Module/Profiles.php:43
+msgid "Profile deleted."
+msgstr "Perfil eliminado."
+
+#: ../../Zotlabs/Module/Profiles.php:67 ../../Zotlabs/Module/Profiles.php:103
+msgid "Profile-"
+msgstr "Perfil-"
+
+#: ../../Zotlabs/Module/Profiles.php:88 ../../Zotlabs/Module/Profiles.php:131
+msgid "New profile created."
+msgstr "El nuevo perfil ha sido creado."
+
+#: ../../Zotlabs/Module/Profiles.php:109
+msgid "Profile unavailable to clone."
+msgstr "Perfil no disponible para clonar."
+
+#: ../../Zotlabs/Module/Profiles.php:150
+msgid "Profile unavailable to export."
+msgstr "Perfil no disponible para exportar."
+
+#: ../../Zotlabs/Module/Profiles.php:255
+msgid "Profile Name is required."
+msgstr "Se necesita el nombre del perfil."
+
+#: ../../Zotlabs/Module/Profiles.php:426
+msgid "Marital Status"
+msgstr "Estado civil"
+
+#: ../../Zotlabs/Module/Profiles.php:430
+msgid "Romantic Partner"
+msgstr "Pareja sentimental"
+
+#: ../../Zotlabs/Module/Profiles.php:434 ../../Zotlabs/Module/Profiles.php:739
+msgid "Likes"
+msgstr "Me gusta"
+
+#: ../../Zotlabs/Module/Profiles.php:438 ../../Zotlabs/Module/Profiles.php:740
+msgid "Dislikes"
+msgstr "No me gusta"
+
+#: ../../Zotlabs/Module/Profiles.php:442 ../../Zotlabs/Module/Profiles.php:747
+msgid "Work/Employment"
+msgstr "Trabajo:"
+
+#: ../../Zotlabs/Module/Profiles.php:445
+msgid "Religion"
+msgstr "Religión"
+
+#: ../../Zotlabs/Module/Profiles.php:449
+msgid "Political Views"
+msgstr "Ideas políticas"
+
+#: ../../Zotlabs/Module/Profiles.php:457
+msgid "Sexual Preference"
+msgstr "Preferencia sexual"
+
+#: ../../Zotlabs/Module/Profiles.php:461
+msgid "Homepage"
+msgstr "Página personal"
+
+#: ../../Zotlabs/Module/Profiles.php:465
+msgid "Interests"
+msgstr "Intereses"
+
+#: ../../Zotlabs/Module/Profiles.php:559
+msgid "Profile updated."
+msgstr "Perfil actualizado."
+
+#: ../../Zotlabs/Module/Profiles.php:648
+msgid "Hide your connections list from viewers of this profile"
+msgstr "Ocultar la lista de conexiones a los visitantes del perfil"
+
+#: ../../Zotlabs/Module/Profiles.php:690
+msgid "Edit Profile Details"
+msgstr "Modificar los detalles de este perfil"
+
+#: ../../Zotlabs/Module/Profiles.php:692
+msgid "View this profile"
+msgstr "Ver este perfil"
+
+#: ../../Zotlabs/Module/Profiles.php:693 ../../Zotlabs/Module/Profiles.php:774
+#: ../../include/identity.php:952
+msgid "Edit visibility"
+msgstr "Editar visibilidad"
+
+#: ../../Zotlabs/Module/Profiles.php:694
+msgid "Change cover photo"
+msgstr "Cambiar la imagen de portada del perfil"
+
+#: ../../Zotlabs/Module/Profiles.php:695 ../../include/identity.php:923
+msgid "Change profile photo"
+msgstr "Cambiar la foto del perfil"
+
+#: ../../Zotlabs/Module/Profiles.php:696
+msgid "Create a new profile using these settings"
+msgstr "Crear un nuevo perfil usando estos ajustes"
+
+#: ../../Zotlabs/Module/Profiles.php:697
+msgid "Clone this profile"
+msgstr "Clonar este perfil"
+
+#: ../../Zotlabs/Module/Profiles.php:698
+msgid "Delete this profile"
+msgstr "Eliminar este perfil"
+
+#: ../../Zotlabs/Module/Profiles.php:699
+msgid "Add profile things"
+msgstr "Añadir cosas al perfil"
+
+#: ../../Zotlabs/Module/Profiles.php:700 ../../include/conversation.php:1544
+#: ../../include/widgets.php:105
+msgid "Personal"
+msgstr "Personales"
+
+#: ../../Zotlabs/Module/Profiles.php:702
+msgid "Relation"
+msgstr "Relación"
+
+#: ../../Zotlabs/Module/Profiles.php:703 ../../include/datetime.php:48
+msgid "Miscellaneous"
+msgstr "Varios"
+
+#: ../../Zotlabs/Module/Profiles.php:705
+msgid "Import profile from file"
+msgstr "Importar perfil desde un fichero"
+
+#: ../../Zotlabs/Module/Profiles.php:706
+msgid "Export profile to file"
+msgstr "Exportar perfil a un fichero"
+
+#: ../../Zotlabs/Module/Profiles.php:707
+msgid "Your gender"
+msgstr "Género"
+
+#: ../../Zotlabs/Module/Profiles.php:708
+msgid "Marital status"
+msgstr "Estado civil"
+
+#: ../../Zotlabs/Module/Profiles.php:709
+msgid "Sexual preference"
+msgstr "Preferencia sexual"
+
+#: ../../Zotlabs/Module/Profiles.php:712
+msgid "Profile name"
+msgstr "Nombre del perfil"
+
+#: ../../Zotlabs/Module/Profiles.php:714
+msgid "This is your default profile."
+msgstr "Este es su perfil principal."
+
+#: ../../Zotlabs/Module/Profiles.php:716
+msgid "Your full name"
+msgstr "Nombre completo"
+
+#: ../../Zotlabs/Module/Profiles.php:717
+msgid "Title/Description"
+msgstr "Título o descripción"
+
+#: ../../Zotlabs/Module/Profiles.php:720
+msgid "Street address"
+msgstr "Dirección"
+
+#: ../../Zotlabs/Module/Profiles.php:721
+msgid "Locality/City"
+msgstr "Ciudad"
+
+#: ../../Zotlabs/Module/Profiles.php:722
+msgid "Region/State"
+msgstr "Región o Estado"
+
+#: ../../Zotlabs/Module/Profiles.php:723
+msgid "Postal/Zip code"
+msgstr "Código postal"
+
+#: ../../Zotlabs/Module/Profiles.php:724
+msgid "Country"
+msgstr "País"
+
+#: ../../Zotlabs/Module/Profiles.php:729
+msgid "Who (if applicable)"
+msgstr "Quién (si es pertinente)"
+
+#: ../../Zotlabs/Module/Profiles.php:729
+msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
+msgstr "Por ejemplo: ana123, María González, sara@ejemplo.com"
+
+#: ../../Zotlabs/Module/Profiles.php:730
+msgid "Since (date)"
+msgstr "Desde (fecha)"
+
+#: ../../Zotlabs/Module/Profiles.php:733
+msgid "Tell us about yourself"
+msgstr "Háblenos de usted"
+
+#: ../../Zotlabs/Module/Profiles.php:735
+msgid "Hometown"
+msgstr "Lugar de nacimiento"
+
+#: ../../Zotlabs/Module/Profiles.php:736
+msgid "Political views"
+msgstr "Ideas políticas"
+
+#: ../../Zotlabs/Module/Profiles.php:737
+msgid "Religious views"
+msgstr "Creencias religiosas"
+
+#: ../../Zotlabs/Module/Profiles.php:738
+msgid "Keywords used in directory listings"
+msgstr "Palabras clave utilizadas en los listados de directorios"
+
+#: ../../Zotlabs/Module/Profiles.php:738
+msgid "Example: fishing photography software"
+msgstr "Por ejemplo: software de fotografía submarina"
+
+#: ../../Zotlabs/Module/Profiles.php:741
+msgid "Musical interests"
+msgstr "Preferencias musicales"
+
+#: ../../Zotlabs/Module/Profiles.php:742
+msgid "Books, literature"
+msgstr "Libros, literatura"
+
+#: ../../Zotlabs/Module/Profiles.php:743
+msgid "Television"
+msgstr "Televisión"
+
+#: ../../Zotlabs/Module/Profiles.php:744
+msgid "Film/Dance/Culture/Entertainment"
+msgstr "Cine, danza, cultura, entretenimiento"
+
+#: ../../Zotlabs/Module/Profiles.php:745
+msgid "Hobbies/Interests"
+msgstr "Aficiones o intereses"
+
+#: ../../Zotlabs/Module/Profiles.php:746
+msgid "Love/Romance"
+msgstr "Vida sentimental o amorosa"
+
+#: ../../Zotlabs/Module/Profiles.php:748
+msgid "School/Education"
+msgstr "Estudios"
+
+#: ../../Zotlabs/Module/Profiles.php:749
+msgid "Contact information and social networks"
+msgstr "Información de contacto y redes sociales"
+
+#: ../../Zotlabs/Module/Profiles.php:750
+msgid "My other channels"
+msgstr "Mis otros canales"
+
+#: ../../Zotlabs/Module/Profiles.php:770 ../../include/identity.php:948
+msgid "Profile Image"
+msgstr "Imagen del perfil"
+
+#: ../../Zotlabs/Module/Profiles.php:780 ../../include/identity.php:930
+#: ../../include/nav.php:88
+msgid "Edit Profiles"
+msgstr "Editar perfiles"
+
+#: ../../Zotlabs/Module/Profperm.php:34 ../../Zotlabs/Module/Profperm.php:63
+msgid "Invalid profile identifier."
+msgstr "Identificador del perfil no válido"
+
+#: ../../Zotlabs/Module/Profperm.php:115
+msgid "Profile Visibility Editor"
+msgstr "Editor de visibilidad del perfil"
+
+#: ../../Zotlabs/Module/Profperm.php:117 ../../include/identity.php:1388
+#: ../../include/apps.php:138
+msgid "Profile"
+msgstr "Perfil"
+
+#: ../../Zotlabs/Module/Profperm.php:119
+msgid "Click on a contact to add or remove."
+msgstr "Pulsar en un contacto para añadirlo o eliminarlo."
+
+#: ../../Zotlabs/Module/Profperm.php:128
+msgid "Visible To"
+msgstr "Visible para"
+
+#: ../../Zotlabs/Module/Pubsites.php:22 ../../include/widgets.php:1222
+msgid "Public Hubs"
+msgstr "Servidores públicos"
+
+#: ../../Zotlabs/Module/Pubsites.php:25
+msgid ""
+"The listed hubs allow public registration for the $Projectname network. All "
+"hubs in the network are interlinked so membership on any of them conveys "
+"membership in the network as a whole. Some hubs may require subscription or "
+"provide tiered service plans. The hub itself <strong>may</strong> provide "
+"additional details."
+msgstr "Los sitios listados permiten el registro público en la red $Projectname. Todos los sitios de la red están vinculados entre sí, por lo que sus miembros, en ninguno de ellos, indican la pertenencia a la red en su conjunto. Algunos sitios pueden requerir suscripción o proporcionar planes de servicio por niveles. Los mismos hubs <strong>pueden</strong> proporcionar detalles adicionales."
+
+#: ../../Zotlabs/Module/Pubsites.php:31
+msgid "Hub URL"
+msgstr "Dirección del hub"
+
+#: ../../Zotlabs/Module/Pubsites.php:31
+msgid "Access Type"
+msgstr "Tipo de acceso"
+
+#: ../../Zotlabs/Module/Pubsites.php:31
+msgid "Registration Policy"
+msgstr "Normas de registro"
+
+#: ../../Zotlabs/Module/Pubsites.php:31 ../../Zotlabs/Module/Ratings.php:103
+#: ../../include/conversation.php:964
+msgid "Ratings"
+msgstr "Valoraciones"
+
+#: ../../Zotlabs/Module/Pubsites.php:37
+msgid "Rate"
+msgstr "Valorar"
+
+#: ../../Zotlabs/Module/Rate.php:162
+msgid "Website:"
+msgstr "Sitio web:"
+
+#: ../../Zotlabs/Module/Rate.php:165
+#, php-format
+msgid "Remote Channel [%s] (not yet known on this site)"
+msgstr "Canal remoto [%s] (aún no es conocido en este sitio)"
+
+#: ../../Zotlabs/Module/Rate.php:166
+msgid "Rating (this information is public)"
+msgstr "Valoración (esta información es pública)"
+
+#: ../../Zotlabs/Module/Rate.php:167
+msgid "Optionally explain your rating (this information is public)"
+msgstr "Opcionalmente puede explicar su valoración (esta información es pública)"
+
+#: ../../Zotlabs/Module/Ratings.php:73
+msgid "No ratings"
+msgstr "Ninguna valoración"
+
+#: ../../Zotlabs/Module/Ratings.php:104
+msgid "Rating: "
+msgstr "Valoración:"
+
+#: ../../Zotlabs/Module/Ratings.php:105
+msgid "Website: "
+msgstr "Sitio web:"
+
+#: ../../Zotlabs/Module/Ratings.php:107
+msgid "Description: "
+msgstr "Descripción:"
+
+#: ../../Zotlabs/Module/Rbmark.php:94
+msgid "Select a bookmark folder"
+msgstr "Seleccionar una carpeta de marcadores"
+
+#: ../../Zotlabs/Module/Rbmark.php:99
+msgid "Save Bookmark"
+msgstr "Guardar marcador"
+
+#: ../../Zotlabs/Module/Rbmark.php:100
+msgid "URL of bookmark"
+msgstr "Dirección del marcador"
+
+#: ../../Zotlabs/Module/Rbmark.php:105
+msgid "Or enter new bookmark folder name"
+msgstr "O introduzca un nuevo nombre para la carpeta de marcadores"
+
+#: ../../Zotlabs/Module/Register.php:49
+msgid "Maximum daily site registrations exceeded. Please try again tomorrow."
+msgstr "Se ha superado el límite máximo de inscripciones diarias de este sitio. Por favor, pruebe de nuevo mañana."
+
+#: ../../Zotlabs/Module/Register.php:55
+msgid ""
+"Please indicate acceptance of the Terms of Service. Registration failed."
+msgstr "Por favor, confirme que acepta los Términos del servicio. El registro ha fallado."
+
+#: ../../Zotlabs/Module/Register.php:89
+msgid "Passwords do not match."
+msgstr "Las contraseñas no coinciden."
+
+#: ../../Zotlabs/Module/Register.php:131
+msgid ""
+"Registration successful. Please check your email for validation "
+"instructions."
+msgstr "Registro realizado con éxito. Por favor, compruebe su correo electrónico para ver las instrucciones para validarlo."
+
+#: ../../Zotlabs/Module/Register.php:137
+msgid "Your registration is pending approval by the site owner."
+msgstr "Su registro está pendiente de aprobación por el propietario del sitio."
+
+#: ../../Zotlabs/Module/Register.php:140
+msgid "Your registration can not be processed."
+msgstr "Su registro no puede ser procesado."
+
+#: ../../Zotlabs/Module/Register.php:184
+msgid "Registration on this hub is disabled."
+msgstr "El registro está deshabilitado en este sitio."
+
+#: ../../Zotlabs/Module/Register.php:193
+msgid "Registration on this hub is by approval only."
+msgstr "El registro en este hub está sometido a aprobación previa."
+
+#: ../../Zotlabs/Module/Register.php:194
+msgid "<a href=\"pubsites\">Register at another affiliated hub.</a>"
+msgstr "<a href=\"pubsites\">Registrarse en otro hub afiliado.</a>"
+
+#: ../../Zotlabs/Module/Register.php:204
+msgid ""
+"This site has exceeded the number of allowed daily account registrations. "
+"Please try again tomorrow."
+msgstr "Este sitio ha excedido el límite de inscripción diaria de cuentas. Por favor, inténtelo de nuevo mañana."
+
+#: ../../Zotlabs/Module/Register.php:215
+msgid "Terms of Service"
+msgstr "Términos del servicio"
+
+#: ../../Zotlabs/Module/Register.php:221
+#, php-format
+msgid "I accept the %s for this website"
+msgstr "Acepto los %s de este sitio"
+
+#: ../../Zotlabs/Module/Register.php:223
+#, php-format
+msgid "I am over 13 years of age and accept the %s for this website"
+msgstr "Tengo más de 13 años de edad y acepto los %s de este sitio"
+
+#: ../../Zotlabs/Module/Register.php:227
+msgid "Your email address"
+msgstr "Su dirección de correo electrónico"
+
+#: ../../Zotlabs/Module/Register.php:228
+msgid "Choose a password"
+msgstr "Elija una contraseña"
+
+#: ../../Zotlabs/Module/Register.php:229
+msgid "Please re-enter your password"
+msgstr "Por favor, vuelva a escribir su contraseña"
+
+#: ../../Zotlabs/Module/Register.php:230
+msgid "Please enter your invitation code"
+msgstr "Por favor, introduzca el código de su invitación"
+
+#: ../../Zotlabs/Module/Register.php:236
+msgid "no"
+msgstr "no"
+
+#: ../../Zotlabs/Module/Register.php:236
+msgid "yes"
+msgstr "sí"
+
+#: ../../Zotlabs/Module/Register.php:250
+msgid "Membership on this site is by invitation only."
+msgstr "Para registrarse en este sitio es necesaria una invitación."
+
+#: ../../Zotlabs/Module/Register.php:262 ../../include/nav.php:148
+#: ../../boot.php:1584
+msgid "Register"
+msgstr "Registrarse"
+
+#: ../../Zotlabs/Module/Register.php:262
+msgid "Proceed to create your first channel"
+msgstr "Crear su primer canal"
+
+#: ../../Zotlabs/Module/Regmod.php:15
+msgid "Please login."
+msgstr "Por favor, inicie sesión."
+
+#: ../../Zotlabs/Module/Removeaccount.php:34
+msgid ""
+"Account removals are not allowed within 48 hours of changing the account "
+"password."
+msgstr "La eliminación de cuentas no está permitida hasta después de que hayan transcurrido 48 horas desde el último cambio de contraseña."
+
+#: ../../Zotlabs/Module/Removeaccount.php:61
+msgid "Remove This Account"
+msgstr "Eliminar esta cuenta"
+
+#: ../../Zotlabs/Module/Removeaccount.php:62
+#: ../../Zotlabs/Module/Removeme.php:62
+msgid "WARNING: "
+msgstr "ATENCIÓN:"
+
+#: ../../Zotlabs/Module/Removeaccount.php:62
+msgid ""
+"This account and all its channels will be completely removed from the "
+"network. "
+msgstr "Esta cuenta y todos sus canales van a ser eliminados de la red."
+
+#: ../../Zotlabs/Module/Removeaccount.php:62
+#: ../../Zotlabs/Module/Removeme.php:62
+msgid "This action is permanent and can not be undone!"
+msgstr "¡Esta acción tiene carácter definitivo y no se puede deshacer!"
+
+#: ../../Zotlabs/Module/Removeaccount.php:63
+#: ../../Zotlabs/Module/Removeme.php:63
+msgid "Please enter your password for verification:"
+msgstr "Por favor, introduzca su contraseña para su verificación:"
+
+#: ../../Zotlabs/Module/Removeaccount.php:64
+msgid ""
+"Remove this account, all its channels and all its channel clones from the "
+"network"
+msgstr "Remover esta cuenta, todos sus canales y clones de la red"
+
+#: ../../Zotlabs/Module/Removeaccount.php:64
+msgid ""
+"By default only the instances of the channels located on this hub will be "
+"removed from the network"
+msgstr "Por defecto, solo las instancias de los canales ubicados en este servidor serán eliminados de la red"
+
+#: ../../Zotlabs/Module/Removeaccount.php:65
+#: ../../Zotlabs/Module/Settings.php:703
+msgid "Remove Account"
+msgstr "Eliminar cuenta"
+
+#: ../../Zotlabs/Module/Removeme.php:33
+msgid ""
+"Channel removals are not allowed within 48 hours of changing the account "
+"password."
+msgstr "La eliminación de canales no está permitida hasta pasadas 48 horas desde el último cambio de contraseña."
+
+#: ../../Zotlabs/Module/Removeme.php:61
+msgid "Remove This Channel"
+msgstr "Eliminar este canal"
+
+#: ../../Zotlabs/Module/Removeme.php:62
+msgid "This channel will be completely removed from the network. "
+msgstr "Este canal va a ser completamente eliminado de la red."
+
+#: ../../Zotlabs/Module/Removeme.php:64
+msgid "Remove this channel and all its clones from the network"
+msgstr "Eliminar este canal y todos sus clones de la red"
+
+#: ../../Zotlabs/Module/Removeme.php:64
+msgid ""
+"By default only the instance of the channel located on this hub will be "
+"removed from the network"
+msgstr "Por defecto, solo la instancia del canal alojado en este servidor será eliminado de la red"
+
+#: ../../Zotlabs/Module/Removeme.php:65 ../../Zotlabs/Module/Settings.php:1122
+msgid "Remove Channel"
+msgstr "Eliminar el canal"
+
+#: ../../Zotlabs/Module/Rmagic.php:44
+msgid ""
+"We encountered a problem while logging in with the OpenID you provided. "
+"Please check the correct spelling of the ID."
+msgstr "Encontramos un problema durante el inicio de sesión con la OpenID que proporcionó. Por favor, compruebe que la ID está correctamente escrita."
+
+#: ../../Zotlabs/Module/Rmagic.php:44
+msgid "The error message was:"
+msgstr "El mensaje de error fue:"
+
+#: ../../Zotlabs/Module/Rmagic.php:48
+msgid "Authentication failed."
+msgstr "Falló la autenticación."
+
+#: ../../Zotlabs/Module/Rmagic.php:88
+msgid "Remote Authentication"
+msgstr "Acceso desde su servidor"
+
+#: ../../Zotlabs/Module/Rmagic.php:89
+msgid "Enter your channel address (e.g. channel@example.com)"
+msgstr "Introduzca la dirección del canal (p.ej. canal@ejemplo.com)"
+
+#: ../../Zotlabs/Module/Rmagic.php:90
+msgid "Authenticate"
+msgstr "Acceder"
+
+#: ../../Zotlabs/Module/Search.php:216
+#, php-format
+msgid "Items tagged with: %s"
+msgstr "elementos etiquetados con: %s"
+
+#: ../../Zotlabs/Module/Search.php:218
+#, php-format
+msgid "Search results for: %s"
+msgstr "Resultados de la búsqueda para: %s"
+
+#: ../../Zotlabs/Module/Service_limits.php:23
+msgid "No service class restrictions found."
+msgstr "No se han encontrado restricciones sobre esta clase de servicio."
+
+#: ../../Zotlabs/Module/Settings.php:67
+msgid "Name is required"
+msgstr "El nombre es obligatorio"
+
+#: ../../Zotlabs/Module/Settings.php:71
+msgid "Key and Secret are required"
+msgstr "\"Key\" y \"Secret\" son obligatorios"
+
+#: ../../Zotlabs/Module/Settings.php:75 ../../Zotlabs/Module/Settings.php:614
+#: ../../include/apps.php:252
+msgid "Update"
+msgstr "Actualizar"
+
+#: ../../Zotlabs/Module/Settings.php:223
+msgid "Not valid email."
+msgstr "Correo electrónico no válido."
+
+#: ../../Zotlabs/Module/Settings.php:226
+msgid "Protected email address. Cannot change to that email."
+msgstr "Dirección de correo electrónico protegida. No se puede cambiar a ella."
+
+#: ../../Zotlabs/Module/Settings.php:235
+msgid "System failure storing new email. Please try again."
+msgstr "Fallo de sistema al guardar el nuevo correo electrónico. Por favor, inténtelo de nuevo."
+
+#: ../../Zotlabs/Module/Settings.php:252
+msgid "Password verification failed."
+msgstr "La comprobación de la contraseña ha fallado."
+
+#: ../../Zotlabs/Module/Settings.php:259
+msgid "Passwords do not match. Password unchanged."
+msgstr "Las contraseñas no coinciden. La contraseña no se ha cambiado."
+
+#: ../../Zotlabs/Module/Settings.php:263
+msgid "Empty passwords are not allowed. Password unchanged."
+msgstr "No se permiten contraseñas vacías. La contraseña no se ha cambiado."
+
+#: ../../Zotlabs/Module/Settings.php:277
+msgid "Password changed."
+msgstr "Contraseña cambiada."
+
+#: ../../Zotlabs/Module/Settings.php:279
+msgid "Password update failed. Please try again."
+msgstr "La actualización de la contraseña ha fallado. Por favor, inténtalo de nuevo."
+
+#: ../../Zotlabs/Module/Settings.php:523
+msgid "Settings updated."
+msgstr "Ajustes actualizados."
+
+#: ../../Zotlabs/Module/Settings.php:587 ../../Zotlabs/Module/Settings.php:613
+#: ../../Zotlabs/Module/Settings.php:649
+msgid "Add application"
+msgstr "Añadir aplicación"
+
+#: ../../Zotlabs/Module/Settings.php:590
+msgid "Name of application"
+msgstr "Nombre de la aplicación"
+
+#: ../../Zotlabs/Module/Settings.php:591 ../../Zotlabs/Module/Settings.php:617
+msgid "Consumer Key"
+msgstr "Consumer Key"
+
+#: ../../Zotlabs/Module/Settings.php:591 ../../Zotlabs/Module/Settings.php:592
+msgid "Automatically generated - change if desired. Max length 20"
+msgstr "Generado automáticamente - si lo desea, cámbielo. Longitud máxima: 20"
+
+#: ../../Zotlabs/Module/Settings.php:592 ../../Zotlabs/Module/Settings.php:618
+msgid "Consumer Secret"
+msgstr "Consumer Secret"
+
+#: ../../Zotlabs/Module/Settings.php:593 ../../Zotlabs/Module/Settings.php:619
+msgid "Redirect"
+msgstr "Redirigir"
+
+#: ../../Zotlabs/Module/Settings.php:593
+msgid ""
+"Redirect URI - leave blank unless your application specifically requires "
+"this"
+msgstr "URI de redirección - dejar en blanco a menos que su aplicación específicamente lo requiera"
+
+#: ../../Zotlabs/Module/Settings.php:594 ../../Zotlabs/Module/Settings.php:620
+msgid "Icon url"
+msgstr "Dirección del icono"
+
+#: ../../Zotlabs/Module/Settings.php:594
+msgid "Optional"
+msgstr "Opcional"
+
+#: ../../Zotlabs/Module/Settings.php:605
+msgid "Application not found."
+msgstr "Aplicación no encontrada."
+
+#: ../../Zotlabs/Module/Settings.php:648
+msgid "Connected Apps"
+msgstr "Aplicaciones conectadas"
+
+#: ../../Zotlabs/Module/Settings.php:652
+msgid "Client key starts with"
+msgstr "La \"client key\" empieza por"
+
+#: ../../Zotlabs/Module/Settings.php:653
+msgid "No name"
+msgstr "Sin nombre"
+
+#: ../../Zotlabs/Module/Settings.php:654
+msgid "Remove authorization"
+msgstr "Eliminar autorización"
+
+#: ../../Zotlabs/Module/Settings.php:667
+msgid "No feature settings configured"
+msgstr "No se ha establecido la configuración de los complementos"
+
+#: ../../Zotlabs/Module/Settings.php:674
+msgid "Feature/Addon Settings"
+msgstr "Ajustes de los complementos"
+
+#: ../../Zotlabs/Module/Settings.php:697
+msgid "Account Settings"
+msgstr "Configuración de la cuenta"
+
+#: ../../Zotlabs/Module/Settings.php:698
+msgid "Current Password"
+msgstr "Contraseña actual"
+
+#: ../../Zotlabs/Module/Settings.php:699
+msgid "Enter New Password"
+msgstr "Escribir una nueva contraseña"
+
+#: ../../Zotlabs/Module/Settings.php:700
+msgid "Confirm New Password"
+msgstr "Confirmar la nueva contraseña"
+
+#: ../../Zotlabs/Module/Settings.php:700
+msgid "Leave password fields blank unless changing"
+msgstr "Dejar en blanco la contraseña a menos que desee cambiarla."
+
+#: ../../Zotlabs/Module/Settings.php:702
+#: ../../Zotlabs/Module/Settings.php:1039
+msgid "Email Address:"
+msgstr "Dirección de correo electrónico:"
+
+#: ../../Zotlabs/Module/Settings.php:704
+msgid "Remove this account including all its channels"
+msgstr "Eliminar esta cuenta incluyendo todos sus canales"
+
+#: ../../Zotlabs/Module/Settings.php:727
+msgid "Additional Features"
+msgstr "Funcionalidades"
+
+#: ../../Zotlabs/Module/Settings.php:751
+msgid "Connector Settings"
+msgstr "Configuración del conector"
+
+#: ../../Zotlabs/Module/Settings.php:790
+msgid "No special theme for mobile devices"
+msgstr "Sin tema especial para dispositivos móviles"
+
+#: ../../Zotlabs/Module/Settings.php:793
+#, php-format
+msgid "%s - (Experimental)"
+msgstr "%s - (Experimental)"
+
+#: ../../Zotlabs/Module/Settings.php:835
+msgid "Display Settings"
+msgstr "Ajustes de visualización"
+
+#: ../../Zotlabs/Module/Settings.php:836
+msgid "Theme Settings"
+msgstr "Ajustes del tema"
+
+#: ../../Zotlabs/Module/Settings.php:837
+msgid "Custom Theme Settings"
+msgstr "Ajustes personalizados del tema"
+
+#: ../../Zotlabs/Module/Settings.php:838
+msgid "Content Settings"
+msgstr "Ajustes del contenido"
+
+#: ../../Zotlabs/Module/Settings.php:844
+msgid "Display Theme:"
+msgstr "Tema gráfico del perfil:"
+
+#: ../../Zotlabs/Module/Settings.php:845
+msgid "Mobile Theme:"
+msgstr "Tema para el móvil:"
+
+#: ../../Zotlabs/Module/Settings.php:846
+msgid "Preload images before rendering the page"
+msgstr "Carga previa de las imágenes antes de generar la página"
+
+#: ../../Zotlabs/Module/Settings.php:846
+msgid ""
+"The subjective page load time will be longer but the page will be ready when"
+" displayed"
+msgstr "El tiempo subjetivo de carga de la página será más largo, pero la página estará lista cuando se muestre."
+
+#: ../../Zotlabs/Module/Settings.php:847
+msgid "Enable user zoom on mobile devices"
+msgstr "Habilitar zoom de usuario en dispositivos móviles"
+
+#: ../../Zotlabs/Module/Settings.php:848
+msgid "Update browser every xx seconds"
+msgstr "Actualizar navegador cada xx segundos"
+
+#: ../../Zotlabs/Module/Settings.php:848
+msgid "Minimum of 10 seconds, no maximum"
+msgstr "Mínimo de 10 segundos, sin máximo"
+
+#: ../../Zotlabs/Module/Settings.php:849
+msgid "Maximum number of conversations to load at any time:"
+msgstr "Máximo número de conversaciones a cargar en cualquier momento:"
+
+#: ../../Zotlabs/Module/Settings.php:849
+msgid "Maximum of 100 items"
+msgstr "Máximo de 100 elementos"
+
+#: ../../Zotlabs/Module/Settings.php:850
+msgid "Show emoticons (smilies) as images"
+msgstr "Mostrar emoticonos (smilies) como imágenes"
+
+#: ../../Zotlabs/Module/Settings.php:851
+msgid "Link post titles to source"
+msgstr "Enlazar título de la publicación a la fuente original"
+
+#: ../../Zotlabs/Module/Settings.php:852
+msgid "System Page Layout Editor - (advanced)"
+msgstr "Editor de plantilla de página del sistema - (avanzado)"
+
+#: ../../Zotlabs/Module/Settings.php:855
+msgid "Use blog/list mode on channel page"
+msgstr "Usar modo blog/lista en la página de inicio del canal"
+
+#: ../../Zotlabs/Module/Settings.php:855 ../../Zotlabs/Module/Settings.php:856
+msgid "(comments displayed separately)"
+msgstr "(comentarios mostrados de forma separada)"
+
+#: ../../Zotlabs/Module/Settings.php:856
+msgid "Use blog/list mode on grid page"
+msgstr "Mostrar mi red en modo blog"
+
+#: ../../Zotlabs/Module/Settings.php:857
+msgid "Channel page max height of content (in pixels)"
+msgstr "Altura máxima del contenido de la página del canal (en píxeles)"
+
+#: ../../Zotlabs/Module/Settings.php:857 ../../Zotlabs/Module/Settings.php:858
+msgid "click to expand content exceeding this height"
+msgstr "Pulsar para expandir el contenido que exceda de esta altura"
+
+#: ../../Zotlabs/Module/Settings.php:858
+msgid "Grid page max height of content (in pixels)"
+msgstr "Altura máxima del contenido de mi red (en píxeles)"
+
+#: ../../Zotlabs/Module/Settings.php:892
+msgid "Nobody except yourself"
+msgstr "Nadie excepto usted"
+
+#: ../../Zotlabs/Module/Settings.php:893
+msgid "Only those you specifically allow"
+msgstr "Solo aquellos a los que usted permita explícitamente"
+
+#: ../../Zotlabs/Module/Settings.php:894
+msgid "Approved connections"
+msgstr "Conexiones aprobadas"
+
+#: ../../Zotlabs/Module/Settings.php:895
+msgid "Any connections"
+msgstr "Cualquier conexión"
+
+#: ../../Zotlabs/Module/Settings.php:896
+msgid "Anybody on this website"
+msgstr "Cualquiera en este sitio web"
+
+#: ../../Zotlabs/Module/Settings.php:897
+msgid "Anybody in this network"
+msgstr "Cualquiera en esta red"
+
+#: ../../Zotlabs/Module/Settings.php:898
+msgid "Anybody authenticated"
+msgstr "Cualquiera que esté autenticado"
+
+#: ../../Zotlabs/Module/Settings.php:899
+msgid "Anybody on the internet"
+msgstr "Cualquiera en internet"
+
+#: ../../Zotlabs/Module/Settings.php:974
+msgid "Publish your default profile in the network directory"
+msgstr "Publicar su perfil principal en el directorio de la red"
+
+#: ../../Zotlabs/Module/Settings.php:979
+msgid "Allow us to suggest you as a potential friend to new members?"
+msgstr "¿Nos permite sugerirle como amigo potencial a los nuevos miembros?"
+
+#: ../../Zotlabs/Module/Settings.php:988
+msgid "Your channel address is"
+msgstr "Su dirección de canal es"
+
+#: ../../Zotlabs/Module/Settings.php:1030
+msgid "Channel Settings"
+msgstr "Ajustes del canal"
+
+#: ../../Zotlabs/Module/Settings.php:1037
+msgid "Basic Settings"
+msgstr "Configuración básica"
+
+#: ../../Zotlabs/Module/Settings.php:1038 ../../include/identity.php:1279
+msgid "Full Name:"
+msgstr "Nombre completo:"
+
+#: ../../Zotlabs/Module/Settings.php:1040
+msgid "Your Timezone:"
+msgstr "Su huso horario:"
+
+#: ../../Zotlabs/Module/Settings.php:1041
+msgid "Default Post Location:"
+msgstr "Localización geográfica predeterminada para sus publicaciones:"
+
+#: ../../Zotlabs/Module/Settings.php:1041
+msgid "Geographical location to display on your posts"
+msgstr "Localización geográfica que debe mostrarse en sus publicaciones"
+
+#: ../../Zotlabs/Module/Settings.php:1042
+msgid "Use Browser Location:"
+msgstr "Usar la localización geográfica del navegador:"
+
+#: ../../Zotlabs/Module/Settings.php:1044
+msgid "Adult Content"
+msgstr "Contenido solo para adultos"
+
+#: ../../Zotlabs/Module/Settings.php:1044
+msgid ""
+"This channel frequently or regularly publishes adult content. (Please tag "
+"any adult material and/or nudity with #NSFW)"
+msgstr "Este canal publica contenido solo para adultos con frecuencia o regularmente. (Por favor etiquete cualquier material para adultos con la etiqueta #NSFW)"
+
+#: ../../Zotlabs/Module/Settings.php:1046
+msgid "Security and Privacy Settings"
+msgstr "Configuración de seguridad y privacidad"
+
+#: ../../Zotlabs/Module/Settings.php:1049
+msgid "Your permissions are already configured. Click to view/adjust"
+msgstr "Sus permisos ya están configurados. Pulse para ver/ajustar"
+
+#: ../../Zotlabs/Module/Settings.php:1051
+msgid "Hide my online presence"
+msgstr "Ocultar mi presencia en línea"
+
+#: ../../Zotlabs/Module/Settings.php:1051
+msgid "Prevents displaying in your profile that you are online"
+msgstr "Evitar mostrar en su perfil que está en línea"
+
+#: ../../Zotlabs/Module/Settings.php:1053
+msgid "Simple Privacy Settings:"
+msgstr "Configuración de privacidad sencilla:"
+
+#: ../../Zotlabs/Module/Settings.php:1054
+msgid ""
+"Very Public - <em>extremely permissive (should be used with caution)</em>"
+msgstr "Muy Público - <em>extremadamente permisivo (debería ser usado con precaución)</em>"
+
+#: ../../Zotlabs/Module/Settings.php:1055
+msgid ""
+"Typical - <em>default public, privacy when desired (similar to social "
+"network permissions but with improved privacy)</em>"
+msgstr "Típico - <em>por defecto público, privado cuando se desee (similar a los permisos de una red social pero con privacidad mejorada)</em>"
+
+#: ../../Zotlabs/Module/Settings.php:1056
+msgid "Private - <em>default private, never open or public</em>"
+msgstr "Privado - <em>por defecto, privado, nunca abierto o público</em>"
+
+#: ../../Zotlabs/Module/Settings.php:1057
+msgid "Blocked - <em>default blocked to/from everybody</em>"
+msgstr "Bloqueado - <em>por defecto, bloqueado/a para cualquiera</em>"
+
+#: ../../Zotlabs/Module/Settings.php:1059
+msgid "Allow others to tag your posts"
+msgstr "Permitir a otros etiquetar sus publicaciones"
+
+#: ../../Zotlabs/Module/Settings.php:1059
+msgid ""
+"Often used by the community to retro-actively flag inappropriate content"
+msgstr "A menudo usado por la comunidad para marcar contenido inapropiado de forma retroactiva."
+
+#: ../../Zotlabs/Module/Settings.php:1061
+msgid "Advanced Privacy Settings"
+msgstr "Configuración de privacidad avanzada"
+
+#: ../../Zotlabs/Module/Settings.php:1063
+msgid "Expire other channel content after this many days"
+msgstr "Caducar contenido de otros canales después de este número de días"
+
+#: ../../Zotlabs/Module/Settings.php:1063
+#, php-format
+msgid ""
+"0 or blank to use the website limit. The website expires after %d days."
+msgstr "0 o en blanco para usar el límite del sitio. El sitio web caduca después de %d días."
+
+#: ../../Zotlabs/Module/Settings.php:1064
+msgid "Maximum Friend Requests/Day:"
+msgstr "Máximo de solicitudes de amistad por día:"
+
+#: ../../Zotlabs/Module/Settings.php:1064
+msgid "May reduce spam activity"
+msgstr "Podría reducir la actividad de spam"
+
+#: ../../Zotlabs/Module/Settings.php:1065
+msgid "Default Post Permissions"
+msgstr "Permisos de publicación predeterminados"
+
+#: ../../Zotlabs/Module/Settings.php:1070
+msgid "Channel permissions category:"
+msgstr "Categoría de permisos del canal:"
+
+#: ../../Zotlabs/Module/Settings.php:1076
+msgid "Maximum private messages per day from unknown people:"
+msgstr "Máximo de mensajes privados por día de gente desconocida:"
+
+#: ../../Zotlabs/Module/Settings.php:1076
+msgid "Useful to reduce spamming"
+msgstr "Útil para reducir el envío de correo no deseado"
+
+#: ../../Zotlabs/Module/Settings.php:1079
+msgid "Notification Settings"
+msgstr "Configuración de las notificaciones"
+
+#: ../../Zotlabs/Module/Settings.php:1080
+msgid "By default post a status message when:"
+msgstr "Por defecto, enviar un mensaje de estado cuando:"
+
+#: ../../Zotlabs/Module/Settings.php:1081
+msgid "accepting a friend request"
+msgstr "Acepte una solicitud de amistad"
+
+#: ../../Zotlabs/Module/Settings.php:1082
+msgid "joining a forum/community"
+msgstr "al unirse a un foro o comunidad"
+
+#: ../../Zotlabs/Module/Settings.php:1083
+msgid "making an <em>interesting</em> profile change"
+msgstr "Realice un cambio <em>interesante</em> en su perfil"
+
+#: ../../Zotlabs/Module/Settings.php:1084
+msgid "Send a notification email when:"
+msgstr "Enviar una notificación por correo electrónico cuando:"
+
+#: ../../Zotlabs/Module/Settings.php:1085
+msgid "You receive a connection request"
+msgstr "Reciba una solicitud de conexión"
+
+#: ../../Zotlabs/Module/Settings.php:1086
+msgid "Your connections are confirmed"
+msgstr "Sus conexiones hayan sido confirmadas"
+
+#: ../../Zotlabs/Module/Settings.php:1087
+msgid "Someone writes on your profile wall"
+msgstr "Alguien escriba en la página de su perfil (\"muro\")"
+
+#: ../../Zotlabs/Module/Settings.php:1088
+msgid "Someone writes a followup comment"
+msgstr "Alguien escriba un comentario sobre sus publicaciones"
+
+#: ../../Zotlabs/Module/Settings.php:1089
+msgid "You receive a private message"
+msgstr "Reciba un mensaje privado"
+
+#: ../../Zotlabs/Module/Settings.php:1090
+msgid "You receive a friend suggestion"
+msgstr "Reciba una sugerencia de amistad"
+
+#: ../../Zotlabs/Module/Settings.php:1091
+msgid "You are tagged in a post"
+msgstr "Usted sea etiquetado en una publicación"
+
+#: ../../Zotlabs/Module/Settings.php:1092
+msgid "You are poked/prodded/etc. in a post"
+msgstr "Reciba un toque o incitación en una publicación"
+
+#: ../../Zotlabs/Module/Settings.php:1095
+msgid "Show visual notifications including:"
+msgstr "Mostrar notificaciones visuales que incluyan:"
+
+#: ../../Zotlabs/Module/Settings.php:1097
+msgid "Unseen grid activity"
+msgstr "Nueva actividad en la red"
+
+#: ../../Zotlabs/Module/Settings.php:1098
+msgid "Unseen channel activity"
+msgstr "Actividad no vista en el canal"
+
+#: ../../Zotlabs/Module/Settings.php:1099
+msgid "Unseen private messages"
+msgstr "Mensajes privados no leídos"
+
+#: ../../Zotlabs/Module/Settings.php:1099
+#: ../../Zotlabs/Module/Settings.php:1104
+#: ../../Zotlabs/Module/Settings.php:1105
+#: ../../Zotlabs/Module/Settings.php:1106
+msgid "Recommended"
+msgstr "Recomendado"
+
+#: ../../Zotlabs/Module/Settings.php:1100
+msgid "Upcoming events"
+msgstr "Próximos eventos"
+
+#: ../../Zotlabs/Module/Settings.php:1101
+msgid "Events today"
+msgstr "Eventos de hoy"
+
+#: ../../Zotlabs/Module/Settings.php:1102
+msgid "Upcoming birthdays"
+msgstr "Próximos cumpleaños"
+
+#: ../../Zotlabs/Module/Settings.php:1102
+msgid "Not available in all themes"
+msgstr "No disponible en todos los temas"
+
+#: ../../Zotlabs/Module/Settings.php:1103
+msgid "System (personal) notifications"
+msgstr "Notificaciones del sistema (personales)"
+
+#: ../../Zotlabs/Module/Settings.php:1104
+msgid "System info messages"
+msgstr "Mensajes de información del sistema"
+
+#: ../../Zotlabs/Module/Settings.php:1105
+msgid "System critical alerts"
+msgstr "Alertas críticas del sistema"
+
+#: ../../Zotlabs/Module/Settings.php:1106
+msgid "New connections"
+msgstr "Nuevas conexiones"
+
+#: ../../Zotlabs/Module/Settings.php:1107
+msgid "System Registrations"
+msgstr "Registros del sistema"
+
+#: ../../Zotlabs/Module/Settings.php:1108
+msgid ""
+"Also show new wall posts, private messages and connections under Notices"
+msgstr "Mostrar también en Avisos las nuevas publicaciones, los mensajes privados y las conexiones"
+
+#: ../../Zotlabs/Module/Settings.php:1110
+msgid "Notify me of events this many days in advance"
+msgstr "Avisarme de los eventos con algunos días de antelación"
+
+#: ../../Zotlabs/Module/Settings.php:1110
+msgid "Must be greater than 0"
+msgstr "Debe ser mayor que 0"
+
+#: ../../Zotlabs/Module/Settings.php:1112
+msgid "Advanced Account/Page Type Settings"
+msgstr "Ajustes avanzados de la cuenta y de los tipos de página"
+
+#: ../../Zotlabs/Module/Settings.php:1113
+msgid "Change the behaviour of this account for special situations"
+msgstr "Cambiar el comportamiento de esta cuenta en situaciones especiales"
+
+#: ../../Zotlabs/Module/Settings.php:1116
+msgid ""
+"Please enable expert mode (in <a href=\"settings/features\">Settings > "
+"Additional features</a>) to adjust!"
+msgstr "¡Activar el modo de experto (en <a href=\"settings/features\">Ajustes > Funcionalidades</a>) para realizar cambios!."
+
+#: ../../Zotlabs/Module/Settings.php:1117
+msgid "Miscellaneous Settings"
+msgstr "Ajustes diversos"
+
+#: ../../Zotlabs/Module/Settings.php:1118
+msgid "Default photo upload folder"
+msgstr "Carpeta por defecto de las fotos subidas"
+
+#: ../../Zotlabs/Module/Settings.php:1118
+#: ../../Zotlabs/Module/Settings.php:1119
+msgid "%Y - current year, %m - current month"
+msgstr "%Y - año en curso, %m - mes actual"
+
+#: ../../Zotlabs/Module/Settings.php:1119
+msgid "Default file upload folder"
+msgstr "Carpeta por defecto de los archivos subidos"
+
+#: ../../Zotlabs/Module/Settings.php:1121
+msgid "Personal menu to display in your channel pages"
+msgstr "Menú personal que debe mostrarse en las páginas de su canal"
+
+#: ../../Zotlabs/Module/Settings.php:1123
+msgid "Remove this channel."
+msgstr "Eliminar este canal."
+
+#: ../../Zotlabs/Module/Settings.php:1124
+msgid "Firefox Share $Projectname provider"
+msgstr "Servicio de compartición de Firefox: proveedor $Projectname"
+
+#: ../../Zotlabs/Module/Settings.php:1125
+msgid "Start calendar week on monday"
+msgstr "Comenzar el calendario semanal por el lunes"
+
+#: ../../Zotlabs/Module/Setup.php:202
+msgid "$Projectname Server - Setup"
+msgstr "Servidor $Projectname - Instalación"
+
+#: ../../Zotlabs/Module/Setup.php:206
+msgid "Could not connect to database."
+msgstr "No se ha podido conectar a la base de datos."
+
+#: ../../Zotlabs/Module/Setup.php:210
+msgid ""
+"Could not connect to specified site URL. Possible SSL certificate or DNS "
+"issue."
+msgstr "No se puede conectar con la dirección del sitio indicada. Podría tratarse de un problema de SSL o DNS."
+
+#: ../../Zotlabs/Module/Setup.php:217
+msgid "Could not create table."
+msgstr "No se puede crear la tabla."
+
+#: ../../Zotlabs/Module/Setup.php:222
+msgid "Your site database has been installed."
+msgstr "La base de datos del sitio ha sido instalada."
+
+#: ../../Zotlabs/Module/Setup.php:226
+msgid ""
+"You may need to import the file \"install/schema_xxx.sql\" manually using a "
+"database client."
+msgstr "Podría tener que importar manualmente el fichero \"install/schema_xxx.sql\" usando un cliente de base de datos."
+
+#: ../../Zotlabs/Module/Setup.php:227 ../../Zotlabs/Module/Setup.php:289
+#: ../../Zotlabs/Module/Setup.php:739
+msgid "Please see the file \"install/INSTALL.txt\"."
+msgstr "Por favor, lea el fichero \"install/INSTALL.txt\"."
+
+#: ../../Zotlabs/Module/Setup.php:286
+msgid "System check"
+msgstr "Verificación del sistema"
+
+#: ../../Zotlabs/Module/Setup.php:291
+msgid "Check again"
+msgstr "Verificar de nuevo"
+
+#: ../../Zotlabs/Module/Setup.php:313
+msgid "Database connection"
+msgstr "Conexión a la base de datos"
+
+#: ../../Zotlabs/Module/Setup.php:314
+msgid ""
+"In order to install $Projectname we need to know how to connect to your "
+"database."
+msgstr "Para instalar $Projectname es necesario saber cómo conectar con su base de datos."
+
+#: ../../Zotlabs/Module/Setup.php:315
+msgid ""
+"Please contact your hosting provider or site administrator if you have "
+"questions about these settings."
+msgstr "Por favor, contacte con el proveedor de servicios o el administrador del sitio si tiene dudas sobre estos ajustes."
+
+#: ../../Zotlabs/Module/Setup.php:316
+msgid ""
+"The database you specify below should already exist. If it does not, please "
+"create it before continuing."
+msgstr "La base de datos que especifique a continuación debe existir ya. Si no es así, por favor, créela antes de seguir."
+
+#: ../../Zotlabs/Module/Setup.php:320
+msgid "Database Server Name"
+msgstr "Nombre del servidor de base de datos"
+
+#: ../../Zotlabs/Module/Setup.php:320
+msgid "Default is 127.0.0.1"
+msgstr "De forma predeterminada es 127.0.0.1"
+
+#: ../../Zotlabs/Module/Setup.php:321
+msgid "Database Port"
+msgstr "Puerto de la base de datos"
+
+#: ../../Zotlabs/Module/Setup.php:321
+msgid "Communication port number - use 0 for default"
+msgstr "Número del puerto de comunicaciones - use 0 como valor por defecto"
+
+#: ../../Zotlabs/Module/Setup.php:322
+msgid "Database Login Name"
+msgstr "Usuario de la base de datos"
+
+#: ../../Zotlabs/Module/Setup.php:323
+msgid "Database Login Password"
+msgstr "Contraseña de acceso a la base de datos"
+
+#: ../../Zotlabs/Module/Setup.php:324
+msgid "Database Name"
+msgstr "Nombre de la base de datos"
+
+#: ../../Zotlabs/Module/Setup.php:325
+msgid "Database Type"
+msgstr "Tipo de base de datos"
+
+#: ../../Zotlabs/Module/Setup.php:327 ../../Zotlabs/Module/Setup.php:367
+msgid "Site administrator email address"
+msgstr "Dirección de correo electrónico del administrador del sitio"
+
+#: ../../Zotlabs/Module/Setup.php:327 ../../Zotlabs/Module/Setup.php:367
+msgid ""
+"Your account email address must match this in order to use the web admin "
+"panel."
+msgstr "Su cuenta deberá usar la misma dirección de correo electrónico para poder utilizar el panel de administración web."
+
+#: ../../Zotlabs/Module/Setup.php:328 ../../Zotlabs/Module/Setup.php:369
+msgid "Website URL"
+msgstr "Dirección del sitio web"
+
+#: ../../Zotlabs/Module/Setup.php:328 ../../Zotlabs/Module/Setup.php:369
+msgid "Please use SSL (https) URL if available."
+msgstr "Por favor, use SSL (https) si está disponible."
+
+#: ../../Zotlabs/Module/Setup.php:329 ../../Zotlabs/Module/Setup.php:372
+msgid "Please select a default timezone for your website"
+msgstr "Por favor, selecciones el huso horario por defecto de su sitio web"
+
+#: ../../Zotlabs/Module/Setup.php:356
+msgid "Site settings"
+msgstr "Ajustes del sitio"
+
+#: ../../Zotlabs/Module/Setup.php:370
+msgid "Enable $Projectname <strong>advanced</strong> features?"
+msgstr "¿Habilitar las funcionalidades <strong>avanzadas</strong> de $Projectname ?"
+
+#: ../../Zotlabs/Module/Setup.php:370
+msgid ""
+"Some advanced features, while useful - may be best suited for technically "
+"proficient audiences"
+msgstr "Algunas funcionalidades avanzadas, si bien son útiles, pueden ser más adecuadas para un público técnicamente competente"
+
+#: ../../Zotlabs/Module/Setup.php:422
+msgid "Could not find a command line version of PHP in the web server PATH."
+msgstr "No se puede encontrar una versión en línea de comandos de PHP en la ruta del servidor web."
+
+#: ../../Zotlabs/Module/Setup.php:423
+msgid ""
+"If you don't have a command line version of PHP installed on server, you "
+"will not be able to run background polling via cron."
+msgstr "Si no tiene instalada la versión de línea de comandos de PHP en su servidor, no podrá realizar envíos en segundo plano mediante cron."
+
+#: ../../Zotlabs/Module/Setup.php:427
+msgid "PHP executable path"
+msgstr "Ruta del ejecutable PHP"
+
+#: ../../Zotlabs/Module/Setup.php:427
+msgid ""
+"Enter full path to php executable. You can leave this blank to continue the "
+"installation."
+msgstr "Introducir la ruta completa del ejecutable PHP. Puede dejar la línea en blanco para continuar la instalación."
+
+#: ../../Zotlabs/Module/Setup.php:432
+msgid "Command line PHP"
+msgstr "PHP en línea de comandos"
+
+#: ../../Zotlabs/Module/Setup.php:441
+msgid ""
+"The command line version of PHP on your system does not have "
+"\"register_argc_argv\" enabled."
+msgstr "La línea de comandos PHP de su sistema no tiene activado \"register_argc_argv\"."
+
+#: ../../Zotlabs/Module/Setup.php:442
+msgid "This is required for message delivery to work."
+msgstr "Esto es necesario para que funcione la transmisión de mensajes."
+
+#: ../../Zotlabs/Module/Setup.php:445
+msgid "PHP register_argc_argv"
+msgstr "PHP register_argc_argv"
+
+#: ../../Zotlabs/Module/Setup.php:463
+#, php-format
+msgid ""
+"Your max allowed total upload size is set to %s. Maximum size of one file to"
+" upload is set to %s. You are allowed to upload up to %d files at once."
+msgstr "La carga máxima que se le permite subir está establecida en %s. El tamaño máximo de un fichero está establecido en %s. Está permitido subir hasta un máximo de %d ficheros de una sola vez."
+
+#: ../../Zotlabs/Module/Setup.php:468
+msgid "You can adjust these settings in the servers php.ini."
+msgstr "Puede ajustar estos valores en el fichero php.ini de su servidor."
+
+#: ../../Zotlabs/Module/Setup.php:470
+msgid "PHP upload limits"
+msgstr "Límites PHP de subida"
+
+#: ../../Zotlabs/Module/Setup.php:493
+msgid ""
+"Error: the \"openssl_pkey_new\" function on this system is not able to "
+"generate encryption keys"
+msgstr "Error: La función \"openssl_pkey_new\" en este sistema no es capaz de general claves de cifrado."
+
+#: ../../Zotlabs/Module/Setup.php:494
+msgid ""
+"If running under Windows, please see "
+"\"http://www.php.net/manual/en/openssl.installation.php\"."
+msgstr "Si está en un servidor Windows, por favor, lea \"http://www.php.net/manual/en/openssl.installation.php\"."
+
+#: ../../Zotlabs/Module/Setup.php:497
+msgid "Generate encryption keys"
+msgstr "Generar claves de cifrado"
+
+#: ../../Zotlabs/Module/Setup.php:509
+msgid "libCurl PHP module"
+msgstr "módulo libCurl PHP"
+
+#: ../../Zotlabs/Module/Setup.php:510
+msgid "GD graphics PHP module"
+msgstr "módulo PHP GD graphics"
+
+#: ../../Zotlabs/Module/Setup.php:511
+msgid "OpenSSL PHP module"
+msgstr "módulo PHP OpenSSL"
+
+#: ../../Zotlabs/Module/Setup.php:512
+msgid "mysqli or postgres PHP module"
+msgstr "módulo PHP mysqli o postgres"
+
+#: ../../Zotlabs/Module/Setup.php:513
+msgid "mb_string PHP module"
+msgstr "módulo PHP mb_string"
+
+#: ../../Zotlabs/Module/Setup.php:514
+msgid "mcrypt PHP module"
+msgstr "módulo PHP mcrypt "
+
+#: ../../Zotlabs/Module/Setup.php:515
+msgid "xml PHP module"
+msgstr "módulo PHP xml"
+
+#: ../../Zotlabs/Module/Setup.php:519 ../../Zotlabs/Module/Setup.php:521
+msgid "Apache mod_rewrite module"
+msgstr "módulo Apache mod_rewrite "
+
+#: ../../Zotlabs/Module/Setup.php:519
+msgid ""
+"Error: Apache webserver mod-rewrite module is required but not installed."
+msgstr "Error: se necesita el módulo del servidor web Apache mod-rewrite pero no está instalado."
+
+#: ../../Zotlabs/Module/Setup.php:525 ../../Zotlabs/Module/Setup.php:528
+msgid "proc_open"
+msgstr "proc_open"
+
+#: ../../Zotlabs/Module/Setup.php:525
+msgid ""
+"Error: proc_open is required but is either not installed or has been "
+"disabled in php.ini"
+msgstr "Error: se necesita proc_open pero o no está instalado o ha sido desactivado en el fichero php.ini"
+
+#: ../../Zotlabs/Module/Setup.php:533
+msgid "Error: libCURL PHP module required but not installed."
+msgstr "Error: se necesita el módulo PHP libCURL pero no está instalado."
+
+#: ../../Zotlabs/Module/Setup.php:537
+msgid ""
+"Error: GD graphics PHP module with JPEG support required but not installed."
+msgstr "Error: el módulo PHP GD graphics es necesario, pero no está instalado."
+
+#: ../../Zotlabs/Module/Setup.php:541
+msgid "Error: openssl PHP module required but not installed."
+msgstr "Error: el módulo PHP openssl es necesario, pero no está instalado."
+
+#: ../../Zotlabs/Module/Setup.php:545
+msgid ""
+"Error: mysqli or postgres PHP module required but neither are installed."
+msgstr "Error: el módulo PHP mysqli o postgres es necesario pero ninguno de los dos está instalado."
+
+#: ../../Zotlabs/Module/Setup.php:549
+msgid "Error: mb_string PHP module required but not installed."
+msgstr "Error: el módulo PHP mb_string es necesario, pero no está instalado."
+
+#: ../../Zotlabs/Module/Setup.php:553
+msgid "Error: mcrypt PHP module required but not installed."
+msgstr "Error: el módulo PHP mcrypt es necesario, pero no está instalado."
+
+#: ../../Zotlabs/Module/Setup.php:557
+msgid "Error: xml PHP module required for DAV but not installed."
+msgstr "Error: el módulo PHP xml es necesario para DAV, pero no está instalado."
+
+#: ../../Zotlabs/Module/Setup.php:575
+msgid ""
+"The web installer needs to be able to create a file called \".htconfig.php\""
+" in the top folder of your web server and it is unable to do so."
+msgstr "El instalador web no ha podido crear un fichero llamado “.htconfig.php” en la carpeta base de su servidor."
+
+#: ../../Zotlabs/Module/Setup.php:576
+msgid ""
+"This is most often a permission setting, as the web server may not be able "
+"to write files in your folder - even if you can."
+msgstr "Esto está generalmente ligado a un problema de permisos, a causa del cual el servidor web tiene prohibido modificar ficheros en su carpeta - incluso si usted mismo tiene esos permisos."
+
+#: ../../Zotlabs/Module/Setup.php:577
+msgid ""
+"At the end of this procedure, we will give you a text to save in a file "
+"named .htconfig.php in your Red top folder."
+msgstr "Al término de este procedimiento, podemos crear un fichero de texto para guardar con el nombre .htconfig.php en el directorio raíz de su instalación de Hubzilla."
+
+#: ../../Zotlabs/Module/Setup.php:578
+msgid ""
+"You can alternatively skip this procedure and perform a manual installation."
+" Please see the file \"install/INSTALL.txt\" for instructions."
+msgstr "Como alternativa, puede dejar este procedimiento e intentar realizar una instalación manual. Lea, por favor, el fichero\"install/INSTALL.txt\" para las instrucciones."
+
+#: ../../Zotlabs/Module/Setup.php:581
+msgid ".htconfig.php is writable"
+msgstr ".htconfig.php tiene permisos de escritura"
+
+#: ../../Zotlabs/Module/Setup.php:595
+msgid ""
+"Red uses the Smarty3 template engine to render its web views. Smarty3 "
+"compiles templates to PHP to speed up rendering."
+msgstr "Hubzilla hace uso del motor de plantillas Smarty3 para diseñar sus plantillas gráficas. Smarty3 es más rápido porque compila las plantillas de páginas directamente en PHP."
+
+#: ../../Zotlabs/Module/Setup.php:596
+#, php-format
+msgid ""
+"In order to store these compiled templates, the web server needs to have "
+"write access to the directory %s under the Red top level folder."
+msgstr "Para poder guardar las plantillas compiladas, el servidor web necesita permisos para acceder al subdirectorio %s en el directorio de instalación de Hubzilla."
+
+#: ../../Zotlabs/Module/Setup.php:597 ../../Zotlabs/Module/Setup.php:618
+msgid ""
+"Please ensure that the user that your web server runs as (e.g. www-data) has"
+" write access to this folder."
+msgstr "Por favor, asegúrese de que el servidor web está siendo ejecutado por un usuario que tenga permisos de escritura sobre esta carpeta (por ejemplo, www-data)."
+
+#: ../../Zotlabs/Module/Setup.php:598
+#, php-format
+msgid ""
+"Note: as a security measure, you should give the web server write access to "
+"%s only--not the template files (.tpl) that it contains."
+msgstr "Nota: como medida de seguridad, debe dar al servidor web permisos de escritura solo sobre %s - no sobre el fichero de plantilla (.tpl) que contiene."
+
+#: ../../Zotlabs/Module/Setup.php:601
+#, php-format
+msgid "%s is writable"
+msgstr "%s tiene permisos de escritura"
+
+#: ../../Zotlabs/Module/Setup.php:617
+msgid ""
+"Red uses the store directory to save uploaded files. The web server needs to"
+" have write access to the store directory under the Red top level folder"
+msgstr "Hubzilla guarda los ficheros descargados en la carpeta \"store\". El servidor web necesita tener permisos de escritura sobre esa carpeta, en el directorio de instalación."
+
+#: ../../Zotlabs/Module/Setup.php:621
+msgid "store is writable"
+msgstr "\"store\" tiene permisos de escritura"
+
+#: ../../Zotlabs/Module/Setup.php:654
+msgid ""
+"SSL certificate cannot be validated. Fix certificate or disable https access"
+" to this site."
+msgstr "El certificado SSL no ha podido ser validado. Corrija este problema o desactive el acceso https a este sitio."
+
+#: ../../Zotlabs/Module/Setup.php:655
+msgid ""
+"If you have https access to your website or allow connections to TCP port "
+"443 (the https: port), you MUST use a browser-valid certificate. You MUST "
+"NOT use self-signed certificates!"
+msgstr "Si su servidor soporta conexiones cifradas SSL o si permite conexiones al puerto TCP 443 (el puerto usado por el protocolo https), debe utilizar un certificado válido. No debe usar un certificado firmado por usted mismo."
+
+#: ../../Zotlabs/Module/Setup.php:656
+msgid ""
+"This restriction is incorporated because public posts from you may for "
+"example contain references to images on your own hub."
+msgstr "Se ha incorporado esta restricción para evitar que sus publicaciones públicas hagan referencia a imágenes en su propio servidor."
+
+#: ../../Zotlabs/Module/Setup.php:657
+msgid ""
+"If your certificate is not recognized, members of other sites (who may "
+"themselves have valid certificates) will get a warning message on their own "
+"site complaining about security issues."
+msgstr "Si su certificado no ha sido reconocido, los miembros de otros sitios (con certificados válidos) recibirán mensajes de aviso en sus propios sitios web."
+
+#: ../../Zotlabs/Module/Setup.php:658
+msgid ""
+"This can cause usability issues elsewhere (not just on your own site) so we "
+"must insist on this requirement."
+msgstr "Por razones de compatibilidad (sobre el conjunto de la red, no solo sobre su propio sitio), debemos insistir en estos requisitos."
+
+#: ../../Zotlabs/Module/Setup.php:659
+msgid ""
+"Providers are available that issue free certificates which are browser-"
+"valid."
+msgstr "Existen varias Autoridades de Certificación que le pueden proporcionar certificados válidos."
+
+#: ../../Zotlabs/Module/Setup.php:661
+msgid "SSL certificate validation"
+msgstr "validación del certificado SSL"
+
+#: ../../Zotlabs/Module/Setup.php:667
+msgid ""
+"Url rewrite in .htaccess is not working. Check your server "
+"configuration.Test: "
+msgstr "No se pueden reescribir las direcciones web en .htaccess. Compruebe la configuración de su servidor:"
+
+#: ../../Zotlabs/Module/Setup.php:670
+msgid "Url rewrite is working"
+msgstr "La reescritura de las direcciones funciona correctamente"
+
+#: ../../Zotlabs/Module/Setup.php:679
+msgid ""
+"The database configuration file \".htconfig.php\" could not be written. "
+"Please use the enclosed text to create a configuration file in your web "
+"server root."
+msgstr "El fichero de configuración de la base de datos .htconfig.php no se ha podido modificar. Por favor, copie el texto generado en un fichero con ese nombre en el directorio raíz de su servidor."
+
+#: ../../Zotlabs/Module/Setup.php:703
+msgid "Errors encountered creating database tables."
+msgstr "Se han encontrado errores al crear las tablas de la base de datos."
+
+#: ../../Zotlabs/Module/Setup.php:737
+msgid "<h1>What next</h1>"
+msgstr "<h1>Siguiente paso</h1>"
+
+#: ../../Zotlabs/Module/Setup.php:738
+msgid ""
+"IMPORTANT: You will need to [manually] setup a scheduled task for the "
+"poller."
+msgstr "IMPORTANTE: Debe crear [manualmente] una tarea programada para el \"poller\"."
+
+#: ../../Zotlabs/Module/Sharedwithme.php:98
+msgid "Files: shared with me"
+msgstr "Ficheros: compartidos conmigo"
+
+#: ../../Zotlabs/Module/Sharedwithme.php:100
+msgid "NEW"
+msgstr "NUEVO"
+
+#: ../../Zotlabs/Module/Sharedwithme.php:103
+msgid "Remove all files"
+msgstr "Eliminar todos los ficheros"
+
+#: ../../Zotlabs/Module/Sharedwithme.php:104
+msgid "Remove this file"
+msgstr "Eliminar este fichero"
+
+#: ../../Zotlabs/Module/Siteinfo.php:19
+#, php-format
+msgid "Version %s"
+msgstr "Versión %s"
+
+#: ../../Zotlabs/Module/Siteinfo.php:40
+msgid "Installed plugins/addons/apps:"
+msgstr "Extensiones, complementos o aplicaciones instaladas:"
+
+#: ../../Zotlabs/Module/Siteinfo.php:53
+msgid "No installed plugins/addons/apps"
+msgstr "No hay instalada ninguna extensión, complemento o aplicación"
+
+#: ../../Zotlabs/Module/Siteinfo.php:66
+msgid ""
+"This is a hub of $Projectname - a global cooperative network of "
+"decentralized privacy enhanced websites."
+msgstr "Este es un sitio integrado en $Projectname - una red cooperativa mundial de sitios web descentralizados de privacidad mejorada."
+
+#: ../../Zotlabs/Module/Siteinfo.php:68
+msgid "Tag: "
+msgstr "Etiqueta:"
+
+#: ../../Zotlabs/Module/Siteinfo.php:70
+msgid "Last background fetch: "
+msgstr "Última actualización en segundo plano:"
+
+#: ../../Zotlabs/Module/Siteinfo.php:72
+msgid "Current load average: "
+msgstr "Carga media actual:"
+
+#: ../../Zotlabs/Module/Siteinfo.php:75
+msgid "Running at web location"
+msgstr "Corriendo en el sitio web"
+
+#: ../../Zotlabs/Module/Siteinfo.php:76
+msgid ""
+"Please visit <a href=\"http://hubzilla.org\">hubzilla.org</a> to learn more "
+"about $Projectname."
+msgstr "Por favor, visite <a href=\"http://hubzilla.org\">hubzilla.org</a> para más información sobre $Projectname."
+
+#: ../../Zotlabs/Module/Siteinfo.php:77
+msgid "Bug reports and issues: please visit"
+msgstr "Informes de errores e incidencias: por favor visite"
+
+#: ../../Zotlabs/Module/Siteinfo.php:79
+msgid "$projectname issues"
+msgstr "Problemas en $projectname"
+
+#: ../../Zotlabs/Module/Siteinfo.php:80
+msgid ""
+"Suggestions, praise, etc. - please email \"redmatrix\" at librelist - dot "
+"com"
+msgstr "Sugerencias, elogios, etc - por favor, un correo electrónico a \"redmatrix\" en librelist - punto com"
+
+#: ../../Zotlabs/Module/Siteinfo.php:82
+msgid "Site Administrators"
+msgstr "Administradores del sitio"
+
+#: ../../Zotlabs/Module/Sources.php:36
+msgid "Failed to create source. No channel selected."
+msgstr "Imposible crear el origen de los contenidos. Ningún canal ha sido seleccionado."
+
+#: ../../Zotlabs/Module/Sources.php:49
+msgid "Source created."
+msgstr "Fuente creada."
+
+#: ../../Zotlabs/Module/Sources.php:61
+msgid "Source updated."
+msgstr "Fuente actualizada."
+
+#: ../../Zotlabs/Module/Sources.php:86
+msgid "*"
+msgstr "*"
+
+#: ../../Zotlabs/Module/Sources.php:92 ../../include/features.php:71
+#: ../../include/widgets.php:581
+msgid "Channel Sources"
+msgstr "Orígenes de los contenidos del canal"
+
+#: ../../Zotlabs/Module/Sources.php:93
+msgid "Manage remote sources of content for your channel."
+msgstr "Gestionar contenido de origen remoto para su canal."
+
+#: ../../Zotlabs/Module/Sources.php:94 ../../Zotlabs/Module/Sources.php:104
+msgid "New Source"
+msgstr "Nueva fuente"
+
+#: ../../Zotlabs/Module/Sources.php:105 ../../Zotlabs/Module/Sources.php:137
+msgid ""
+"Import all or selected content from the following channel into this channel "
+"and distribute it according to your channel settings."
+msgstr "Importar todo el contenido o una selección de los siguientes canales en este canal y distribuirlo de acuerdo con sus ajustes."
+
+#: ../../Zotlabs/Module/Sources.php:106 ../../Zotlabs/Module/Sources.php:138
+msgid "Only import content with these words (one per line)"
+msgstr "Importar solo contenido que contenga estas palabras (una por línea)"
+
+#: ../../Zotlabs/Module/Sources.php:106 ../../Zotlabs/Module/Sources.php:138
+msgid "Leave blank to import all public content"
+msgstr "Dejar en blanco para importar todo el contenido público"
+
+#: ../../Zotlabs/Module/Sources.php:107 ../../Zotlabs/Module/Sources.php:141
+msgid "Channel Name"
+msgstr "Nombre del canal"
+
+#: ../../Zotlabs/Module/Sources.php:127 ../../Zotlabs/Module/Sources.php:154
+msgid "Source not found."
+msgstr "Fuente no encontrada"
+
+#: ../../Zotlabs/Module/Sources.php:134
+msgid "Edit Source"
+msgstr "Editar fuente"
+
+#: ../../Zotlabs/Module/Sources.php:135
+msgid "Delete Source"
+msgstr "Eliminar fuente"
+
+#: ../../Zotlabs/Module/Sources.php:162
+msgid "Source removed"
+msgstr "Fuente eliminada"
+
+#: ../../Zotlabs/Module/Sources.php:164
+msgid "Unable to remove source."
+msgstr "Imposible eliminar la fuente."
+
+#: ../../Zotlabs/Module/Subthread.php:118
+#, php-format
+msgid "%1$s is following %2$s's %3$s"
+msgstr "%1$s está siguiendo %3$s de %2$s"
+
+#: ../../Zotlabs/Module/Subthread.php:120
+#, php-format
+msgid "%1$s stopped following %2$s's %3$s"
+msgstr "%1$s ha dejado de seguir %3$s de %2$s"
+
+#: ../../Zotlabs/Module/Suggest.php:39
+msgid ""
+"No suggestions available. If this is a new site, please try again in 24 "
+"hours."
+msgstr "No hay sugerencias disponibles. Si es un sitio nuevo, espere 24 horas y pruebe de nuevo."
+
+#: ../../Zotlabs/Module/Suggest.php:58 ../../include/widgets.php:149
+msgid "Ignore/Hide"
+msgstr "Ignorar/Ocultar"
+
+#: ../../Zotlabs/Module/Tagger.php:55 ../../include/bbcode.php:257
+msgid "post"
+msgstr "la entrada"
+
+#: ../../Zotlabs/Module/Tagger.php:57 ../../include/conversation.php:150
+#: ../../include/text.php:1975
+msgid "comment"
+msgstr "el comentario"
+
+#: ../../Zotlabs/Module/Tagger.php:100
+#, php-format
+msgid "%1$s tagged %2$s's %3$s with %4$s"
+msgstr "%1$s ha etiquetado %3$s de %2$s con %4$s"
+
+#: ../../Zotlabs/Module/Tagrm.php:48 ../../Zotlabs/Module/Tagrm.php:98
+msgid "Tag removed"
+msgstr "Etiqueta eliminada."
+
+#: ../../Zotlabs/Module/Tagrm.php:123
+msgid "Remove Item Tag"
+msgstr "Eliminar etiqueta del elemento."
+
+#: ../../Zotlabs/Module/Tagrm.php:125
+msgid "Select a tag to remove: "
+msgstr "Seleccionar una etiqueta para eliminar:"
+
+#: ../../Zotlabs/Module/Thing.php:114
+msgid "Thing updated"
+msgstr "Elemento actualizado."
+
+#: ../../Zotlabs/Module/Thing.php:166
+msgid "Object store: failed"
+msgstr "Guardar objeto: ha fallado"
+
+#: ../../Zotlabs/Module/Thing.php:170
+msgid "Thing added"
+msgstr "Elemento añadido"
+
+#: ../../Zotlabs/Module/Thing.php:196
+#, php-format
+msgid "OBJ: %1$s %2$s %3$s"
+msgstr "OBJ: %1$s %2$s %3$s"
+
+#: ../../Zotlabs/Module/Thing.php:259
+msgid "Show Thing"
+msgstr "Mostrar elemento"
+
+#: ../../Zotlabs/Module/Thing.php:266
+msgid "item not found."
+msgstr "elemento no encontrado."
+
+#: ../../Zotlabs/Module/Thing.php:299
+msgid "Edit Thing"
+msgstr "Editar elemento"
+
+#: ../../Zotlabs/Module/Thing.php:301 ../../Zotlabs/Module/Thing.php:351
+msgid "Select a profile"
+msgstr "Seleccionar un perfil"
+
+#: ../../Zotlabs/Module/Thing.php:305 ../../Zotlabs/Module/Thing.php:354
+msgid "Post an activity"
+msgstr "Publicar una actividad"
+
+#: ../../Zotlabs/Module/Thing.php:305 ../../Zotlabs/Module/Thing.php:354
+msgid "Only sends to viewers of the applicable profile"
+msgstr "Sólo enviar a espectadores del perfil pertinente."
+
+#: ../../Zotlabs/Module/Thing.php:307 ../../Zotlabs/Module/Thing.php:356
+msgid "Name of thing e.g. something"
+msgstr "Nombre del elemento, p. ej.:. \"algo\""
+
+#: ../../Zotlabs/Module/Thing.php:309 ../../Zotlabs/Module/Thing.php:357
+msgid "URL of thing (optional)"
+msgstr "Dirección del elemento (opcional)"
+
+#: ../../Zotlabs/Module/Thing.php:311 ../../Zotlabs/Module/Thing.php:358
+msgid "URL for photo of thing (optional)"
+msgstr "Dirección para la foto o elemento (opcional)"
+
+#: ../../Zotlabs/Module/Thing.php:349
+msgid "Add Thing to your Profile"
+msgstr "Añadir alguna cosa a su perfil"
+
+#: ../../Zotlabs/Module/Uexport.php:55 ../../Zotlabs/Module/Uexport.php:56
+msgid "Export Channel"
+msgstr "Exportar el canal"
+
+#: ../../Zotlabs/Module/Uexport.php:57
+msgid ""
+"Export your basic channel information to a file. This acts as a backup of "
+"your connections, permissions, profile and basic data, which can be used to "
+"import your data to a new server hub, but does not contain your content."
+msgstr "Exportar la información básica del canal a un fichero. Este equivale a una copia de seguridad de sus conexiones, el perfil y datos fundamentales, que puede usarse para importar sus datos a un nuevo servidor, pero no incluye su contenido."
+
+#: ../../Zotlabs/Module/Uexport.php:58
+msgid "Export Content"
+msgstr "Exportar contenidos"
+
+#: ../../Zotlabs/Module/Uexport.php:59
+msgid ""
+"Export your channel information and recent content to a JSON backup that can"
+" be restored or imported to another server hub. This backs up all of your "
+"connections, permissions, profile data and several months of posts. This "
+"file may be VERY large. Please be patient - it may take several minutes for"
+" this download to begin."
+msgstr "Exportar la información sobre su canal y el contenido reciente a un fichero de respaldo JSON, que puede ser restaurado o importado a otro servidor. Este fichero incluye todas sus conexiones, permisos, datos del perfil y publicaciones de varios meses. Puede llegar a ser MUY grande. Por favor, sea paciente, la descarga puede tardar varios minutos en comenzar."
+
+#: ../../Zotlabs/Module/Uexport.php:60
+msgid "Export your posts from a given year."
+msgstr "Exporta sus publicaciones de un año dado."
+
+#: ../../Zotlabs/Module/Uexport.php:62
+msgid ""
+"You may also export your posts and conversations for a particular year or "
+"month. Adjust the date in your browser location bar to select other dates. "
+"If the export fails (possibly due to memory exhaustion on your server hub), "
+"please try again selecting a more limited date range."
+msgstr "También puede exportar sus mensajes y conversaciones durante un año o mes en particular. Ajuste la fecha en la barra de direcciones del navegador para seleccionar otras fechas. Si la exportación falla (posiblemente debido al agotamiento de la memoria del servidor hub), por favor, intente de nuevo la selección de un rango de fechas más pequeño."
+
+#: ../../Zotlabs/Module/Uexport.php:63
+#, php-format
+msgid ""
+"To select all posts for a given year, such as this year, visit <a "
+"href=\"%1$s\">%2$s</a>"
+msgstr "Para seleccionar todos los mensajes de un año determinado, como este año, visite <a href=\"%1$s\">%2$s</a>"
+
+#: ../../Zotlabs/Module/Uexport.php:64
+#, php-format
+msgid ""
+"To select all posts for a given month, such as January of this year, visit "
+"<a href=\"%1$s\">%2$s</a>"
+msgstr "Para seleccionar todos los mensajes de un mes determinado, como el de enero de este año, visite <a href=\"%1$s\">%2$s</a>"
+
+#: ../../Zotlabs/Module/Uexport.php:65
+#, php-format
+msgid ""
+"These content files may be imported or restored by visiting <a "
+"href=\"%1$s\">%2$s</a> on any site containing your channel. For best results"
+" please import or restore these in date order (oldest first)."
+msgstr "Estos ficheros pueden ser importados o restaurados visitando <a href=\"%1$s\">%2$s</a> o cualquier sitio que contenga su canal. Para obtener los mejores resultados, por favor, importar o restaurar estos ficheros en orden de fecha (la más antigua primero)."
+
+#: ../../Zotlabs/Module/Viewconnections.php:63
+msgid "No connections."
+msgstr "Sin conexiones."
+
+#: ../../Zotlabs/Module/Viewconnections.php:76
+#, php-format
+msgid "Visit %s's profile [%s]"
+msgstr "Visitar el perfil de %s [%s]"
+
+#: ../../Zotlabs/Module/Viewconnections.php:105
+msgid "View Connections"
+msgstr "Ver conexiones"
+
+#: ../../Zotlabs/Module/Viewsrc.php:44
+msgid "Source of Item"
+msgstr "Origen del elemento"
+
+#: ../../Zotlabs/Module/Webpages.php:186 ../../include/apps.php:136
+#: ../../include/conversation.php:1704 ../../include/nav.php:106
+msgid "Webpages"
+msgstr "Páginas web"
+
+#: ../../Zotlabs/Module/Webpages.php:197 ../../include/page_widgets.php:41
+msgid "Actions"
+msgstr "Acciones"
+
+#: ../../Zotlabs/Module/Webpages.php:198 ../../include/page_widgets.php:42
+msgid "Page Link"
+msgstr "Vínculo de la página"
+
+#: ../../Zotlabs/Module/Webpages.php:199
+msgid "Page Title"
+msgstr "Título de página"
+
+#: ../../Zotlabs/Module/Xchan.php:10
+msgid "Xchan Lookup"
+msgstr "Búsqueda de canales"
+
+#: ../../Zotlabs/Module/Xchan.php:13
+msgid "Lookup xchan beginning with (or webbie): "
+msgstr "Buscar un canal (o un \"webbie\") que comience por:"
+
#: ../../include/Import/import_diaspora.php:17
msgid "No username found in import file."
msgstr "No se ha encontrado el nombre de usuario en el fichero importado."
@@ -225,21 +6327,11 @@ msgstr "No se ha encontrado el nombre de usuario en el fichero importado."
msgid "Unable to create a unique channel address. Import failed."
msgstr "No se ha podido crear una dirección de canal única. Ha fallado la importación."
-#: ../../include/Import/import_diaspora.php:143 ../../mod/import.php:502
-msgid "Import completed."
-msgstr "Importación completada."
-
#: ../../include/dba/dba_driver.php:141
#, php-format
msgid "Cannot locate DNS info for database server '%s'"
msgstr "No se ha podido localizar información de DNS para el servidor de base de datos “%s”"
-#: ../../include/photo/photo_driver.php:722 ../../mod/photos.php:94
-#: ../../mod/photos.php:738 ../../mod/profile_photo.php:147
-#: ../../mod/profile_photo.php:239 ../../mod/profile_photo.php:327
-msgid "Profile Photos"
-msgstr "Fotos del perfil"
-
#: ../../include/identity.php:32
msgid "Unable to obtain identity information from database"
msgstr "No ha sido posible obtener información sobre la identidad desde la base de datos"
@@ -277,37 +6369,10 @@ msgstr "No ha sido posible recuperar la identidad creada"
msgid "Default Profile"
msgstr "Perfil principal"
-#: ../../include/identity.php:389 ../../include/identity.php:390
-#: ../../include/identity.php:397 ../../include/profile_selectors.php:80
-#: ../../include/widgets.php:446 ../../mod/connedit.php:591
-#: ../../mod/settings.php:349 ../../mod/settings.php:353
-#: ../../mod/settings.php:354 ../../mod/settings.php:357
-#: ../../mod/settings.php:368
-msgid "Friends"
-msgstr "Amigos/as"
-
#: ../../include/identity.php:784
msgid "Requested channel is not available."
msgstr "El canal solicitado no está disponible."
-#: ../../include/identity.php:830 ../../mod/achievements.php:11
-#: ../../mod/profile.php:16 ../../mod/connect.php:13
-#: ../../mod/editblock.php:29 ../../mod/editlayout.php:27
-#: ../../mod/webpages.php:29 ../../mod/editwebpage.php:28
-#: ../../mod/blocks.php:29 ../../mod/filestorage.php:54 ../../mod/hcard.php:8
-#: ../../mod/layouts.php:29
-msgid "Requested profile is not available."
-msgstr "El perfil solicitado no está disponible."
-
-#: ../../include/identity.php:923 ../../mod/profiles.php:691
-msgid "Change profile photo"
-msgstr "Cambiar la foto del perfil"
-
-#: ../../include/identity.php:930 ../../include/nav.php:88
-#: ../../mod/profiles.php:776
-msgid "Edit Profiles"
-msgstr "Editar perfiles"
-
#: ../../include/identity.php:931
msgid "Create New Profile"
msgstr "Crear un nuevo perfil"
@@ -316,32 +6381,10 @@ msgstr "Crear un nuevo perfil"
msgid "Edit Profile"
msgstr "Editar el perfil"
-#: ../../include/identity.php:948 ../../mod/profiles.php:766
-msgid "Profile Image"
-msgstr "Imagen del perfil"
-
#: ../../include/identity.php:951
msgid "Visible to everybody"
msgstr "Visible para todos"
-#: ../../include/identity.php:952 ../../mod/profiles.php:689
-#: ../../mod/profiles.php:770
-msgid "Edit visibility"
-msgstr "Editar visibilidad"
-
-#: ../../include/identity.php:1007 ../../include/conversation.php:961
-#: ../../include/Contact.php:101 ../../include/widgets.php:147
-#: ../../include/widgets.php:184 ../../mod/directory.php:321
-#: ../../mod/suggest.php:52 ../../mod/match.php:64
-msgid "Connect"
-msgstr "Conectar"
-
-#: ../../include/identity.php:1022 ../../include/bb2diaspora.php:487
-#: ../../include/event.php:52 ../../include/text.php:1452
-#: ../../mod/directory.php:307
-msgid "Location:"
-msgstr "Ubicación:"
-
#: ../../include/identity.php:1026 ../../include/identity.php:1281
msgid "Gender:"
msgstr "Género:"
@@ -358,20 +6401,10 @@ msgstr "Página personal:"
msgid "Online Now"
msgstr "Ahora en línea"
-#: ../../include/identity.php:1116 ../../include/identity.php:1192
-#: ../../mod/ping.php:318
-msgid "g A l F d"
-msgstr "g A l d F"
-
#: ../../include/identity.php:1117 ../../include/identity.php:1193
msgid "F d"
msgstr "d F"
-#: ../../include/identity.php:1162 ../../include/identity.php:1232
-#: ../../mod/ping.php:341
-msgid "[today]"
-msgstr "[hoy]"
-
#: ../../include/identity.php:1173
msgid "Birthday Reminders"
msgstr "Recordatorios de cumpleaños"
@@ -392,23 +6425,10 @@ msgstr "Recordatorios de eventos"
msgid "Events this week:"
msgstr "Eventos de esta semana:"
-#: ../../include/identity.php:1279 ../../mod/settings.php:1047
-msgid "Full Name:"
-msgstr "Nombre completo:"
-
#: ../../include/identity.php:1286
msgid "Like this channel"
msgstr "Me gusta este canal"
-#: ../../include/identity.php:1297 ../../include/ItemObject.php:179
-#: ../../include/conversation.php:1760 ../../include/taxonomy.php:415
-#: ../../mod/photos.php:1125
-msgctxt "noun"
-msgid "Like"
-msgid_plural "Likes"
-msgstr[0] "Me gusta"
-msgstr[1] "Me gusta"
-
#: ../../include/identity.php:1310
msgid "j F, Y"
msgstr "j F Y"
@@ -421,10 +6441,6 @@ msgstr "j F"
msgid "Birthday:"
msgstr "Cumpleaños:"
-#: ../../include/identity.php:1322 ../../mod/directory.php:302
-msgid "Age:"
-msgstr "Edad:"
-
#: ../../include/identity.php:1331
#, php-format
msgid "for %1$d %2$s"
@@ -434,10 +6450,6 @@ msgstr "por %1$d %2$s"
msgid "Sexual Preference:"
msgstr "Orientación sexual:"
-#: ../../include/identity.php:1338 ../../mod/directory.php:318
-msgid "Hometown:"
-msgstr "Lugar de nacimiento:"
-
#: ../../include/identity.php:1340
msgid "Tags:"
msgstr "Etiquetas:"
@@ -450,10 +6462,6 @@ msgstr "Posición política:"
msgid "Religion:"
msgstr "Religión:"
-#: ../../include/identity.php:1346 ../../mod/directory.php:320
-msgid "About:"
-msgstr "Sobre mí:"
-
#: ../../include/identity.php:1348
msgid "Hobbies/Interests:"
msgstr "Aficciones o intereses:"
@@ -502,19 +6510,10 @@ msgstr "Trabajo:"
msgid "School/education:"
msgstr "Estudios:"
-#: ../../include/identity.php:1388 ../../include/apps.php:138
-#: ../../mod/profperm.php:112
-msgid "Profile"
-msgstr "Perfil"
-
#: ../../include/identity.php:1390
msgid "Like this thing"
msgstr "Me gusta esto"
-#: ../../include/identity.php:1800 ../../mod/cover_photo.php:236
-msgid "cover photo"
-msgstr "Imagen de portada del perfil"
-
#: ../../include/notify.php:20
msgid "created a new post"
msgstr "ha creado una nueva entrada"
@@ -560,20 +6559,6 @@ msgstr "No estoy de acuerdo"
msgid "I abstain"
msgstr "Me abstengo"
-#: ../../include/ItemObject.php:175 ../../include/ItemObject.php:187
-#: ../../include/conversation.php:1736 ../../mod/photos.php:1121
-#: ../../mod/photos.php:1133
-msgid "View all"
-msgstr "Ver todo"
-
-#: ../../include/ItemObject.php:184 ../../include/conversation.php:1763
-#: ../../mod/photos.php:1130
-msgctxt "noun"
-msgid "Dislike"
-msgid_plural "Dislikes"
-msgstr[0] "No me gusta"
-msgstr[1] "No me gusta"
-
#: ../../include/ItemObject.php:212
msgid "Add Star"
msgstr "Destacar añadiendo una estrella"
@@ -602,18 +6587,10 @@ msgstr "Firma de mensaje incorrecta"
msgid "Add Tag"
msgstr "Añadir etiqueta"
-#: ../../include/ItemObject.php:254 ../../mod/photos.php:1065
-msgid "I like this (toggle)"
-msgstr "Me gusta (cambiar)"
-
#: ../../include/ItemObject.php:254 ../../include/taxonomy.php:328
msgid "like"
msgstr "me gusta"
-#: ../../include/ItemObject.php:255 ../../mod/photos.php:1066
-msgid "I don't like this (toggle)"
-msgstr "No me gusta esto (cambiar)"
-
#: ../../include/ItemObject.php:255 ../../include/taxonomy.php:329
msgid "dislike"
msgstr "no me gusta"
@@ -673,7 +6650,7 @@ msgstr "último cambio: %s"
msgid "Expires: %s"
msgstr "Caduca: %s"
-#: ../../include/ItemObject.php:362
+#: ../../include/ItemObject.php:362 ../../bookmarker/bookmarker.php:45
msgid "Save Bookmarks"
msgstr "Guardar en Marcadores"
@@ -685,97 +6662,10 @@ msgstr "Añadir al calendario"
msgid "Mark all seen"
msgstr "Marcar todo como visto"
-#: ../../include/ItemObject.php:378 ../../mod/photos.php:1251
-msgctxt "noun"
-msgid "Likes"
-msgstr "Me gusta"
-
-#: ../../include/ItemObject.php:379 ../../mod/photos.php:1252
-msgctxt "noun"
-msgid "Dislikes"
-msgstr "No me gusta"
-
-#: ../../include/ItemObject.php:384 ../../include/acl_selectors.php:252
-#: ../../mod/photos.php:1257
-msgid "Close"
-msgstr "Cerrar"
-
-#: ../../include/ItemObject.php:389 ../../include/conversation.php:740
-#: ../../include/conversation.php:1244 ../../mod/editpost.php:131
-#: ../../mod/photos.php:1068 ../../mod/editblock.php:151
-#: ../../mod/editlayout.php:149 ../../mod/editwebpage.php:191
-msgid "Please wait"
-msgstr "Espere por favor"
-
#: ../../include/ItemObject.php:413 ../../include/js_strings.php:7
msgid "[+] show all"
msgstr "[+] mostrar todo:"
-#: ../../include/ItemObject.php:700 ../../mod/photos.php:1084
-#: ../../mod/photos.php:1202
-msgid "This is you"
-msgstr "Este es usted"
-
-#: ../../include/ItemObject.php:702 ../../include/js_strings.php:6
-#: ../../mod/photos.php:1086 ../../mod/photos.php:1204
-msgid "Comment"
-msgstr "Comentar"
-
-#: ../../include/ItemObject.php:703 ../../include/widgets.php:708
-#: ../../include/widgets.php:720 ../../include/js_strings.php:22
-#: ../../mod/admin.php:457 ../../mod/admin.php:646 ../../mod/admin.php:721
-#: ../../mod/admin.php:986 ../../mod/admin.php:1150 ../../mod/admin.php:1326
-#: ../../mod/admin.php:1521 ../../mod/admin.php:1606 ../../mod/admin.php:1770
-#: ../../mod/appman.php:99 ../../mod/pconfig.php:108 ../../mod/pdledit.php:62
-#: ../../mod/photos.php:672 ../../mod/photos.php:1047
-#: ../../mod/photos.php:1087 ../../mod/photos.php:1205 ../../mod/mitem.php:231
-#: ../../mod/cal.php:337 ../../mod/poke.php:182 ../../mod/chat.php:190
-#: ../../mod/chat.php:232 ../../mod/connect.php:93 ../../mod/mood.php:135
-#: ../../mod/connedit.php:729 ../../mod/profiles.php:687
-#: ../../mod/rate.php:168 ../../mod/events.php:468 ../../mod/events.php:665
-#: ../../mod/filestorage.php:156 ../../mod/fsuggest.php:108
-#: ../../mod/group.php:81 ../../mod/settings.php:597
-#: ../../mod/settings.php:710 ../../mod/settings.php:738
-#: ../../mod/settings.php:761 ../../mod/settings.php:849
-#: ../../mod/settings.php:1041 ../../mod/setup.php:336 ../../mod/setup.php:377
-#: ../../mod/import.php:542 ../../mod/import_items.php:116
-#: ../../mod/invite.php:142 ../../mod/locs.php:117 ../../mod/sources.php:104
-#: ../../mod/sources.php:138 ../../mod/mail.php:380 ../../mod/thing.php:312
-#: ../../mod/thing.php:358 ../../mod/xchan.php:11
-#: ../../view/theme/redbasic/php/config.php:99
-msgid "Submit"
-msgstr "Enviar"
-
-#: ../../include/ItemObject.php:704 ../../include/conversation.php:1216
-#: ../../mod/editpost.php:115 ../../mod/editblock.php:137
-#: ../../mod/editlayout.php:136 ../../mod/editwebpage.php:178
-msgid "Bold"
-msgstr "Negrita"
-
-#: ../../include/ItemObject.php:705 ../../include/conversation.php:1217
-#: ../../mod/editpost.php:116 ../../mod/editblock.php:138
-#: ../../mod/editlayout.php:137 ../../mod/editwebpage.php:179
-msgid "Italic"
-msgstr "Itálico "
-
-#: ../../include/ItemObject.php:706 ../../include/conversation.php:1218
-#: ../../mod/editpost.php:117 ../../mod/editblock.php:139
-#: ../../mod/editlayout.php:138 ../../mod/editwebpage.php:180
-msgid "Underline"
-msgstr "Subrayar"
-
-#: ../../include/ItemObject.php:707 ../../include/conversation.php:1219
-#: ../../mod/editpost.php:118 ../../mod/editblock.php:140
-#: ../../mod/editlayout.php:139 ../../mod/editwebpage.php:181
-msgid "Quote"
-msgstr "Citar"
-
-#: ../../include/ItemObject.php:708 ../../include/conversation.php:1220
-#: ../../mod/editpost.php:119 ../../mod/editblock.php:141
-#: ../../mod/editlayout.php:140 ../../mod/editwebpage.php:182
-msgid "Code"
-msgstr "Código"
-
#: ../../include/ItemObject.php:709
msgid "Image"
msgstr "Imagen"
@@ -788,20 +6678,6 @@ msgstr "Insertar enlace"
msgid "Video"
msgstr "Vídeo"
-#: ../../include/ItemObject.php:712 ../../include/conversation.php:1186
-#: ../../include/page_widgets.php:40 ../../mod/editpost.php:151
-#: ../../mod/photos.php:1088 ../../mod/editblock.php:172
-#: ../../mod/webpages.php:192 ../../mod/editwebpage.php:213
-#: ../../mod/events.php:465
-msgid "Preview"
-msgstr "Previsualizar"
-
-#: ../../include/ItemObject.php:715 ../../include/conversation.php:1274
-#: ../../mod/editpost.php:159 ../../mod/chat.php:200 ../../mod/mail.php:255
-#: ../../mod/mail.php:385
-msgid "Encrypt text"
-msgstr "Cifrar texto"
-
#: ../../include/account.php:28
msgid "Not a valid email address"
msgstr "Dirección de correo no válida"
@@ -880,16 +6756,6 @@ msgid "This action is not available under your subscription plan."
msgstr "Esta acción no está disponible en su plan de suscripción."
#: ../../include/profile_selectors.php:6
-#: ../../include/profile_selectors.php:23 ../../mod/id.php:103
-msgid "Male"
-msgstr "Hombre"
-
-#: ../../include/profile_selectors.php:6
-#: ../../include/profile_selectors.php:23 ../../mod/id.php:105
-msgid "Female"
-msgstr "Mujer"
-
-#: ../../include/profile_selectors.php:6
msgid "Currently Male"
msgstr "Actualmente hombre"
@@ -1138,13 +7004,6 @@ msgstr "No mostrar"
msgid "Other networks and post services"
msgstr "Otras redes y servicios de publicación"
-#: ../../include/acl_selectors.php:251 ../../mod/photos.php:666
-#: ../../mod/photos.php:1040 ../../mod/chat.php:229
-#: ../../mod/filestorage.php:147 ../../mod/thing.php:309
-#: ../../mod/thing.php:355
-msgid "Permissions"
-msgstr "Permisos"
-
#: ../../include/activities.php:42
msgid " and "
msgstr " y "
@@ -1168,6 +7027,10 @@ msgstr "Visitar %2$s de %1$s"
msgid "%1$s has an updated %2$s, changing %3$s."
msgstr "%1$s ha actualizado %2$s, cambiando %3$s."
+#: ../../include/api.php:1338
+msgid "Public Timeline"
+msgstr "Cronología pública"
+
#: ../../include/apps.php:128
msgid "Site Admin"
msgstr "Administrador del sitio"
@@ -1181,76 +7044,35 @@ msgstr "Marcadores"
msgid "Address Book"
msgstr "Libreta de direcciones"
-#: ../../include/apps.php:131 ../../include/nav.php:110 ../../boot.php:1600
+#: ../../include/apps.php:131 ../../include/nav.php:110 ../../boot.php:1602
msgid "Login"
msgstr "Iniciar sesión"
-#: ../../include/apps.php:132 ../../include/nav.php:203
-#: ../../mod/manage.php:158
-msgid "Channel Manager"
-msgstr "Administración de canales"
-
-#: ../../include/apps.php:133 ../../include/nav.php:176
+#: ../../include/apps.php:133 ../../include/nav.php:182
msgid "Grid"
msgstr "Red"
-#: ../../include/apps.php:134 ../../include/nav.php:205
-#: ../../include/widgets.php:589 ../../mod/admin.php:1266
-#: ../../mod/admin.php:1488
-msgid "Settings"
-msgstr "Ajustes"
-
-#: ../../include/apps.php:136 ../../include/conversation.php:1704
-#: ../../include/nav.php:106 ../../mod/webpages.php:182
-msgid "Webpages"
-msgstr "Páginas web"
-
-#: ../../include/apps.php:137 ../../include/nav.php:179
+#: ../../include/apps.php:137 ../../include/nav.php:185
msgid "Channel Home"
msgstr "Mi canal"
-#: ../../include/apps.php:139 ../../include/conversation.php:1650
-#: ../../include/nav.php:92 ../../mod/fbrowser.php:25
-msgid "Photos"
-msgstr "Fotos"
-
#: ../../include/apps.php:140 ../../include/conversation.php:1667
-#: ../../include/conversation.php:1670 ../../include/nav.php:198
+#: ../../include/conversation.php:1670 ../../include/nav.php:204
msgid "Events"
msgstr "Eventos"
-#: ../../include/apps.php:141 ../../include/nav.php:164
+#: ../../include/apps.php:141 ../../include/nav.php:170
msgid "Directory"
msgstr "Directorio"
-#: ../../include/apps.php:142 ../../include/nav.php:155 ../../mod/help.php:222
-#: ../../mod/help.php:227 ../../mod/layouts.php:177
-msgid "Help"
-msgstr "Ayuda"
-
-#: ../../include/apps.php:143 ../../include/nav.php:190
+#: ../../include/apps.php:143 ../../include/nav.php:196
msgid "Mail"
msgstr "Correo"
-#: ../../include/apps.php:144 ../../mod/mood.php:131
-msgid "Mood"
-msgstr "Estado de ánimo"
-
-#: ../../include/apps.php:145 ../../include/conversation.php:965
-#: ../../mod/poke.php:164
-msgid "Poke"
-msgstr "Toques y otras cosas"
-
#: ../../include/apps.php:146 ../../include/nav.php:96
msgid "Chat"
msgstr "Chat"
-#: ../../include/apps.php:147 ../../include/nav.php:161
-#: ../../include/text.php:904 ../../include/text.php:916
-#: ../../mod/connections.php:302 ../../mod/search.php:40
-msgid "Search"
-msgstr "Buscar"
-
#: ../../include/apps.php:148
msgid "Probe"
msgstr "Probar"
@@ -1271,24 +7093,10 @@ msgstr "Invitar"
msgid "Features"
msgstr "Funcionalidades"
-#: ../../include/apps.php:153 ../../mod/id.php:28
-msgid "Language"
-msgstr "Idioma"
-
#: ../../include/apps.php:154
msgid "Post"
msgstr "Publicación"
-#: ../../include/apps.php:155 ../../mod/id.php:17 ../../mod/id.php:18
-#: ../../mod/id.php:19
-msgid "Profile Photo"
-msgstr "Foto del perfil"
-
-#: ../../include/apps.php:252 ../../mod/settings.php:84
-#: ../../mod/settings.php:623
-msgid "Update"
-msgstr "Actualizar"
-
#: ../../include/apps.php:252
msgid "Install"
msgstr "Instalar"
@@ -1297,106 +7105,6 @@ msgstr "Instalar"
msgid "Purchase"
msgstr "Comprar"
-#: ../../include/items.php:423 ../../mod/profperm.php:23
-#: ../../mod/dreport.php:6 ../../mod/dreport.php:45 ../../mod/group.php:68
-#: ../../mod/import_items.php:108 ../../mod/like.php:280
-#: ../../mod/subthread.php:58 ../../index.php:173
-msgid "Permission denied"
-msgstr "Permiso denegado"
-
-#: ../../include/items.php:1138 ../../include/items.php:1183
-msgid "(Unknown)"
-msgstr "(Desconocido)"
-
-#: ../../include/items.php:1382
-msgid "Visible to anybody on the internet."
-msgstr "Visible para cualquiera en internet."
-
-#: ../../include/items.php:1384
-msgid "Visible to you only."
-msgstr "Visible sólo para usted."
-
-#: ../../include/items.php:1386
-msgid "Visible to anybody in this network."
-msgstr "Visible para cualquiera en esta red."
-
-#: ../../include/items.php:1388
-msgid "Visible to anybody authenticated."
-msgstr "Visible para cualquiera que haya sido autenticado."
-
-#: ../../include/items.php:1390
-#, php-format
-msgid "Visible to anybody on %s."
-msgstr "Visible para cualquiera en %s."
-
-#: ../../include/items.php:1392
-msgid "Visible to all connections."
-msgstr "Visible para todas las conexiones."
-
-#: ../../include/items.php:1394
-msgid "Visible to approved connections."
-msgstr "Visible para las conexiones permitidas."
-
-#: ../../include/items.php:1396
-msgid "Visible to specific connections."
-msgstr "Visible para conexiones específicas."
-
-#: ../../include/items.php:4592 ../../mod/admin.php:141
-#: ../../mod/admin.php:1189 ../../mod/admin.php:1434 ../../mod/display.php:40
-#: ../../mod/filestorage.php:27 ../../mod/thing.php:85
-#: ../../mod/viewsrc.php:20
-msgid "Item not found."
-msgstr "Elemento no encontrado."
-
-#: ../../include/items.php:5126 ../../mod/group.php:38 ../../mod/group.php:137
-msgid "Privacy group not found."
-msgstr "Grupo de canales no encontrado."
-
-#: ../../include/items.php:5142
-msgid "Privacy group is empty."
-msgstr "El grupo de canales está vacío."
-
-#: ../../include/items.php:5149
-#, php-format
-msgid "Privacy group: %s"
-msgstr "Grupo de canales: %s"
-
-#: ../../include/items.php:5159 ../../mod/connedit.php:701
-#, php-format
-msgid "Connection: %s"
-msgstr "Conexión: %s"
-
-#: ../../include/items.php:5161
-msgid "Connection not found."
-msgstr "Conexión no encontrada"
-
-#: ../../include/items.php:5587 ../../mod/cover_photo.php:229
-msgid "female"
-msgstr "mujer"
-
-#: ../../include/items.php:5588 ../../mod/cover_photo.php:230
-#, php-format
-msgid "%1$s updated her %2$s"
-msgstr "%1$s ha actualizado su %2$s"
-
-#: ../../include/items.php:5589 ../../mod/cover_photo.php:231
-msgid "male"
-msgstr "hombre"
-
-#: ../../include/items.php:5590 ../../mod/cover_photo.php:232
-#, php-format
-msgid "%1$s updated his %2$s"
-msgstr "%1$s ha actualizado su %2$s"
-
-#: ../../include/items.php:5592 ../../mod/cover_photo.php:234
-#, php-format
-msgid "%1$s updated their %2$s"
-msgstr "%1$s ha actualizado su %2$s"
-
-#: ../../include/items.php:5594
-msgid "profile photo"
-msgstr "foto del perfil"
-
#: ../../include/network.php:659
msgid "view full size"
msgstr "Ver en el tamaño original"
@@ -1422,61 +7130,25 @@ msgstr "%s Administrador"
msgid "No Subject"
msgstr "Sin asunto"
-#: ../../include/photos.php:112
-#, php-format
-msgid "Image exceeds website size limit of %lu bytes"
-msgstr "La imagen excede el límite de %lu bytes del sitio"
-
-#: ../../include/photos.php:119
-msgid "Image file is empty."
-msgstr "El fichero de imagen está vacío. "
-
-#: ../../include/photos.php:146 ../../mod/profile_photo.php:225
-#: ../../mod/cover_photo.php:164
-msgid "Unable to process image"
-msgstr "No ha sido posible procesar la imagen"
-
-#: ../../include/photos.php:257
-msgid "Photo storage failed."
-msgstr "La foto no ha podido ser guardada."
-
-#: ../../include/photos.php:297
-msgid "a new photo"
-msgstr "una nueva foto"
-
-#: ../../include/photos.php:301
-#, php-format
-msgctxt "photo_upload"
-msgid "%1$s posted %2$s to %3$s"
-msgstr "%1$s ha publicado %2$s en %3$s"
-
-#: ../../include/photos.php:506 ../../include/conversation.php:1653
-msgid "Photo Albums"
-msgstr "Álbumes de fotos"
-
-#: ../../include/photos.php:510
-msgid "Upload New Photos"
-msgstr "Subir nuevas fotos"
-
-#: ../../include/bb2diaspora.php:376
+#: ../../include/bb2diaspora.php:398
msgid "Attachments:"
msgstr "Ficheros adjuntos:"
-#: ../../include/bb2diaspora.php:465 ../../include/event.php:22
+#: ../../include/bb2diaspora.php:487 ../../include/event.php:22
#: ../../include/text.php:1437
msgid "l F d, Y \\@ g:i A"
msgstr "l d de F, Y \\@ G:i"
-#: ../../include/bb2diaspora.php:467
+#: ../../include/bb2diaspora.php:489
msgid "$Projectname event notification:"
msgstr "Notificación de eventos de $Projectname:"
-#: ../../include/bb2diaspora.php:471 ../../include/event.php:30
+#: ../../include/bb2diaspora.php:493 ../../include/event.php:30
#: ../../include/text.php:1441
msgid "Starts:"
msgstr "Comienza:"
-#: ../../include/bb2diaspora.php:479 ../../include/event.php:40
+#: ../../include/bb2diaspora.php:501 ../../include/event.php:40
#: ../../include/text.php:1445
msgid "Finishes:"
msgstr "Finaliza:"
@@ -1507,31 +7179,11 @@ msgid ""
"to install it on this site."
msgstr "Esta entrada contiene el elemento instalable %s, sin embargo le faltan permisos para instalarlo en este sitio."
-#: ../../include/bbcode.php:193 ../../mod/impel.php:37
-msgid "webpage"
-msgstr "página web"
-
-#: ../../include/bbcode.php:196 ../../mod/impel.php:47
-msgid "layout"
-msgstr "plantilla"
-
-#: ../../include/bbcode.php:199 ../../mod/impel.php:42
-msgid "block"
-msgstr "bloque"
-
-#: ../../include/bbcode.php:202 ../../mod/impel.php:54
-msgid "menu"
-msgstr "menú"
-
#: ../../include/bbcode.php:255
#, php-format
msgid "%1$s wrote the following %2$s %3$s"
msgstr "%1$s escribió %2$s siguiente %3$s"
-#: ../../include/bbcode.php:257 ../../mod/tagger.php:51
-msgid "post"
-msgstr "la entrada"
-
#: ../../include/bbcode.php:545
msgid "Different viewers will see this text differently"
msgstr "Visitantes diferentes verán este texto de forma distinta"
@@ -1544,41 +7196,6 @@ msgstr "$1 spoiler"
msgid "$1 wrote:"
msgstr "$1 escribió:"
-#: ../../include/conversation.php:120 ../../include/text.php:1967
-#: ../../mod/like.php:367 ../../mod/subthread.php:83 ../../mod/tagger.php:43
-msgid "photo"
-msgstr "foto"
-
-#: ../../include/conversation.php:123 ../../include/event.php:915
-#: ../../include/text.php:1970 ../../mod/events.php:249 ../../mod/like.php:369
-#: ../../mod/tagger.php:47
-msgid "event"
-msgstr "evento"
-
-#: ../../include/conversation.php:126 ../../mod/like.php:113
-msgid "channel"
-msgstr "el canal"
-
-#: ../../include/conversation.php:148 ../../include/text.php:1973
-#: ../../mod/like.php:367 ../../mod/subthread.php:83
-msgid "status"
-msgstr "el mensaje de estado"
-
-#: ../../include/conversation.php:150 ../../include/text.php:1975
-#: ../../mod/tagger.php:53
-msgid "comment"
-msgstr "el comentario"
-
-#: ../../include/conversation.php:164 ../../mod/like.php:416
-#, php-format
-msgid "%1$s likes %2$s's %3$s"
-msgstr "A %1$s le gusta %3$s de %2$s"
-
-#: ../../include/conversation.php:167 ../../mod/like.php:418
-#, php-format
-msgid "%1$s doesn't like %2$s's %3$s"
-msgstr "A %1$s no le gusta %3$s de %2$s"
-
#: ../../include/conversation.php:204
#, php-format
msgid "%1$s is now connected with %2$s"
@@ -1594,52 +7211,6 @@ msgstr "%1$s ha dado un toque a %2$s"
msgid "poked"
msgstr "ha dado un toque a"
-#: ../../include/conversation.php:260 ../../mod/mood.php:63
-#, php-format
-msgctxt "mood"
-msgid "%1$s is %2$s"
-msgstr "%1$s está %2$s"
-
-#: ../../include/conversation.php:574 ../../mod/photos.php:1102
-msgctxt "title"
-msgid "Likes"
-msgstr "Me gusta"
-
-#: ../../include/conversation.php:574 ../../mod/photos.php:1102
-msgctxt "title"
-msgid "Dislikes"
-msgstr "No me gusta"
-
-#: ../../include/conversation.php:575 ../../mod/photos.php:1103
-msgctxt "title"
-msgid "Agree"
-msgstr "De acuerdo"
-
-#: ../../include/conversation.php:575 ../../mod/photos.php:1103
-msgctxt "title"
-msgid "Disagree"
-msgstr "En desacuerdo"
-
-#: ../../include/conversation.php:575 ../../mod/photos.php:1103
-msgctxt "title"
-msgid "Abstain"
-msgstr "Abstención"
-
-#: ../../include/conversation.php:576 ../../mod/photos.php:1104
-msgctxt "title"
-msgid "Attending"
-msgstr "Participaré"
-
-#: ../../include/conversation.php:576 ../../mod/photos.php:1104
-msgctxt "title"
-msgid "Not attending"
-msgstr "No participaré"
-
-#: ../../include/conversation.php:576 ../../mod/photos.php:1104
-msgctxt "title"
-msgid "Might attend"
-msgstr "Quizá participe"
-
#: ../../include/conversation.php:691
#, php-format
msgid "View %s's profile @ %s"
@@ -1661,7 +7232,7 @@ msgstr "Mostrar en su contexto"
msgid "remove"
msgstr "eliminar"
-#: ../../include/conversation.php:854 ../../include/nav.php:244
+#: ../../include/conversation.php:854 ../../include/nav.php:256
msgid "Loading..."
msgstr "Cargando..."
@@ -1681,11 +7252,6 @@ msgstr "Seguir este hilo"
msgid "Unfollow Thread"
msgstr "Dejar de seguir este hilo"
-#: ../../include/conversation.php:959 ../../include/nav.php:86
-#: ../../mod/connedit.php:516
-msgid "View Profile"
-msgstr "Ver el perfil"
-
#: ../../include/conversation.php:960
msgid "Activity/Posts"
msgstr "Actividad y publicaciones"
@@ -1698,11 +7264,6 @@ msgstr "Editar conexión"
msgid "Message"
msgstr "Mensaje"
-#: ../../include/conversation.php:964 ../../mod/pubsites.php:27
-#: ../../mod/ratings.php:99
-msgid "Ratings"
-msgstr "Valoraciones"
-
#: ../../include/conversation.php:1080
#, php-format
msgid "%s likes this."
@@ -1752,11 +7313,6 @@ msgstr "A %s no le gusta esto."
msgid "Visible to <strong>everybody</strong>"
msgstr "Visible para <strong>cualquiera</strong>"
-#: ../../include/conversation.php:1170 ../../mod/chat.php:199
-#: ../../mod/mail.php:202 ../../mod/mail.php:316
-msgid "Please enter a link URL:"
-msgstr "Por favor, introduzca la dirección del enlace:"
-
#: ../../include/conversation.php:1171
msgid "Please enter a video link/URL:"
msgstr "Por favor, introduzca un enlace de vídeo:"
@@ -1769,25 +7325,10 @@ msgstr "Por favor, introduzca un enlace de audio:"
msgid "Tag term:"
msgstr "Término de la etiqueta:"
-#: ../../include/conversation.php:1174 ../../mod/filer.php:48
-msgid "Save to Folder:"
-msgstr "Guardar en carpeta:"
-
#: ../../include/conversation.php:1175
msgid "Where are you right now?"
msgstr "¿Donde está ahora?"
-#: ../../include/conversation.php:1176 ../../mod/editpost.php:56
-#: ../../mod/mail.php:203 ../../mod/mail.php:317
-msgid "Expires YYYY-MM-DD HH:MM"
-msgstr "Caduca YYYY-MM-DD HH:MM"
-
-#: ../../include/conversation.php:1209 ../../mod/photos.php:1067
-#: ../../mod/webpages.php:186 ../../mod/blocks.php:156
-#: ../../mod/layouts.php:185
-msgid "Share"
-msgstr "Compartir"
-
#: ../../include/conversation.php:1211
msgid "Page link name"
msgstr "Nombre del enlace de la página"
@@ -1796,33 +7337,14 @@ msgstr "Nombre del enlace de la página"
msgid "Post as"
msgstr "Publicar como"
-#: ../../include/conversation.php:1221 ../../mod/editpost.php:120
-#: ../../mod/editblock.php:143 ../../mod/editlayout.php:141
-#: ../../mod/editwebpage.php:183
-msgid "Upload photo"
-msgstr "Subir foto"
-
#: ../../include/conversation.php:1222
msgid "upload photo"
msgstr "subir foto"
-#: ../../include/conversation.php:1223 ../../mod/editpost.php:121
-#: ../../mod/editblock.php:144 ../../mod/editlayout.php:142
-#: ../../mod/editwebpage.php:184 ../../mod/mail.php:248 ../../mod/mail.php:378
-msgid "Attach file"
-msgstr "Adjuntar fichero"
-
#: ../../include/conversation.php:1224
msgid "attach file"
msgstr "adjuntar fichero"
-#: ../../include/conversation.php:1225 ../../mod/editpost.php:122
-#: ../../mod/chat.php:201 ../../mod/editblock.php:145
-#: ../../mod/editlayout.php:143 ../../mod/editwebpage.php:185
-#: ../../mod/mail.php:249 ../../mod/mail.php:379
-msgid "Insert web link"
-msgstr "Insertar enlace web"
-
#: ../../include/conversation.php:1226
msgid "web link"
msgstr "enlace web"
@@ -1843,84 +7365,22 @@ msgstr "Insertar enlace de audio"
msgid "audio link"
msgstr "enlace de audio"
-#: ../../include/conversation.php:1231 ../../mod/editpost.php:126
-#: ../../mod/editblock.php:149 ../../mod/editlayout.php:147
-#: ../../mod/editwebpage.php:189
-msgid "Set your location"
-msgstr "Establecer su ubicación"
-
#: ../../include/conversation.php:1232
msgid "set location"
msgstr "establecer ubicación"
-#: ../../include/conversation.php:1233 ../../mod/editpost.php:128
-msgid "Toggle voting"
-msgstr "Cambiar votación"
-
-#: ../../include/conversation.php:1236 ../../mod/editpost.php:127
-#: ../../mod/editblock.php:150 ../../mod/editlayout.php:148
-#: ../../mod/editwebpage.php:190
-msgid "Clear browser location"
-msgstr "Eliminar los datos de localización geográfica del navegador"
-
#: ../../include/conversation.php:1237
msgid "clear location"
msgstr "borrar los datos de ubicación"
-#: ../../include/conversation.php:1239 ../../mod/editpost.php:143
-#: ../../mod/editblock.php:163 ../../mod/editwebpage.php:206
-msgid "Title (optional)"
-msgstr "Título (opcional)"
-
-#: ../../include/conversation.php:1243 ../../mod/editpost.php:145
-#: ../../mod/editblock.php:166 ../../mod/editlayout.php:164
-#: ../../mod/editwebpage.php:208
-msgid "Categories (optional, comma-separated list)"
-msgstr "Categorías (opcional, lista separada por comas)"
-
-#: ../../include/conversation.php:1245 ../../mod/editpost.php:132
-#: ../../mod/editblock.php:152 ../../mod/editlayout.php:150
-#: ../../mod/editwebpage.php:192 ../../mod/events.php:466
-msgid "Permission settings"
-msgstr "Configuración de permisos"
-
#: ../../include/conversation.php:1246
msgid "permissions"
msgstr "permisos"
-#: ../../include/conversation.php:1254 ../../mod/editpost.php:140
-#: ../../mod/editblock.php:160 ../../mod/editlayout.php:157
-#: ../../mod/editwebpage.php:201
-msgid "Public post"
-msgstr "Entrada pública"
-
-#: ../../include/conversation.php:1256 ../../mod/editpost.php:146
-#: ../../mod/editblock.php:167 ../../mod/editlayout.php:165
-#: ../../mod/editwebpage.php:209
-msgid "Example: bob@example.com, mary@example.com"
-msgstr "Ejemplo: roberto@ejemplo.com, maría@ejemplo.com"
-
-#: ../../include/conversation.php:1269 ../../mod/editpost.php:157
-#: ../../mod/editblock.php:177 ../../mod/editlayout.php:174
-#: ../../mod/editwebpage.php:218 ../../mod/mail.php:253 ../../mod/mail.php:383
-msgid "Set expiration date"
-msgstr "Configurar fecha de caducidad"
-
#: ../../include/conversation.php:1272
msgid "Set publish date"
msgstr "Establecer la fecha de publicación"
-#: ../../include/conversation.php:1276 ../../mod/editpost.php:161
-msgid "OK"
-msgstr "OK"
-
-#: ../../include/conversation.php:1277 ../../mod/editpost.php:162
-#: ../../mod/fbrowser.php:77 ../../mod/fbrowser.php:112
-#: ../../mod/settings.php:598 ../../mod/settings.php:624
-#: ../../mod/tagrm.php:11 ../../mod/tagrm.php:134
-msgid "Cancel"
-msgstr "Cancelar"
-
#: ../../include/conversation.php:1521
msgid "Discover"
msgstr "Descubrir"
@@ -1945,20 +7405,10 @@ msgstr "Publicaciones recientes"
msgid "Sort by Post Date"
msgstr "Ordenar por fecha de publicación"
-#: ../../include/conversation.php:1544 ../../include/widgets.php:105
-#: ../../mod/profiles.php:696
-msgid "Personal"
-msgstr "Personales"
-
#: ../../include/conversation.php:1547
msgid "Posts that mention or involve you"
msgstr "Publicaciones que le mencionan o involucran"
-#: ../../include/conversation.php:1553 ../../mod/connections.php:72
-#: ../../mod/connections.php:82 ../../mod/menu.php:112
-msgid "New"
-msgstr "Nuevas"
-
#: ../../include/conversation.php:1556
msgid "Activity Stream - by date"
msgstr "Contenido - por fecha"
@@ -1979,10 +7429,6 @@ msgstr "Correo basura"
msgid "Posts flagged as SPAM"
msgstr "Publicaciones marcadas como basura"
-#: ../../include/conversation.php:1629 ../../mod/admin.php:1157
-msgid "Channel"
-msgstr "Canal"
-
#: ../../include/conversation.php:1632
msgid "Status Messages and Posts"
msgstr "Mensajes de estado y publicaciones"
@@ -1995,6 +7441,10 @@ msgstr "Mi perfil"
msgid "Profile Details"
msgstr "Detalles del perfil"
+#: ../../include/conversation.php:1653 ../../include/photos.php:506
+msgid "Photo Albums"
+msgstr "Álbumes de fotos"
+
#: ../../include/conversation.php:1660
msgid "Files and Storage"
msgstr "Ficheros y repositorio"
@@ -2100,20 +7550,12 @@ msgstr "Desconectado/a."
msgid "Failed authentication"
msgstr "Autenticación fallida."
-#: ../../include/auth.php:226 ../../mod/openid.php:189
-msgid "Login failed."
-msgstr "El acceso ha fallado."
-
#: ../../include/security.php:383
msgid ""
"The form security token was not correct. This probably happened because the "
"form has been opened for too long (>3 hours) before submitting it."
msgstr "El \"token\" de seguridad del formulario no es correcto. Esto ha ocurrido probablemente porque el formulario ha estado abierto demasiado tiempo (>3 horas) antes de ser enviado"
-#: ../../include/comanche.php:34 ../../mod/admin.php:366
-msgid "Default"
-msgstr "Predeterminado"
-
#: ../../include/contact_selectors.php:56
msgid "Frequently"
msgstr "Frecuentemente"
@@ -2155,12 +7597,6 @@ msgstr "GNU Social"
msgid "RSS/Atom"
msgstr "RSS/Atom"
-#: ../../include/contact_selectors.php:81 ../../mod/admin.php:989
-#: ../../mod/admin.php:998 ../../mod/id.php:15 ../../mod/id.php:16
-#: ../../boot.php:1602
-msgid "Email"
-msgstr "Correo electrónico"
-
#: ../../include/contact_selectors.php:82
msgid "Diaspora"
msgstr "Diaspora"
@@ -2192,10 +7628,6 @@ msgid_plural "%d invitations available"
msgstr[0] "%d invitación pendiente"
msgstr[1] "%d invitaciones disponibles"
-#: ../../include/contact_widgets.php:19 ../../mod/admin.php:461
-msgid "Advanced"
-msgstr "Avanzado"
-
#: ../../include/contact_widgets.php:22
msgid "Find Channels"
msgstr "Encontrar canales"
@@ -2212,16 +7644,6 @@ msgstr "Conectar/Seguir"
msgid "Examples: Robert Morgenstein, Fishing"
msgstr "Ejemplos: José Fernández, Pesca"
-#: ../../include/contact_widgets.php:26 ../../mod/connections.php:305
-#: ../../mod/directory.php:384 ../../mod/directory.php:389
-msgid "Find"
-msgstr "Encontrar"
-
-#: ../../include/contact_widgets.php:27 ../../mod/directory.php:388
-#: ../../mod/suggest.php:60
-msgid "Channel Suggestions"
-msgstr "Sugerencias de canales"
-
#: ../../include/contact_widgets.php:29
msgid "Random Profile"
msgstr "Perfil aleatorio"
@@ -2322,10 +7744,6 @@ msgstr "el almacenamiento en la base de datos ha fallado."
msgid "Empty path"
msgstr "Ruta vacía"
-#: ../../include/datetime.php:48 ../../mod/profiles.php:699
-msgid "Miscellaneous"
-msgstr "Varios"
-
#: ../../include/datetime.php:136
msgid "Birthday"
msgstr "Cumpleaños"
@@ -2338,14 +7756,7 @@ msgstr "Edad:"
msgid "YYYY-MM-DD or MM-DD"
msgstr "AAAA-MM-DD o MM-DD"
-#: ../../include/datetime.php:246 ../../mod/appman.php:91
-#: ../../mod/appman.php:92 ../../mod/profiles.php:708
-#: ../../mod/profiles.php:712 ../../mod/events.php:444
-#: ../../mod/events.php:449
-msgid "Required"
-msgstr "Obligatorio"
-
-#: ../../include/datetime.php:273 ../../boot.php:2430
+#: ../../include/datetime.php:273 ../../boot.php:2432
msgid "never"
msgstr "nunca"
@@ -2426,32 +7837,6 @@ msgstr "Opciones del directorio"
msgid "Safe Mode"
msgstr "Modo seguro"
-#: ../../include/dir_fns.php:141 ../../include/dir_fns.php:142
-#: ../../include/dir_fns.php:143 ../../mod/admin.php:425 ../../mod/api.php:102
-#: ../../mod/photos.php:661 ../../mod/mitem.php:154 ../../mod/mitem.php:155
-#: ../../mod/mitem.php:228 ../../mod/mitem.php:229 ../../mod/connedit.php:375
-#: ../../mod/connedit.php:653 ../../mod/profiles.php:647
-#: ../../mod/events.php:454 ../../mod/events.php:455 ../../mod/events.php:464
-#: ../../mod/filestorage.php:151 ../../mod/filestorage.php:159
-#: ../../mod/removeme.php:60 ../../mod/settings.php:588 ../../mod/menu.php:96
-#: ../../mod/menu.php:153 ../../view/theme/redbasic/php/config.php:105
-#: ../../view/theme/redbasic/php/config.php:130 ../../boot.php:1604
-msgid "No"
-msgstr "No"
-
-#: ../../include/dir_fns.php:141 ../../include/dir_fns.php:142
-#: ../../include/dir_fns.php:143 ../../mod/admin.php:427 ../../mod/api.php:101
-#: ../../mod/photos.php:661 ../../mod/mitem.php:154 ../../mod/mitem.php:155
-#: ../../mod/mitem.php:228 ../../mod/mitem.php:229 ../../mod/connedit.php:375
-#: ../../mod/profiles.php:647 ../../mod/events.php:454
-#: ../../mod/events.php:455 ../../mod/events.php:464
-#: ../../mod/filestorage.php:151 ../../mod/filestorage.php:159
-#: ../../mod/removeme.php:60 ../../mod/settings.php:588 ../../mod/menu.php:96
-#: ../../mod/menu.php:153 ../../view/theme/redbasic/php/config.php:105
-#: ../../view/theme/redbasic/php/config.php:130 ../../boot.php:1604
-msgid "Yes"
-msgstr "Sí"
-
#: ../../include/dir_fns.php:142
msgid "Public Forums Only"
msgstr "Solo foros públicos"
@@ -2791,11 +8176,6 @@ msgid ""
"(640px) photo thumbnails"
msgstr "Incluir miniaturas de fotos grandes (1024px) en publicaciones. Si no está habilitado, usar miniaturas pequeñas (640px)"
-#: ../../include/features.php:71 ../../include/widgets.php:581
-#: ../../mod/sources.php:88
-msgid "Channel Sources"
-msgstr "Orígenes de los contenidos del canal"
-
#: ../../include/features.php:71
msgid "Automatically import channel content from other channels or feeds"
msgstr "Importar automáticamente contenido de otros canales o \"feeds\""
@@ -2990,10 +8370,6 @@ msgstr "Un grupo suprimido con este nombre ha sido restablecido. <strong>Es posi
msgid "Add new connections to this privacy group"
msgstr "Añadir conexiones nuevas a este grupo de canales"
-#: ../../include/group.php:267 ../../mod/admin.php:998
-msgid "All Channels"
-msgstr "Todos los canales"
-
#: ../../include/group.php:289
msgid "edit"
msgstr "editar"
@@ -3014,217 +8390,86 @@ msgstr "Sin canales en ningún grupo"
msgid "add"
msgstr "añadir"
-#: ../../include/zot.php:680
-msgid "Invalid data packet"
-msgstr "Paquete de datos no válido"
-
-#: ../../include/zot.php:696
-msgid "Unable to verify channel signature"
-msgstr "No ha sido posible de verificar la firma del canal"
-
-#: ../../include/zot.php:2332
-#, php-format
-msgid "Unable to verify site signature for %s"
-msgstr "No ha sido posible de verificar la firma del sitio para %s"
-
-#: ../../include/zot.php:3670
-msgid "invalid target signature"
-msgstr "La firma recibida no es válida"
-
-#: ../../include/nav.php:82 ../../include/nav.php:113 ../../boot.php:1599
-msgid "Logout"
-msgstr "Finalizar sesión"
-
-#: ../../include/nav.php:82 ../../include/nav.php:113
-msgid "End this session"
-msgstr "Finalizar esta sesión"
-
-#: ../../include/nav.php:85 ../../include/nav.php:144
-msgid "Home"
-msgstr "Inicio"
-
-#: ../../include/nav.php:85
-msgid "Your posts and conversations"
-msgstr "Sus publicaciones y conversaciones"
-
-#: ../../include/nav.php:86
-msgid "Your profile page"
-msgstr "Su página del perfil"
-
-#: ../../include/nav.php:88
-msgid "Manage/Edit profiles"
-msgstr "Administrar/editar perfiles"
-
-#: ../../include/nav.php:90
-msgid "Edit your profile"
-msgstr "Editar su perfil"
-
-#: ../../include/nav.php:92
-msgid "Your photos"
-msgstr "Sus fotos"
-
-#: ../../include/nav.php:93
-msgid "Your files"
-msgstr "Sus ficheros"
+#: ../../include/items.php:1138 ../../include/items.php:1183
+msgid "(Unknown)"
+msgstr "(Desconocido)"
-#: ../../include/nav.php:96
-msgid "Your chatrooms"
-msgstr "Sus salas de chat"
+#: ../../include/items.php:1382
+msgid "Visible to anybody on the internet."
+msgstr "Visible para cualquiera en internet."
-#: ../../include/nav.php:102
-msgid "Your bookmarks"
-msgstr "Sus marcadores"
+#: ../../include/items.php:1384
+msgid "Visible to you only."
+msgstr "Visible sólo para usted."
-#: ../../include/nav.php:106
-msgid "Your webpages"
-msgstr "Sus páginas web"
+#: ../../include/items.php:1386
+msgid "Visible to anybody in this network."
+msgstr "Visible para cualquiera en esta red."
-#: ../../include/nav.php:110
-msgid "Sign in"
-msgstr "Acceder"
+#: ../../include/items.php:1388
+msgid "Visible to anybody authenticated."
+msgstr "Visible para cualquiera que haya sido autenticado."
-#: ../../include/nav.php:127
+#: ../../include/items.php:1390
#, php-format
-msgid "%s - click to logout"
-msgstr "%s - pulsar para finalizar sesión"
-
-#: ../../include/nav.php:130
-msgid "Remote authentication"
-msgstr "Acceder desde su servidor"
-
-#: ../../include/nav.php:130
-msgid "Click to authenticate to your home hub"
-msgstr "Pulsar para identificarse en su servidor de inicio"
-
-#: ../../include/nav.php:144
-msgid "Home Page"
-msgstr "Página de inicio"
-
-#: ../../include/nav.php:148 ../../mod/register.php:258 ../../boot.php:1582
-msgid "Register"
-msgstr "Registrarse"
-
-#: ../../include/nav.php:148
-msgid "Create an account"
-msgstr "Crear una cuenta"
-
-#: ../../include/nav.php:155
-msgid "Help and documentation"
-msgstr "Ayuda y documentación"
-
-#: ../../include/nav.php:159 ../../include/widgets.php:102
-#: ../../mod/apps.php:36
-msgid "Apps"
-msgstr "Aplicaciones"
-
-#: ../../include/nav.php:159
-msgid "Applications, utilities, links, games"
-msgstr "Aplicaciones, utilidades, enlaces, juegos"
-
-#: ../../include/nav.php:161
-msgid "Search site @name, #tag, ?docs, content"
-msgstr "Buscar en el sitio por @nombre, #etiqueta, ?ayuda o contenido"
-
-#: ../../include/nav.php:164
-msgid "Channel Directory"
-msgstr "Directorio de canales"
-
-#: ../../include/nav.php:176
-msgid "Your grid"
-msgstr "Mi red"
-
-#: ../../include/nav.php:177
-msgid "Mark all grid notifications seen"
-msgstr "Marcar todas las notificaciones de la red como vistas"
-
-#: ../../include/nav.php:179
-msgid "Channel home"
-msgstr "Mi canal"
-
-#: ../../include/nav.php:180
-msgid "Mark all channel notifications seen"
-msgstr "Marcar todas las notificaciones del canal como leídas"
-
-#: ../../include/nav.php:183 ../../include/text.php:834
-#: ../../mod/connections.php:298
-msgid "Connections"
-msgstr "Conexiones"
-
-#: ../../include/nav.php:186
-msgid "Notices"
-msgstr "Avisos"
-
-#: ../../include/nav.php:186
-msgid "Notifications"
-msgstr "Notificaciones"
-
-#: ../../include/nav.php:187
-msgid "See all notifications"
-msgstr "Ver todas las notificaciones"
-
-#: ../../include/nav.php:188 ../../mod/notifications.php:99
-msgid "Mark all system notifications seen"
-msgstr "Marcar todas las notificaciones de sistema como leídas"
-
-#: ../../include/nav.php:190
-msgid "Private mail"
-msgstr "Correo privado"
-
-#: ../../include/nav.php:191
-msgid "See all private messages"
-msgstr "Ver todas los mensajes privados"
+msgid "Visible to anybody on %s."
+msgstr "Visible para cualquiera en %s."
-#: ../../include/nav.php:192
-msgid "Mark all private messages seen"
-msgstr "Marcar todos los mensajes privados como leídos"
+#: ../../include/items.php:1392
+msgid "Visible to all connections."
+msgstr "Visible para todas las conexiones."
-#: ../../include/nav.php:193 ../../include/widgets.php:609
-msgid "Inbox"
-msgstr "Bandeja de entrada"
+#: ../../include/items.php:1394
+msgid "Visible to approved connections."
+msgstr "Visible para las conexiones permitidas."
-#: ../../include/nav.php:194 ../../include/widgets.php:614
-msgid "Outbox"
-msgstr "Bandeja de salida"
+#: ../../include/items.php:1396
+msgid "Visible to specific connections."
+msgstr "Visible para conexiones específicas."
-#: ../../include/nav.php:195 ../../include/widgets.php:619
-msgid "New Message"
-msgstr "Nuevo mensaje"
+#: ../../include/items.php:5142
+msgid "Privacy group is empty."
+msgstr "El grupo de canales está vacío."
-#: ../../include/nav.php:198
-msgid "Event Calendar"
-msgstr "Calendario de eventos"
+#: ../../include/items.php:5149
+#, php-format
+msgid "Privacy group: %s"
+msgstr "Grupo de canales: %s"
-#: ../../include/nav.php:199
-msgid "See all events"
-msgstr "Ver todos los eventos"
+#: ../../include/items.php:5161
+msgid "Connection not found."
+msgstr "Conexión no encontrada"
-#: ../../include/nav.php:200
-msgid "Mark all events seen"
-msgstr "Marcar todos los eventos como leidos"
+#: ../../include/items.php:5594
+msgid "profile photo"
+msgstr "foto del perfil"
-#: ../../include/nav.php:203
-msgid "Manage Your Channels"
-msgstr "Gestionar sus canales"
+#: ../../include/photos.php:112
+#, php-format
+msgid "Image exceeds website size limit of %lu bytes"
+msgstr "La imagen excede el límite de %lu bytes del sitio"
-#: ../../include/nav.php:205
-msgid "Account/Channel Settings"
-msgstr "Ajustes de cuenta/canales"
+#: ../../include/photos.php:119
+msgid "Image file is empty."
+msgstr "El fichero de imagen está vacío. "
-#: ../../include/nav.php:213 ../../include/widgets.php:1368
-msgid "Admin"
-msgstr "Administrador"
+#: ../../include/photos.php:257
+msgid "Photo storage failed."
+msgstr "La foto no ha podido ser guardada."
-#: ../../include/nav.php:213
-msgid "Site Setup and Configuration"
-msgstr "Ajustes y configuración del sitio"
+#: ../../include/photos.php:297
+msgid "a new photo"
+msgstr "una nueva foto"
-#: ../../include/nav.php:249
-msgid "@name, #tag, ?doc, content"
-msgstr "@nombre, #etiqueta, ?ayuda, contenido"
+#: ../../include/photos.php:301
+#, php-format
+msgctxt "photo_upload"
+msgid "%1$s posted %2$s to %3$s"
+msgstr "%1$s ha publicado %2$s en %3$s"
-#: ../../include/nav.php:250
-msgid "Please wait..."
-msgstr "Espere por favor…"
+#: ../../include/photos.php:510
+msgid "Upload New Photos"
+msgstr "Subir nuevas fotos"
#: ../../include/widgets.php:103
msgid "System"
@@ -3238,10 +8483,6 @@ msgstr "Crear una aplicación personal"
msgid "Edit Personal App"
msgstr "Editar una aplicación personal"
-#: ../../include/widgets.php:149 ../../mod/suggest.php:54
-msgid "Ignore/Hide"
-msgstr "Ignorar/Ocultar"
-
#: ../../include/widgets.php:154
msgid "Suggestions"
msgstr "Sugerencias"
@@ -3271,13 +8512,6 @@ msgstr "Ejemplos: manuel@ejemplo.com, https://ejemplo.com/carmen"
msgid "Notes"
msgstr "Notas"
-#: ../../include/widgets.php:201 ../../include/text.php:905
-#: ../../include/text.php:917 ../../mod/admin.php:1687
-#: ../../mod/admin.php:1707 ../../mod/rbmark.php:28 ../../mod/rbmark.php:100
-#: ../../mod/filer.php:49
-msgid "Save"
-msgstr "Guardar"
-
#: ../../include/widgets.php:273
msgid "Remove term"
msgstr "Eliminar término"
@@ -3286,23 +8520,6 @@ msgstr "Eliminar término"
msgid "Archives"
msgstr "Hemeroteca"
-#: ../../include/widgets.php:444 ../../mod/connedit.php:589
-msgid "Me"
-msgstr "Yo"
-
-#: ../../include/widgets.php:445 ../../mod/connedit.php:590
-msgid "Family"
-msgstr "Familia"
-
-#: ../../include/widgets.php:447 ../../mod/connedit.php:592
-msgid "Acquaintances"
-msgstr "Conocidos/as"
-
-#: ../../include/widgets.php:448 ../../mod/connections.php:88
-#: ../../mod/connections.php:103 ../../mod/connedit.php:593
-msgid "All"
-msgstr "Todos/as"
-
#: ../../include/widgets.php:467
msgid "Refresh"
msgstr "Recargar"
@@ -3339,10 +8556,6 @@ msgstr "Exportar canal"
msgid "Connected apps"
msgstr "Aplicaciones conectadas"
-#: ../../include/widgets.php:565 ../../mod/connedit.php:701
-msgid "Connection Default Permissions"
-msgstr "Permisos predeterminados de conexión"
-
#: ../../include/widgets.php:573
msgid "Premium Channel Settings"
msgstr "Configuración del canal premium"
@@ -3355,6 +8568,18 @@ msgstr "Menú de correo privado"
msgid "Combined View"
msgstr "Vista combinada"
+#: ../../include/widgets.php:609 ../../include/nav.php:199
+msgid "Inbox"
+msgstr "Bandeja de entrada"
+
+#: ../../include/widgets.php:614 ../../include/nav.php:200
+msgid "Outbox"
+msgstr "Bandeja de salida"
+
+#: ../../include/widgets.php:619 ../../include/nav.php:201
+msgid "New Message"
+msgstr "Nuevo mensaje"
+
#: ../../include/widgets.php:636 ../../include/widgets.php:648
msgid "Conversations"
msgstr "Conversaciones"
@@ -3391,16 +8616,6 @@ msgstr "Eventos de la semana"
msgid "Month View"
msgstr "Eventos del mes"
-#: ../../include/widgets.php:706 ../../mod/cal.php:333
-#: ../../mod/events.php:661
-msgid "Export"
-msgstr "Exportar"
-
-#: ../../include/widgets.php:707 ../../mod/cal.php:336
-#: ../../mod/events.php:664
-msgid "Import"
-msgstr "Importar"
-
#: ../../include/widgets.php:717
msgid "Events Tools"
msgstr "Gestión de eventos"
@@ -3449,10 +8664,6 @@ msgstr "Valorar este canal"
msgid "View Ratings"
msgstr "Mostrar las valoraciones"
-#: ../../include/widgets.php:1222 ../../mod/pubsites.php:18
-msgid "Public Hubs"
-msgstr "Servidores públicos"
-
#: ../../include/widgets.php:1268
msgid "Forums"
msgstr "Foros"
@@ -3481,10 +8692,6 @@ msgstr "Para los administradores"
msgid "For Developers"
msgstr "Para los desarrolladores"
-#: ../../include/widgets.php:1334 ../../mod/admin.php:456
-msgid "Site"
-msgstr "Sitio"
-
#: ../../include/widgets.php:1335
msgid "Accounts"
msgstr "Cuentas"
@@ -3493,54 +8700,22 @@ msgstr "Cuentas"
msgid "Member registrations waiting for confirmation"
msgstr "Inscripciones de nuevos miembros pendientes de aprobación"
-#: ../../include/widgets.php:1336 ../../mod/admin.php:1149
-msgid "Channels"
-msgstr "Canales"
-
-#: ../../include/widgets.php:1337 ../../mod/admin.php:710
-msgid "Security"
-msgstr "Seguridad"
-
-#: ../../include/widgets.php:1339 ../../mod/admin.php:1264
-#: ../../mod/admin.php:1325
-msgid "Plugins"
-msgstr "Extensiones"
-
-#: ../../include/widgets.php:1340 ../../mod/admin.php:1486
-#: ../../mod/admin.php:1520
-msgid "Themes"
-msgstr "Temas"
-
#: ../../include/widgets.php:1341
msgid "Inspect queue"
msgstr "Examinar la cola"
-#: ../../include/widgets.php:1342 ../../mod/admin.php:1760
-msgid "Profile Fields"
-msgstr "Campos del perfil"
-
#: ../../include/widgets.php:1343
msgid "DB updates"
msgstr "Actualizaciones de la base de datos"
-#: ../../include/widgets.php:1361 ../../include/widgets.php:1371
-#: ../../mod/admin.php:1605
-msgid "Logs"
-msgstr "Informes"
+#: ../../include/widgets.php:1368 ../../include/nav.php:219
+msgid "Admin"
+msgstr "Administrador"
#: ../../include/widgets.php:1369
msgid "Plugin Features"
msgstr "Extensiones"
-#: ../../include/widgets.php:1451 ../../mod/photos.php:787
-#: ../../mod/photos.php:1328
-msgid "View Photo"
-msgstr "Ver foto"
-
-#: ../../include/widgets.php:1468 ../../mod/photos.php:818
-msgid "Edit Album"
-msgstr "Editar álbum"
-
#: ../../include/taxonomy.php:240 ../../include/taxonomy.php:261
msgid "Tags"
msgstr "Etiquetas"
@@ -3597,11 +8772,6 @@ msgstr "Contraseña demasiado corta"
msgid "Passwords do not match"
msgstr "Las contraseñas no coinciden"
-#: ../../include/js_strings.php:13 ../../mod/photos.php:41
-#: ../../mod/cal.php:37
-msgid "everybody"
-msgstr "cualquiera"
-
#: ../../include/js_strings.php:14
msgid "Secret Passphrase"
msgstr "Contraseña secreta"
@@ -3626,11 +8796,6 @@ msgstr "Nada nuevo por aquí"
msgid "Rate This Channel (this is public)"
msgstr "Valorar este canal (esto es público)"
-#: ../../include/js_strings.php:20 ../../mod/connedit.php:712
-#: ../../mod/rate.php:157
-msgid "Rating"
-msgstr "Valoración"
-
#: ../../include/js_strings.php:21
msgid "Describe (optional)"
msgstr "Describir (opcional)"
@@ -3643,12 +8808,6 @@ msgstr "Por favor, introduzca una dirección de enlace"
msgid "Unsaved changes. Are you sure you wish to leave this page?"
msgstr "Cambios no guardados. ¿Está seguro de que desea abandonar la página?"
-#: ../../include/js_strings.php:25 ../../mod/profiles.php:472
-#: ../../mod/profiles.php:697 ../../mod/pubsites.php:36
-#: ../../mod/events.php:459 ../../mod/locs.php:113
-msgid "Location"
-msgstr "Ubicación"
-
#: ../../include/js_strings.php:27
msgid "timeago.prefixAgo"
msgstr "timeago.prefixAgo"
@@ -3926,10 +9085,6 @@ msgstr "No se ha podido crear un canal con un identificador que ya existe en est
msgid "Channel clone failed. Import failed."
msgstr "La clonación del canal no ha salido bien. La importación ha fallado."
-#: ../../include/import.php:80 ../../mod/import.php:146
-msgid "Cloned channel not found. Import failed."
-msgstr "No se ha podido importar el canal porque el canal clonado no se ha encontrado."
-
#: ../../include/oembed.php:267
msgid "Embedded content"
msgstr "Contenido incorporado"
@@ -3942,34 +9097,10 @@ msgstr "Incrustación deshabilitada"
msgid "New Page"
msgstr "Nueva página"
-#: ../../include/page_widgets.php:39 ../../mod/pubsites.php:42
-#: ../../mod/webpages.php:191 ../../mod/blocks.php:161
-#: ../../mod/layouts.php:189
-msgid "View"
-msgstr "Ver"
-
-#: ../../include/page_widgets.php:41 ../../mod/webpages.php:193
-msgid "Actions"
-msgstr "Acciones"
-
-#: ../../include/page_widgets.php:42 ../../mod/webpages.php:194
-msgid "Page Link"
-msgstr "Vínculo de la página"
-
#: ../../include/page_widgets.php:43
msgid "Title"
msgstr "Título"
-#: ../../include/page_widgets.php:44 ../../mod/webpages.php:196
-#: ../../mod/blocks.php:152 ../../mod/layouts.php:182 ../../mod/menu.php:110
-msgid "Created"
-msgstr "Creado"
-
-#: ../../include/page_widgets.php:45 ../../mod/webpages.php:197
-#: ../../mod/blocks.php:153 ../../mod/layouts.php:183 ../../mod/menu.php:111
-msgid "Edited"
-msgstr "Editado"
-
#: ../../include/permissions.php:26
msgid "Can view my normal stream and posts"
msgstr "Pueden verse mi actividad y publicaciones normales"
@@ -4296,10 +9427,6 @@ msgstr "eliminar del fichero"
msgid "Click to open/close"
msgstr "Pulsar para abrir/cerrar"
-#: ../../include/text.php:1743 ../../mod/cal.php:307 ../../mod/events.php:630
-msgid "Link to Source"
-msgstr "Enlazar con la entrada en su ubicación original"
-
#: ../../include/text.php:1764 ../../include/text.php:1836
msgid "default"
msgstr "por defecto"
@@ -4328,5143 +9455,187 @@ msgstr "la actividad"
msgid "Design Tools"
msgstr "Herramientas de diseño web"
-#: ../../include/text.php:2278 ../../mod/blocks.php:149
-msgid "Blocks"
-msgstr "Bloques"
-
-#: ../../include/text.php:2279 ../../mod/menu.php:103
-msgid "Menus"
-msgstr "Menús"
-
-#: ../../include/text.php:2280 ../../mod/layouts.php:175
-msgid "Layouts"
-msgstr "Plantillas"
-
#: ../../include/text.php:2281
msgid "Pages"
msgstr "Páginas"
-#: ../../include/api.php:1336
-msgid "Public Timeline"
-msgstr "Cronología pública"
-
-#: ../../mod/lockview.php:57
-msgid "Remote privacy information not available."
-msgstr "La información privada remota no está disponible."
-
-#: ../../mod/lockview.php:78
-msgid "Visible to:"
-msgstr "Visible para:"
-
-#: ../../mod/achievements.php:34
-msgid "Some blurb about what to do when you're new here"
-msgstr "Algunas propuestas para el nuevo usuario sobre qué se puede hacer aquí"
-
-#: ../../mod/acl.php:221
-msgid "network"
-msgstr "red"
-
-#: ../../mod/acl.php:231
-msgid "RSS"
-msgstr "RSS"
-
-#: ../../mod/oexchange.php:23
-msgid "Unable to find your hub."
-msgstr "No se puede encontrar su servidor."
-
-#: ../../mod/oexchange.php:37
-msgid "Post successful."
-msgstr "Enviado con éxito."
-
-#: ../../mod/admin.php:54
-msgid "Theme settings updated."
-msgstr "Ajustes del tema actualizados."
-
-#: ../../mod/admin.php:174
-msgid "# Accounts"
-msgstr "# Cuentas"
-
-#: ../../mod/admin.php:175
-msgid "# blocked accounts"
-msgstr "# cuentas bloqueadas"
-
-#: ../../mod/admin.php:176
-msgid "# expired accounts"
-msgstr "# cuentas caducadas"
-
-#: ../../mod/admin.php:177
-msgid "# expiring accounts"
-msgstr "# cuentas que caducan"
-
-#: ../../mod/admin.php:188
-msgid "# Channels"
-msgstr "# Canales"
-
-#: ../../mod/admin.php:189
-msgid "# primary"
-msgstr "# primario"
-
-#: ../../mod/admin.php:190
-msgid "# clones"
-msgstr "# clones"
-
-#: ../../mod/admin.php:196
-msgid "Message queues"
-msgstr "Mensajes en cola"
-
-#: ../../mod/admin.php:212 ../../mod/admin.php:455 ../../mod/admin.php:669
-#: ../../mod/admin.php:709 ../../mod/admin.php:984 ../../mod/admin.php:1148
-#: ../../mod/admin.php:1263 ../../mod/admin.php:1324 ../../mod/admin.php:1485
-#: ../../mod/admin.php:1519 ../../mod/admin.php:1604
-msgid "Administration"
-msgstr "Administración"
-
-#: ../../mod/admin.php:213
-msgid "Summary"
-msgstr "Sumario"
-
-#: ../../mod/admin.php:216
-msgid "Registered accounts"
-msgstr "Cuentas registradas"
-
-#: ../../mod/admin.php:217 ../../mod/admin.php:673
-msgid "Pending registrations"
-msgstr "Registros pendientes"
-
-#: ../../mod/admin.php:218
-msgid "Registered channels"
-msgstr "Canales registrados"
-
-#: ../../mod/admin.php:219 ../../mod/admin.php:674
-msgid "Active plugins"
-msgstr "Extensiones activas"
-
-#: ../../mod/admin.php:220
-msgid "Version"
-msgstr "Versión"
-
-#: ../../mod/admin.php:339
-msgid "Site settings updated."
-msgstr "Ajustes del sitio actualizados."
-
-#: ../../mod/admin.php:376 ../../mod/settings.php:805
-msgid "mobile"
-msgstr "móvil"
-
-#: ../../mod/admin.php:378
-msgid "experimental"
-msgstr "experimental"
-
-#: ../../mod/admin.php:380
-msgid "unsupported"
-msgstr "no soportado"
-
-#: ../../mod/admin.php:426
-msgid "Yes - with approval"
-msgstr "Sí - con aprobación"
-
-#: ../../mod/admin.php:432
-msgid "My site is not a public server"
-msgstr "Mi sitio no es un servidor público"
-
-#: ../../mod/admin.php:433
-msgid "My site has paid access only"
-msgstr "Mi sitio es un servicio de pago"
-
-#: ../../mod/admin.php:434
-msgid "My site has free access only"
-msgstr "Mi sitio es un servicio gratuito"
-
-#: ../../mod/admin.php:435
-msgid "My site offers free accounts with optional paid upgrades"
-msgstr "Mi sitio ofrece cuentas gratuitas con opciones extra de pago"
-
-#: ../../mod/admin.php:458 ../../mod/register.php:241
-msgid "Registration"
-msgstr "Registro"
-
-#: ../../mod/admin.php:459
-msgid "File upload"
-msgstr "Subir fichero"
-
-#: ../../mod/admin.php:460
-msgid "Policies"
-msgstr "Políticas"
-
-#: ../../mod/admin.php:465
-msgid "Site name"
-msgstr "Nombre del sitio"
-
-#: ../../mod/admin.php:466
-msgid "Banner/Logo"
-msgstr "Banner/Logo"
-
-#: ../../mod/admin.php:467
-msgid "Administrator Information"
-msgstr "Información del Administrador"
-
-#: ../../mod/admin.php:467
-msgid ""
-"Contact information for site administrators. Displayed on siteinfo page. "
-"BBCode can be used here"
-msgstr "Información de contacto de los administradores del sitio. Visible en la página \"siteinfo\". Se puede usar BBCode"
-
-#: ../../mod/admin.php:468
-msgid "System language"
-msgstr "Idioma del sistema"
-
-#: ../../mod/admin.php:469
-msgid "System theme"
-msgstr "Tema gráfico del sistema"
-
-#: ../../mod/admin.php:469
-msgid ""
-"Default system theme - may be over-ridden by user profiles - <a href='#' "
-"id='cnftheme'>change theme settings</a>"
-msgstr "Tema del sistema por defecto - se puede cambiar por cada perfil de usuario - <a href='#' id='cnftheme'>modificar los ajustes del tema</a>"
-
-#: ../../mod/admin.php:470
-msgid "Mobile system theme"
-msgstr "Tema del sistema para móviles"
-
-#: ../../mod/admin.php:470
-msgid "Theme for mobile devices"
-msgstr "Tema para dispositivos móviles"
-
-#: ../../mod/admin.php:472
-msgid "Allow Feeds as Connections"
-msgstr "Permitir contenidos RSS como conexiones"
-
-#: ../../mod/admin.php:472
-msgid "(Heavy system resource usage)"
-msgstr "(Uso intenso de los recursos del sistema)"
-
-#: ../../mod/admin.php:473
-msgid "Maximum image size"
-msgstr "Tamaño máximo de la imagen"
-
-#: ../../mod/admin.php:473
-msgid ""
-"Maximum size in bytes of uploaded images. Default is 0, which means no "
-"limits."
-msgstr "Tamaño máximo en bytes de la imagen subida. Por defecto, es 0, lo que significa que no hay límites."
-
-#: ../../mod/admin.php:474
-msgid "Does this site allow new member registration?"
-msgstr "¿Debe este sitio permitir el registro de nuevos miembros?"
-
-#: ../../mod/admin.php:475
-msgid "Invitation only"
-msgstr "Solo con una invitación"
-
-#: ../../mod/admin.php:475
-msgid ""
-"Only allow new member registrations with an invitation code. Above register "
-"policy must be set to Yes."
-msgstr "Solo se permiten inscripciones de nuevos miembros con un código de invitación. Además, deben aceptarse los términos del registro marcando \"Sí\"."
-
-#: ../../mod/admin.php:476
-msgid "Which best describes the types of account offered by this hub?"
-msgstr "¿Cómo describiría el tipo de servicio ofrecido por este servidor?"
-
-#: ../../mod/admin.php:477
-msgid "Register text"
-msgstr "Texto del registro"
-
-#: ../../mod/admin.php:477
-msgid "Will be displayed prominently on the registration page."
-msgstr "Se mostrará de forma destacada en la página de registro."
-
-#: ../../mod/admin.php:478
-msgid "Site homepage to show visitors (default: login box)"
-msgstr "Página personal que se mostrará a los visitantes (por defecto: la página de identificación)"
-
-#: ../../mod/admin.php:478
-msgid ""
-"example: 'public' to show public stream, 'page/sys/home' to show a system "
-"webpage called 'home' or 'include:home.html' to include a file."
-msgstr "ejemplo: 'public' para mostrar contenido público, 'page/sys/home' para mostrar la página web definida como \"home\" o 'include:home.html' para mostrar el contenido de un fichero."
-
-#: ../../mod/admin.php:479
-msgid "Preserve site homepage URL"
-msgstr "Preservar la dirección de la página personal"
-
-#: ../../mod/admin.php:479
-msgid ""
-"Present the site homepage in a frame at the original location instead of "
-"redirecting"
-msgstr "Presenta la página personal del sitio en un marco en la ubicación original, en vez de redirigirla."
-
-#: ../../mod/admin.php:480
-msgid "Accounts abandoned after x days"
-msgstr "Cuentas abandonadas después de x días"
-
-#: ../../mod/admin.php:480
-msgid ""
-"Will not waste system resources polling external sites for abandonded "
-"accounts. Enter 0 for no time limit."
-msgstr "Para evitar consumir recursos del sistema intentando poner al día las cuentas abandonadas. Introduzca 0 para no tener límite de tiempo."
-
-#: ../../mod/admin.php:481
-msgid "Allowed friend domains"
-msgstr "Dominios amigos permitidos"
-
-#: ../../mod/admin.php:481
-msgid ""
-"Comma separated list of domains which are allowed to establish friendships "
-"with this site. Wildcards are accepted. Empty to allow any domains"
-msgstr "Lista separada por comas de dominios a los que está permitido establecer relaciones de amistad con este sitio. Se permiten comodines. Dejar en claro para aceptar cualquier dominio."
-
-#: ../../mod/admin.php:482
-msgid "Allowed email domains"
-msgstr "Se aceptan dominios de correo electrónico"
-
-#: ../../mod/admin.php:482
-msgid ""
-"Comma separated list of domains which are allowed in email addresses for "
-"registrations to this site. Wildcards are accepted. Empty to allow any "
-"domains"
-msgstr "Lista separada por comas de los dominios de los que se acepta una dirección de correo electrónico para registros en este sitio. Se permiten comodines. Dejar en claro para aceptar cualquier dominio. "
-
-#: ../../mod/admin.php:483
-msgid "Not allowed email domains"
-msgstr "No se permiten dominios de correo electrónico"
-
-#: ../../mod/admin.php:483
-msgid ""
-"Comma separated list of domains which are not allowed in email addresses for"
-" registrations to this site. Wildcards are accepted. Empty to allow any "
-"domains, unless allowed domains have been defined."
-msgstr "Lista separada por comas de los dominios de los que no se acepta una dirección de correo electrónico para registros en este sitio. Se permiten comodines. Dejar en claro para no aceptar cualquier dominio, excepto los que se hayan autorizado."
-
-#: ../../mod/admin.php:484
-msgid "Verify Email Addresses"
-msgstr "Verificar las direcciones de correo electrónico"
-
-#: ../../mod/admin.php:484
-msgid ""
-"Check to verify email addresses used in account registration (recommended)."
-msgstr "Activar para la verificación de la dirección de correo electrónico en el registro de una cuenta (recomendado)."
-
-#: ../../mod/admin.php:485
-msgid "Force publish"
-msgstr "Forzar la publicación"
-
-#: ../../mod/admin.php:485
-msgid ""
-"Check to force all profiles on this site to be listed in the site directory."
-msgstr "Intentar forzar todos los perfiles para que sean listados en el directorio de este sitio."
-
-#: ../../mod/admin.php:486
-msgid "Import Public Streams"
-msgstr "Importar contenido público"
-
-#: ../../mod/admin.php:486
-msgid ""
-"Import and allow access to public content pulled from other sites. Warning: "
-"this content is unmoderated."
-msgstr "Importar y permitir acceso al contenido público sacado de otros sitios. Advertencia: este contenido no está moderado, por lo que podría encontrar cosas inapropiadas u ofensivas."
-
-#: ../../mod/admin.php:487
-msgid "login on Homepage"
-msgstr "Iniciar sesión en la página personal"
-
-#: ../../mod/admin.php:487
-msgid ""
-"Present a login box to visitors on the home page if no other content has "
-"been configured."
-msgstr "Presentar a los visitantes una casilla de identificación en la página de inicio, si no se ha configurado otro tipo de contenido."
-
-#: ../../mod/admin.php:489
-msgid "Directory Server URL"
-msgstr "URL del servidor de directorio"
-
-#: ../../mod/admin.php:489
-msgid "Default directory server"
-msgstr "Servidor de directorio predeterminado"
-
-#: ../../mod/admin.php:491
-msgid "Proxy user"
-msgstr "Usuario del proxy"
-
-#: ../../mod/admin.php:492
-msgid "Proxy URL"
-msgstr "Dirección del proxy"
-
-#: ../../mod/admin.php:493
-msgid "Network timeout"
-msgstr "Tiempo de espera de la red"
-
-#: ../../mod/admin.php:493
-msgid "Value is in seconds. Set to 0 for unlimited (not recommended)."
-msgstr "Valor en segundos. Poner a 0 para que no haya tiempo límite (no recomendado)"
-
-#: ../../mod/admin.php:494
-msgid "Delivery interval"
-msgstr "Intervalo de entrega"
-
-#: ../../mod/admin.php:494
-msgid ""
-"Delay background delivery processes by this many seconds to reduce system "
-"load. Recommend: 4-5 for shared hosts, 2-3 for virtual private servers. 0-1 "
-"for large dedicated servers."
-msgstr "Retrasar los procesos de transmisión en segundo plano por esta cantidad de segundos para reducir la carga del sistema. Recomendado: 4-5 para sitios compartidos, 2-3 para servidores virtuales privados, 0-1 para grandes servidores dedicados."
-
-#: ../../mod/admin.php:495
-msgid "Deliveries per process"
-msgstr "Intentos de envío por proceso"
-
-#: ../../mod/admin.php:495
-msgid ""
-"Number of deliveries to attempt in a single operating system process. Adjust"
-" if necessary to tune system performance. Recommend: 1-5."
-msgstr "Numero de envíos a intentar en un único proceso del sistema operativo. Ajustar si es necesario mejorar el rendimiento. Se recomienda: 1-5."
-
-#: ../../mod/admin.php:496
-msgid "Poll interval"
-msgstr "Intervalo máximo de tiempo entre dos mensajes sucesivos"
-
-#: ../../mod/admin.php:496
-msgid ""
-"Delay background polling processes by this many seconds to reduce system "
-"load. If 0, use delivery interval."
-msgstr "Retrasar el intervalo de envío en segundo plano, en esta cantidad de segundos, para reducir la carga del sistema. Si es 0, usar el intervalo de entrega."
-
-#: ../../mod/admin.php:497
-msgid "Maximum Load Average"
-msgstr "Carga media máxima"
-
-#: ../../mod/admin.php:497
-msgid ""
-"Maximum system load before delivery and poll processes are deferred - "
-"default 50."
-msgstr "Carga máxima del sistema antes de que los procesos de entrega y envío se hayan retardado - por defecto, 50."
-
-#: ../../mod/admin.php:498
-msgid "Expiration period in days for imported (grid/network) content"
-msgstr "Caducidad del contenido importado de otros sitios (en días)"
-
-#: ../../mod/admin.php:498
-msgid "0 for no expiration of imported content"
-msgstr "0 para que no caduque el contenido importado"
-
-#: ../../mod/admin.php:635 ../../mod/admin.php:636 ../../mod/settings.php:729
-msgid "Off"
-msgstr "Desactivado"
-
-#: ../../mod/admin.php:635 ../../mod/admin.php:636 ../../mod/settings.php:729
-msgid "On"
-msgstr "Activado"
-
-#: ../../mod/admin.php:636
-#, php-format
-msgid "Lock feature %s"
-msgstr "Bloquear la funcionalidad %s"
-
-#: ../../mod/admin.php:644
-msgid "Manage Additional Features"
-msgstr "Gestionar las funcionalidades"
-
-#: ../../mod/admin.php:661
-msgid "No server found"
-msgstr "Servidor no encontrado"
-
-#: ../../mod/admin.php:668 ../../mod/admin.php:998
-msgid "ID"
-msgstr "ID"
-
-#: ../../mod/admin.php:668
-msgid "for channel"
-msgstr "por canal"
-
-#: ../../mod/admin.php:668
-msgid "on server"
-msgstr "en el servidor"
-
-#: ../../mod/admin.php:668 ../../mod/connections.php:266
-msgid "Status"
-msgstr "Estado"
-
-#: ../../mod/admin.php:670
-msgid "Server"
-msgstr "Servidor"
-
-#: ../../mod/admin.php:712
-msgid "Block public"
-msgstr "Bloquear páginas públicas"
-
-#: ../../mod/admin.php:712
-msgid ""
-"Check to block public access to all otherwise public personal pages on this "
-"site unless you are currently authenticated."
-msgstr "Habilitar para impedir ver las páginas personales de este sitio a quien no esté actualmente autenticado."
-
-#: ../../mod/admin.php:713
-msgid "Allow communications only from these sites"
-msgstr "Permitir la comunicación solo desde estos sitios"
-
-#: ../../mod/admin.php:713
-msgid ""
-"One site per line. Leave empty to allow communication from anywhere by "
-"default"
-msgstr "Un sitio por línea. Dejar en blanco para permitir por defecto la comunicación desde cualquiera"
-
-#: ../../mod/admin.php:714
-msgid "Block communications from these sites"
-msgstr "Bloquear la comunicación desde estos sitios"
-
-#: ../../mod/admin.php:715
-msgid "Allow communications only from these channels"
-msgstr "Permitir la comunicación solo desde estos canales"
-
-#: ../../mod/admin.php:715
-msgid ""
-"One channel (hash) per line. Leave empty to allow from any channel by "
-"default"
-msgstr "Un canal (hash) por línea. Dejar en blanco para permitir por defecto la comunicación desde cualquiera"
-
-#: ../../mod/admin.php:716
-msgid "Block communications from these channels"
-msgstr "Bloquear la comunicación desde estos canales"
-
-#: ../../mod/admin.php:717
-msgid "Allow embedded HTML content only from these domains"
-msgstr "Permitir contenido con HTML incorporado solo desde estos dominios"
-
-#: ../../mod/admin.php:717
-msgid "One site per line. Leave empty to allow from any site by default"
-msgstr "Un sitio por línea. Dejar en blanco para permitirlo por defecto desde cualquier sitio"
-
-#: ../../mod/admin.php:718
-msgid "Block embedded HTML from these domains"
-msgstr "Bloquear contenido con HTML incorporado desde estos dominios"
-
-#: ../../mod/admin.php:720
-msgid "Cooperative embed security"
-msgstr "Seguridad cooperativa incorporada"
-
-#: ../../mod/admin.php:720
-msgid "Enable to share embed security with other compatible sites/hubs"
-msgstr "Habilitar la compartición de seguridad incorporada con otros sitios compatibles"
-
-#: ../../mod/admin.php:735
-msgid "Update has been marked successful"
-msgstr "La actualización ha sido marcada como exitosa"
-
-#: ../../mod/admin.php:745
-#, php-format
-msgid "Executing %s failed. Check system logs."
-msgstr "La ejecución de %s ha fallado. Mirar en los informes del sistema."
-
-#: ../../mod/admin.php:748
-#, php-format
-msgid "Update %s was successfully applied."
-msgstr "La actualización de %s se ha realizado exitosamente."
-
-#: ../../mod/admin.php:752
-#, php-format
-msgid "Update %s did not return a status. Unknown if it succeeded."
-msgstr "La actualización de %s no ha devuelto ningún estado. No se sabe si ha tenido éxito."
-
-#: ../../mod/admin.php:755
-#, php-format
-msgid "Update function %s could not be found."
-msgstr "No se encuentra la función de actualización de %s."
-
-#: ../../mod/admin.php:771
-msgid "No failed updates."
-msgstr "No ha fallado ninguna actualización."
-
-#: ../../mod/admin.php:775
-msgid "Failed Updates"
-msgstr "Han fallado las actualizaciones"
-
-#: ../../mod/admin.php:777
-msgid "Mark success (if update was manually applied)"
-msgstr "Marcar como exitosa (si la actualización se ha hecho manualmente)"
-
-#: ../../mod/admin.php:778
-msgid "Attempt to execute this update step automatically"
-msgstr "Intentar ejecutar este paso de actualización automáticamente"
-
-#: ../../mod/admin.php:809
-msgid "Queue Statistics"
-msgstr "Estadísticas de la cola"
-
-#: ../../mod/admin.php:810
-msgid "Total Entries"
-msgstr "Total de entradas"
-
-#: ../../mod/admin.php:811
-msgid "Priority"
-msgstr "Prioridad"
-
-#: ../../mod/admin.php:812
-msgid "Destination URL"
-msgstr "Dirección de destino"
-
-#: ../../mod/admin.php:813
-msgid "Mark hub permanently offline"
-msgstr "Marcar el servidor como permanentemente fuera de línea"
-
-#: ../../mod/admin.php:814
-msgid "Empty queue for this hub"
-msgstr "Vaciar la cola para este servidor"
-
-#: ../../mod/admin.php:815
-msgid "Last known contact"
-msgstr "Último contacto conocido"
-
-#: ../../mod/admin.php:851
-#, php-format
-msgid "%s account blocked/unblocked"
-msgid_plural "%s account blocked/unblocked"
-msgstr[0] "%s cuenta bloqueada/desbloqueada"
-msgstr[1] "%s cuenta bloqueada/desbloqueada"
-
-#: ../../mod/admin.php:859
-#, php-format
-msgid "%s account deleted"
-msgid_plural "%s accounts deleted"
-msgstr[0] "%s cuentas eliminadas"
-msgstr[1] "%s cuentas eliminadas"
-
-#: ../../mod/admin.php:895
-msgid "Account not found"
-msgstr "Cuenta no encontrada"
-
-#: ../../mod/admin.php:907
-#, php-format
-msgid "Account '%s' deleted"
-msgstr "La cuenta '%s' ha sido eliminada"
-
-#: ../../mod/admin.php:915
-#, php-format
-msgid "Account '%s' blocked"
-msgstr "La cuenta '%s' ha sido bloqueada"
-
-#: ../../mod/admin.php:923
-#, php-format
-msgid "Account '%s' unblocked"
-msgstr "La cuenta '%s' ha sido desbloqueada"
-
-#: ../../mod/admin.php:985 ../../mod/admin.php:997
-msgid "Users"
-msgstr "Usuarios"
-
-#: ../../mod/admin.php:987 ../../mod/admin.php:1151
-msgid "select all"
-msgstr "seleccionar todo"
-
-#: ../../mod/admin.php:988
-msgid "User registrations waiting for confirm"
-msgstr "Registros de usuario en espera de aprobación"
-
-#: ../../mod/admin.php:989
-msgid "Request date"
-msgstr "Fecha de solicitud"
-
-#: ../../mod/admin.php:990
-msgid "No registrations."
-msgstr "Sin registros."
-
-#: ../../mod/admin.php:991 ../../mod/connections.php:271
-msgid "Approve"
-msgstr "Aprobar"
-
-#: ../../mod/admin.php:992
-msgid "Deny"
-msgstr "Rechazar"
-
-#: ../../mod/admin.php:994 ../../mod/connedit.php:537
-msgid "Block"
-msgstr "Bloquear"
-
-#: ../../mod/admin.php:995 ../../mod/connedit.php:537
-msgid "Unblock"
-msgstr "Desbloquear"
-
-#: ../../mod/admin.php:998
-msgid "Register date"
-msgstr "Fecha de registro"
-
-#: ../../mod/admin.php:998
-msgid "Last login"
-msgstr "Último acceso"
-
-#: ../../mod/admin.php:998
-msgid "Expires"
-msgstr "Caduca"
-
-#: ../../mod/admin.php:998
-msgid "Service Class"
-msgstr "Clase de servicio"
-
-#: ../../mod/admin.php:1000
-msgid ""
-"Selected accounts will be deleted!\\n\\nEverything these accounts had posted"
-" on this site will be permanently deleted!\\n\\nAre you sure?"
-msgstr "¡Las cuentas seleccionadas van a ser eliminadas!\\n\\n¡Todo lo que estas cuentas han publicado en este sitio será borrado de forma permanente!\\n\\n¿Está seguro de querer hacerlo?"
-
-#: ../../mod/admin.php:1001
-msgid ""
-"The account {0} will be deleted!\\n\\nEverything this account has posted on "
-"this site will be permanently deleted!\\n\\nAre you sure?"
-msgstr "¡La cuenta {0} va a ser eliminada!\\n\\n¡Todo lo que esta cuenta ha publicado en este sitio será borrado de forma permanente!\\n\\n¿Está seguro de querer hacerlo?"
-
-#: ../../mod/admin.php:1037
-#, php-format
-msgid "%s channel censored/uncensored"
-msgid_plural "%s channels censored/uncensored"
-msgstr[0] "%s canales censurados/no censurados"
-msgstr[1] "%s canales censurados/no censurados"
-
-#: ../../mod/admin.php:1046
-#, php-format
-msgid "%s channel code allowed/disallowed"
-msgid_plural "%s channels code allowed/disallowed"
-msgstr[0] "%s código permitido/no permitido al canal"
-msgstr[1] "%s código permitido/no permitido al canal"
-
-#: ../../mod/admin.php:1053
-#, php-format
-msgid "%s channel deleted"
-msgid_plural "%s channels deleted"
-msgstr[0] "%s canales eliminados"
-msgstr[1] "%s canales eliminados"
-
-#: ../../mod/admin.php:1073
-msgid "Channel not found"
-msgstr "Canal no encontrado"
-
-#: ../../mod/admin.php:1084
-#, php-format
-msgid "Channel '%s' deleted"
-msgstr "Canal '%s' eliminado"
-
-#: ../../mod/admin.php:1096
-#, php-format
-msgid "Channel '%s' censored"
-msgstr "Canal '%s' censurado"
-
-#: ../../mod/admin.php:1096
-#, php-format
-msgid "Channel '%s' uncensored"
-msgstr "Canal '%s' no censurado"
-
-#: ../../mod/admin.php:1107
-#, php-format
-msgid "Channel '%s' code allowed"
-msgstr "Código permitido al canal '%s'"
-
-#: ../../mod/admin.php:1107
-#, php-format
-msgid "Channel '%s' code disallowed"
-msgstr "Código no permitido al canal '%s'"
-
-#: ../../mod/admin.php:1153
-msgid "Censor"
-msgstr "Censurar"
-
-#: ../../mod/admin.php:1154
-msgid "Uncensor"
-msgstr "No censurar"
-
-#: ../../mod/admin.php:1155
-msgid "Allow Code"
-msgstr "Permitir código"
-
-#: ../../mod/admin.php:1156
-msgid "Disallow Code"
-msgstr "No permitir código"
-
-#: ../../mod/admin.php:1158
-msgid "UID"
-msgstr "UID"
-
-#: ../../mod/admin.php:1158 ../../mod/profiles.php:465 ../../mod/locs.php:114
-msgid "Address"
-msgstr "Dirección"
-
-#: ../../mod/admin.php:1160
-msgid ""
-"Selected channels will be deleted!\\n\\nEverything that was posted in these "
-"channels on this site will be permanently deleted!\\n\\nAre you sure?"
-msgstr "Los canales seleccionados se eliminarán!\\n\\nTodo lo publicado por estos canales en este sitio se borrarán definitivamente!\\n\\n¿Está seguro de querer hacerlo?"
-
-#: ../../mod/admin.php:1161
-msgid ""
-"The channel {0} will be deleted!\\n\\nEverything that was posted in this "
-"channel on this site will be permanently deleted!\\n\\nAre you sure?"
-msgstr "El canal {0} va a ser eliminado!\\n\\nTodo lo publicado por el canal en este sitio se borrará definitivamente!\\n\\n¿Está seguro de querer hacerlo?"
-
-#: ../../mod/admin.php:1218
-#, php-format
-msgid "Plugin %s disabled."
-msgstr "Extensión %s desactivada."
-
-#: ../../mod/admin.php:1222
-#, php-format
-msgid "Plugin %s enabled."
-msgstr "Extensión %s activada."
-
-#: ../../mod/admin.php:1232 ../../mod/admin.php:1458
-msgid "Disable"
-msgstr "Desactivar"
-
-#: ../../mod/admin.php:1235 ../../mod/admin.php:1460
-msgid "Enable"
-msgstr "Activar"
-
-#: ../../mod/admin.php:1265 ../../mod/admin.php:1487
-msgid "Toggle"
-msgstr "Cambiar"
-
-#: ../../mod/admin.php:1273 ../../mod/admin.php:1497
-msgid "Author: "
-msgstr "Autor:"
-
-#: ../../mod/admin.php:1274 ../../mod/admin.php:1498
-msgid "Maintainer: "
-msgstr "Mantenedor:"
-
-#: ../../mod/admin.php:1275
-msgid "Minimum project version: "
-msgstr "Versión mínima del proyecto:"
-
-#: ../../mod/admin.php:1276
-msgid "Maximum project version: "
-msgstr "Versión máxima del proyecto:"
-
-#: ../../mod/admin.php:1277
-msgid "Minimum PHP version: "
-msgstr "Versión mínima de PHP:"
-
-#: ../../mod/admin.php:1278
-msgid "Requires: "
-msgstr "Se requiere:"
-
-#: ../../mod/admin.php:1279 ../../mod/admin.php:1330
-msgid "Disabled - version incompatibility"
-msgstr "Deshabilitado - versiones incompatibles"
-
-#: ../../mod/admin.php:1423
-msgid "No themes found."
-msgstr "No se han encontrado temas."
-
-#: ../../mod/admin.php:1479
-msgid "Screenshot"
-msgstr "Instantánea de pantalla"
-
-#: ../../mod/admin.php:1525
-msgid "[Experimental]"
-msgstr "[Experimental]"
-
-#: ../../mod/admin.php:1526
-msgid "[Unsupported]"
-msgstr "[No soportado]"
-
-#: ../../mod/admin.php:1550
-msgid "Log settings updated."
-msgstr "Actualizado el informe de configuraciones."
-
-#: ../../mod/admin.php:1607
-msgid "Clear"
-msgstr "Vaciar"
-
-#: ../../mod/admin.php:1613
-msgid "Debugging"
-msgstr "Depuración"
-
-#: ../../mod/admin.php:1614
-msgid "Log file"
-msgstr "Fichero de informe"
-
-#: ../../mod/admin.php:1614
-msgid ""
-"Must be writable by web server. Relative to your Red top-level directory."
-msgstr "Debe tener permisos de escritura por el servidor web. La ruta es relativa al directorio de instalación de Hubzilla."
-
-#: ../../mod/admin.php:1615
-msgid "Log level"
-msgstr "Nivel de depuración"
-
-#: ../../mod/admin.php:1682
-msgid "New Profile Field"
-msgstr "Nuevo campo en el perfil"
-
-#: ../../mod/admin.php:1683 ../../mod/admin.php:1703
-msgid "Field nickname"
-msgstr "Alias del campo"
-
-#: ../../mod/admin.php:1683 ../../mod/admin.php:1703
-msgid "System name of field"
-msgstr "Nombre del campo en el sistema"
-
-#: ../../mod/admin.php:1684 ../../mod/admin.php:1704
-msgid "Input type"
-msgstr "Tipo de entrada"
-
-#: ../../mod/admin.php:1685 ../../mod/admin.php:1705
-msgid "Field Name"
-msgstr "Nombre del campo"
-
-#: ../../mod/admin.php:1685 ../../mod/admin.php:1705
-msgid "Label on profile pages"
-msgstr "Etiqueta a mostrar en la página del perfil"
-
-#: ../../mod/admin.php:1686 ../../mod/admin.php:1706
-msgid "Help text"
-msgstr "Texto de ayuda"
-
-#: ../../mod/admin.php:1686 ../../mod/admin.php:1706
-msgid "Additional info (optional)"
-msgstr "Información adicional (opcional)"
-
-#: ../../mod/admin.php:1696
-msgid "Field definition not found"
-msgstr "Definición del campo no encontrada"
-
-#: ../../mod/admin.php:1702
-msgid "Edit Profile Field"
-msgstr "Modificar el campo del perfil"
-
-#: ../../mod/admin.php:1761
-msgid "Basic Profile Fields"
-msgstr "Campos básicos del perfil"
-
-#: ../../mod/admin.php:1762
-msgid "Advanced Profile Fields"
-msgstr "Campos avanzados del perfil"
-
-#: ../../mod/admin.php:1762
-msgid "(In addition to basic fields)"
-msgstr "(Además de los campos básicos)"
-
-#: ../../mod/admin.php:1764
-msgid "All available fields"
-msgstr "Todos los campos disponibles"
-
-#: ../../mod/admin.php:1765
-msgid "Custom Fields"
-msgstr "Campos personalizados"
-
-#: ../../mod/admin.php:1769
-msgid "Create Custom Field"
-msgstr "Crear un campo personalizado"
-
-#: ../../mod/api.php:74 ../../mod/api.php:98
-msgid "Authorize application connection"
-msgstr "Autorizar una conexión de aplicación"
-
-#: ../../mod/api.php:75
-msgid "Return to your app and insert this Securty Code:"
-msgstr "Volver a su aplicación e introducir este código de seguridad:"
-
-#: ../../mod/api.php:85
-msgid "Please login to continue."
-msgstr "Por favor inicie sesión para continuar."
-
-#: ../../mod/api.php:100
-msgid ""
-"Do you want to authorize this application to access your posts and contacts,"
-" and/or create new posts for you?"
-msgstr "¿Desea autorizar a esta aplicación a acceder a sus publicaciones y contactos, y/o crear nuevas publicaciones por usted?"
-
-#: ../../mod/openid.php:26
-msgid "OpenID protocol error. No ID returned."
-msgstr "Error del protocolo OpenID. Ningún ID recibido como respuesta."
-
-#: ../../mod/appman.php:28 ../../mod/appman.php:44
-msgid "App installed."
-msgstr "Aplicación instalada."
-
-#: ../../mod/appman.php:37
-msgid "Malformed app."
-msgstr "Aplicación con errores"
-
-#: ../../mod/appman.php:80
-msgid "Embed code"
-msgstr "Código incorporado"
-
-#: ../../mod/appman.php:86
-msgid "Edit App"
-msgstr "Modificar la aplicación"
-
-#: ../../mod/appman.php:86
-msgid "Create App"
-msgstr "Crear una aplicación"
-
-#: ../../mod/appman.php:91
-msgid "Name of app"
-msgstr "Nombre de la aplicación"
-
-#: ../../mod/appman.php:92
-msgid "Location (URL) of app"
-msgstr "Dirección (URL) de la aplicación"
-
-#: ../../mod/appman.php:93 ../../mod/events.php:457 ../../mod/rbmark.php:97
-msgid "Description"
-msgstr "Descripción"
-
-#: ../../mod/appman.php:94
-msgid "Photo icon URL"
-msgstr "Dirección del icono"
-
-#: ../../mod/appman.php:94
-msgid "80 x 80 pixels - optional"
-msgstr "80 x 80 pixels - opcional"
-
-#: ../../mod/appman.php:95
-msgid "Version ID"
-msgstr "Versión"
-
-#: ../../mod/appman.php:96
-msgid "Price of app"
-msgstr "Precio de la aplicación"
-
-#: ../../mod/appman.php:97
-msgid "Location (URL) to purchase app"
-msgstr "Dirección (URL) donde adquirir la aplicación"
-
-#: ../../mod/page.php:36 ../../mod/block.php:27
-msgid "Invalid item."
-msgstr "Elemento no válido."
-
-#: ../../mod/page.php:52 ../../mod/block.php:39 ../../mod/cal.php:61
-#: ../../mod/wall_upload.php:29
-msgid "Channel not found."
-msgstr "Canal no encontrado."
-
-#: ../../mod/page.php:129
-msgid ""
-"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod "
-"tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,"
-" quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo "
-"consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse "
-"cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat "
-"non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
-msgstr "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
-
-#: ../../mod/attach.php:9
-msgid "Item not available."
-msgstr "Elemento no disponible"
-
-#: ../../mod/pconfig.php:27 ../../mod/pconfig.php:60
-msgid "This setting requires special processing and editing has been blocked."
-msgstr "Este ajuste necesita de un proceso especial y la edición ha sido bloqueada."
-
-#: ../../mod/pconfig.php:49
-msgid "Configuration Editor"
-msgstr "Editor de configuración"
-
-#: ../../mod/pconfig.php:50
-msgid ""
-"Warning: Changing some settings could render your channel inoperable. Please"
-" leave this page unless you are comfortable with and knowledgeable about how"
-" to correctly use this feature."
-msgstr "Atención: El cambio de algunos ajustes puede volver inutilizable su canal. Por favor, abandone la página excepto que esté seguro y sepa cómo usar correctamente esta característica."
-
-#: ../../mod/pdledit.php:14
-msgid "Layout updated."
-msgstr "Plantilla actualizada."
-
-#: ../../mod/pdledit.php:30 ../../mod/pdledit.php:57
-msgid "Edit System Page Description"
-msgstr "Editor del Sistema de Descripción de Páginas"
-
-#: ../../mod/pdledit.php:52
-msgid "Layout not found."
-msgstr "Plantilla no encontrada"
-
-#: ../../mod/pdledit.php:58
-msgid "Module Name:"
-msgstr "Nombre del módulo:"
-
-#: ../../mod/pdledit.php:59
-msgid "Layout Help"
-msgstr "Ayuda para el diseño de plantillas de página"
-
-#: ../../mod/editpost.php:20 ../../mod/editblock.php:78
-#: ../../mod/editblock.php:94 ../../mod/editlayout.php:76
-#: ../../mod/editwebpage.php:77
-msgid "Item not found"
-msgstr "Elemento no encontrado"
-
-#: ../../mod/editpost.php:31
-msgid "Item is not editable"
-msgstr "El elemento no es editable"
-
-#: ../../mod/editpost.php:57
-msgid "Delete item?"
-msgstr "¿Borrar elemento?"
-
-#: ../../mod/editpost.php:123 ../../mod/editblock.php:146
-#: ../../mod/editlayout.php:144 ../../mod/editwebpage.php:186
-msgid "Insert YouTube video"
-msgstr "Insertar vídeo de YouTube"
-
-#: ../../mod/editpost.php:124 ../../mod/editblock.php:147
-#: ../../mod/editlayout.php:145 ../../mod/editwebpage.php:187
-msgid "Insert Vorbis [.ogg] video"
-msgstr "Insertar vídeo Vorbis [.ogg]"
-
-#: ../../mod/editpost.php:125 ../../mod/editblock.php:148
-#: ../../mod/editlayout.php:146 ../../mod/editwebpage.php:188
-msgid "Insert Vorbis [.ogg] audio"
-msgstr "Insertar audio Vorbis [.ogg]"
-
-#: ../../mod/editpost.php:166 ../../mod/rpost.php:128
-msgid "Edit post"
-msgstr "Editar la entrada"
-
-#: ../../mod/photos.php:79
-msgid "Page owner information could not be retrieved."
-msgstr "La información del propietario de la página no pudo ser recuperada."
-
-#: ../../mod/photos.php:100 ../../mod/photos.php:144
-msgid "Album not found."
-msgstr "Álbum no encontrado."
-
-#: ../../mod/photos.php:127
-msgid "Delete Album"
-msgstr "Borrar álbum"
-
-#: ../../mod/photos.php:148
-msgid ""
-"Multiple storage folders exist with this album name, but within different "
-"directories. Please remove the desired folder or folders using the Files "
-"manager"
-msgstr "Hay varias carpetas con este nombre de álbum, pero dentro de diferentes directorios. Por favor, elimine la carpeta o carpetas que desee utilizando el administrador de ficheros"
-
-#: ../../mod/photos.php:205 ../../mod/photos.php:1048
-msgid "Delete Photo"
-msgstr "Borrar foto"
-
-#: ../../mod/photos.php:517 ../../mod/directory.php:59
-#: ../../mod/display.php:17 ../../mod/ratings.php:82 ../../mod/search.php:13
-#: ../../mod/viewconnections.php:17
-msgid "Public access denied."
-msgstr "Acceso público denegado."
-
-#: ../../mod/photos.php:528
-msgid "No photos selected"
-msgstr "No hay fotos seleccionadas"
-
-#: ../../mod/photos.php:577
-msgid "Access to this item is restricted."
-msgstr "El acceso a este elemento está restringido."
-
-#: ../../mod/photos.php:616
-#, php-format
-msgid "%1$.2f MB of %2$.2f MB photo storage used."
-msgstr "%1$.2f MB de %2$.2f MB de almacenamiento de fotos utilizado."
-
-#: ../../mod/photos.php:619
-#, php-format
-msgid "%1$.2f MB photo storage used."
-msgstr "%1$.2f MB de almacenamiento de fotos utilizado."
-
-#: ../../mod/photos.php:655
-msgid "Upload Photos"
-msgstr "Subir fotos"
-
-#: ../../mod/photos.php:659
-msgid "Enter an album name"
-msgstr "Introducir un nombre de álbum"
-
-#: ../../mod/photos.php:660
-msgid "or select an existing album (doubleclick)"
-msgstr "o seleccionar uno existente (doble click)"
-
-#: ../../mod/photos.php:661
-msgid "Create a status post for this upload"
-msgstr "Crear un mensaje de estado para esta subida"
-
-#: ../../mod/photos.php:662
-msgid "Caption (optional):"
-msgstr "Título (opcional):"
-
-#: ../../mod/photos.php:663
-msgid "Description (optional):"
-msgstr "Descripción (opcional):"
-
-#: ../../mod/photos.php:690
-msgid "Album name could not be decoded"
-msgstr "El nombre del álbum no ha podido ser descifrado"
-
-#: ../../mod/photos.php:738 ../../mod/photos.php:1278
-#: ../../mod/photos.php:1295
-msgid "Contact Photos"
-msgstr "Fotos de contacto"
-
-#: ../../mod/photos.php:761
-msgid "Show Newest First"
-msgstr "Mostrar lo más reciente primero"
-
-#: ../../mod/photos.php:763
-msgid "Show Oldest First"
-msgstr "Mostrar lo más antiguo primero"
-
-#: ../../mod/photos.php:865
-msgid "Permission denied. Access to this item may be restricted."
-msgstr "Permiso denegado. El acceso a este elemento puede estar restringido."
-
-#: ../../mod/photos.php:867
-msgid "Photo not available"
-msgstr "Foto no disponible"
-
-#: ../../mod/photos.php:925
-msgid "Use as profile photo"
-msgstr "Usar como foto del perfil"
-
-#: ../../mod/photos.php:926
-msgid "Use as cover photo"
-msgstr "Usar como imagen de portada del perfil"
-
-#: ../../mod/photos.php:933
-msgid "Private Photo"
-msgstr "Foto privada"
-
-#: ../../mod/photos.php:944 ../../mod/cal.php:331 ../../mod/cal.php:338
-#: ../../mod/events.php:659 ../../mod/events.php:666
-msgid "Previous"
-msgstr "Anterior"
-
-#: ../../mod/photos.php:948
-msgid "View Full Size"
-msgstr "Ver tamaño completo"
-
-#: ../../mod/photos.php:953 ../../mod/cal.php:332 ../../mod/cal.php:339
-#: ../../mod/events.php:660 ../../mod/events.php:667 ../../mod/setup.php:291
-msgid "Next"
-msgstr "Siguiente"
-
-#: ../../mod/photos.php:993 ../../mod/tagrm.php:133
-msgid "Remove"
-msgstr "Eliminar"
-
-#: ../../mod/photos.php:1027
-msgid "Edit photo"
-msgstr "Editar foto"
-
-#: ../../mod/photos.php:1029
-msgid "Rotate CW (right)"
-msgstr "Girar CW (a la derecha)"
-
-#: ../../mod/photos.php:1030
-msgid "Rotate CCW (left)"
-msgstr "Girar CCW (a la izquierda)"
-
-#: ../../mod/photos.php:1033
-msgid "Enter a new album name"
-msgstr "Introducir un nuevo nombre de álbum"
-
-#: ../../mod/photos.php:1034
-msgid "or select an existing one (doubleclick)"
-msgstr "o seleccionar uno (doble click) existente"
-
-#: ../../mod/photos.php:1037
-msgid "Caption"
-msgstr "Título"
-
-#: ../../mod/photos.php:1039
-msgid "Add a Tag"
-msgstr "Añadir una etiqueta"
-
-#: ../../mod/photos.php:1043
-msgid "Example: @bob, @Barbara_Jensen, @jim@example.com"
-msgstr "Ejemplos: @eva, @Carmen_Osuna, @jaime@ejemplo.com"
-
-#: ../../mod/photos.php:1046
-msgid "Flag as adult in album view"
-msgstr "Marcar como \"solo para adultos\" en el álbum"
-
-#: ../../mod/photos.php:1238
-msgid "In This Photo:"
-msgstr "En esta foto:"
-
-#: ../../mod/photos.php:1243
-msgid "Map"
-msgstr "Mapa"
-
-#: ../../mod/photos.php:1334
-msgid "View Album"
-msgstr "Ver álbum"
-
-#: ../../mod/photos.php:1345 ../../mod/photos.php:1358
-#: ../../mod/photos.php:1359
-msgid "Recent Photos"
-msgstr "Fotos recientes"
-
-#: ../../mod/bookmarks.php:49
-msgid "Bookmark added"
-msgstr "Marcador añadido"
-
-#: ../../mod/bookmarks.php:71
-msgid "My Bookmarks"
-msgstr "Mis marcadores"
-
-#: ../../mod/bookmarks.php:82
-msgid "My Connections Bookmarks"
-msgstr "Marcadores de mis conexiones"
-
-#: ../../mod/mitem.php:24 ../../mod/menu.php:140
-msgid "Menu not found."
-msgstr "Menú no encontrado"
-
-#: ../../mod/mitem.php:48
-msgid "Unable to create element."
-msgstr "Imposible crear el elemento."
-
-#: ../../mod/mitem.php:72
-msgid "Unable to update menu element."
-msgstr "No es posible actualizar el elemento del menú."
-
-#: ../../mod/mitem.php:88
-msgid "Unable to add menu element."
-msgstr "No es posible añadir el elemento al menú"
-
-#: ../../mod/mitem.php:116 ../../mod/menu.php:162 ../../mod/xchan.php:37
-msgid "Not found."
-msgstr "No encontrado."
-
-#: ../../mod/mitem.php:149 ../../mod/mitem.php:222
-msgid "Menu Item Permissions"
-msgstr "Permisos del elemento del menú"
-
-#: ../../mod/mitem.php:150 ../../mod/mitem.php:223 ../../mod/settings.php:1075
-msgid "(click to open/close)"
-msgstr "(pulsar para abrir o cerrar)"
-
-#: ../../mod/mitem.php:152 ../../mod/mitem.php:168
-msgid "Link Name"
-msgstr "Nombre del enlace"
-
-#: ../../mod/mitem.php:153 ../../mod/mitem.php:227
-msgid "Link or Submenu Target"
-msgstr "Destino del enlace o submenú"
-
-#: ../../mod/mitem.php:153
-msgid "Enter URL of the link or select a menu name to create a submenu"
-msgstr "Introducir la dirección del enlace o seleccionar el nombre de un submenú"
-
-#: ../../mod/mitem.php:154 ../../mod/mitem.php:228
-msgid "Use magic-auth if available"
-msgstr "Usar la autenticación mágica si está disponible"
-
-#: ../../mod/mitem.php:155 ../../mod/mitem.php:229
-msgid "Open link in new window"
-msgstr "Abrir el enlace en una nueva ventana"
-
-#: ../../mod/mitem.php:156 ../../mod/mitem.php:230
-msgid "Order in list"
-msgstr "Orden en la lista"
-
-#: ../../mod/mitem.php:156 ../../mod/mitem.php:230
-msgid "Higher numbers will sink to bottom of listing"
-msgstr "Los números más altos irán al final de la lista"
-
-#: ../../mod/mitem.php:157
-msgid "Submit and finish"
-msgstr "Enviar y terminar"
-
-#: ../../mod/mitem.php:158
-msgid "Submit and continue"
-msgstr "Enviar y continuar"
-
-#: ../../mod/mitem.php:166
-msgid "Menu:"
-msgstr "Menú:"
-
-#: ../../mod/mitem.php:169
-msgid "Link Target"
-msgstr "Destino del enlace"
-
-#: ../../mod/mitem.php:172
-msgid "Edit menu"
-msgstr "Editar menú"
-
-#: ../../mod/mitem.php:175
-msgid "Edit element"
-msgstr "Editar el elemento"
-
-#: ../../mod/mitem.php:176
-msgid "Drop element"
-msgstr "Eliminar el elemento"
-
-#: ../../mod/mitem.php:177
-msgid "New element"
-msgstr "Nuevo elemento"
-
-#: ../../mod/mitem.php:178
-msgid "Edit this menu container"
-msgstr "Modificar el contenedor del menú"
-
-#: ../../mod/mitem.php:179
-msgid "Add menu element"
-msgstr "Añadir un elemento al menú"
-
-#: ../../mod/mitem.php:180
-msgid "Delete this menu item"
-msgstr "Eliminar este elemento del menú"
-
-#: ../../mod/mitem.php:181
-msgid "Edit this menu item"
-msgstr "Modificar este elemento del menú"
-
-#: ../../mod/mitem.php:198
-msgid "Menu item not found."
-msgstr "Este elemento del menú no se ha encontrado"
-
-#: ../../mod/mitem.php:211
-msgid "Menu item deleted."
-msgstr "Este elemento del menú ha sido borrado"
-
-#: ../../mod/mitem.php:213
-msgid "Menu item could not be deleted."
-msgstr "Este elemento del menú no puede ser borrado."
-
-#: ../../mod/mitem.php:220
-msgid "Edit Menu Element"
-msgstr "Editar elemento del menú"
-
-#: ../../mod/mitem.php:226
-msgid "Link text"
-msgstr "Texto del enlace"
-
-#: ../../mod/ping.php:260
-msgid "sent you a private message"
-msgstr "le ha enviado un mensaje privado"
-
-#: ../../mod/ping.php:308
-msgid "added your channel"
-msgstr "añadió este canal a sus conexiones"
-
-#: ../../mod/ping.php:350
-msgid "posted an event"
-msgstr "publicó un evento"
-
-#: ../../mod/cal.php:68
-msgid "Permissions denied."
-msgstr "Permisos denegados."
-
-#: ../../mod/cal.php:258 ../../mod/events.php:581
-msgid "l, F j"
-msgstr "l j F"
-
-#: ../../mod/cal.php:330 ../../mod/events.php:658
-msgid "Edit Event"
-msgstr "Editar el evento"
-
-#: ../../mod/cal.php:330 ../../mod/events.php:658
-msgid "Create Event"
-msgstr "Crear un evento"
-
-#: ../../mod/cal.php:340 ../../mod/events.php:668
-msgid "Today"
-msgstr "Hoy"
-
-#: ../../mod/channel.php:25 ../../mod/chat.php:19
-msgid "You must be logged in to see this page."
-msgstr "Debe haber iniciado sesión para poder ver esta página."
-
-#: ../../mod/channel.php:37
-msgid "Posts and comments"
-msgstr "Publicaciones y comentarios"
-
-#: ../../mod/channel.php:38
-msgid "Only posts"
-msgstr "Solo publicaciones"
-
-#: ../../mod/channel.php:98
-msgid "Insufficient permissions. Request redirected to profile page."
-msgstr "Permisos insuficientes. Petición redirigida a la página del perfil."
-
-#: ../../mod/channel.php:132 ../../mod/network.php:169 ../../mod/rpost.php:114
-msgid "Public"
-msgstr "Público"
-
-#: ../../mod/poke.php:165
-msgid "Poke somebody"
-msgstr "Dar un toque a alguien"
-
-#: ../../mod/poke.php:168
-msgid "Poke/Prod"
-msgstr "Toque/Incitación"
-
-#: ../../mod/poke.php:169
-msgid "Poke, prod or do other things to somebody"
-msgstr "Dar un toque, incitar o hacer otras cosas a alguien"
-
-#: ../../mod/poke.php:176
-msgid "Recipient"
-msgstr "Destinatario"
-
-#: ../../mod/poke.php:177
-msgid "Choose what you wish to do to recipient"
-msgstr "Elegir qué desea enviar al destinatario"
-
-#: ../../mod/poke.php:180 ../../mod/poke.php:181
-msgid "Make this post private"
-msgstr "Convertir en privado este envío"
-
-#: ../../mod/chat.php:175
-msgid "Room not found"
-msgstr "Sala no encontrada"
-
-#: ../../mod/chat.php:191
-msgid "Leave Room"
-msgstr "Abandonar la sala"
-
-#: ../../mod/chat.php:192
-msgid "Delete Room"
-msgstr "Eliminar esta sala"
-
-#: ../../mod/chat.php:193
-msgid "I am away right now"
-msgstr "Estoy ausente momentáneamente"
-
-#: ../../mod/chat.php:194
-msgid "I am online"
-msgstr "Estoy conectado/a"
-
-#: ../../mod/chat.php:196
-msgid "Bookmark this room"
-msgstr "Añadir esta sala a Marcadores"
-
-#: ../../mod/chat.php:212
-msgid "Feature disabled."
-msgstr "Funcionalidad deshabilitada."
-
-#: ../../mod/chat.php:226
-msgid "New Chatroom"
-msgstr "Nueva sala de chat"
-
-#: ../../mod/chat.php:227
-msgid "Chatroom name"
-msgstr "Nombre de la sala de chat"
-
-#: ../../mod/chat.php:228
-msgid "Expiration of chats (minutes)"
-msgstr "Caducidad de los mensajes en los chats (en minutos)"
-
-#: ../../mod/chat.php:240
-#, php-format
-msgid "%1$s's Chatrooms"
-msgstr "Salas de chat de %1$s"
-
-#: ../../mod/chat.php:245
-msgid "No chatrooms available"
-msgstr "No hay salas de chat disponibles"
-
-#: ../../mod/chat.php:246 ../../mod/profiles.php:777 ../../mod/manage.php:137
-msgid "Create New"
-msgstr "Crear"
-
-#: ../../mod/chat.php:249
-msgid "Expiration"
-msgstr "Caducidad"
-
-#: ../../mod/chat.php:250
-msgid "min"
-msgstr "min"
-
-#: ../../mod/chatsvc.php:111
-msgid "Away"
-msgstr "Ausente"
-
-#: ../../mod/chatsvc.php:116
-msgid "Online"
-msgstr "Conectado/a"
-
-#: ../../mod/probe.php:24 ../../mod/probe.php:30
-#, php-format
-msgid "Fetching URL returns error: %1$s"
-msgstr "Al intentar obtener la dirección, retorna el error: %1$s"
-
-#: ../../mod/common.php:10
-msgid "No channel."
-msgstr "Ningún canal."
-
-#: ../../mod/common.php:39
-msgid "Common connections"
-msgstr "Conexiones comunes"
-
-#: ../../mod/common.php:44
-msgid "No connections in common."
-msgstr "Ninguna conexión en común."
-
-#: ../../mod/connect.php:56 ../../mod/connect.php:104
-msgid "Continue"
-msgstr "Continuar"
-
-#: ../../mod/connect.php:85
-msgid "Premium Channel Setup"
-msgstr "Configuración del canal premium"
-
-#: ../../mod/connect.php:87
-msgid "Enable premium channel connection restrictions"
-msgstr "Habilitar restricciones de conexión del canal premium"
-
-#: ../../mod/connect.php:88
-msgid ""
-"Please enter your restrictions or conditions, such as paypal receipt, usage "
-"guidelines, etc."
-msgstr "Por favor introduzca sus restricciones o condiciones, como recibo de paypal, normas de uso, etc."
-
-#: ../../mod/connect.php:90 ../../mod/connect.php:110
-msgid ""
-"This channel may require additional steps or acknowledgement of the "
-"following conditions prior to connecting:"
-msgstr "Este canal puede requerir antes de conectar unos pasos adicionales o el conocimiento de las siguientes condiciones:"
-
-#: ../../mod/connect.php:91
-msgid ""
-"Potential connections will then see the following text before proceeding:"
-msgstr "Las posibles conexiones verán, por tanto, el siguiente texto antes de proceder:"
-
-#: ../../mod/connect.php:92 ../../mod/connect.php:113
-msgid ""
-"By continuing, I certify that I have complied with any instructions provided"
-" on this page."
-msgstr "Al continuar, certifico que he cumplido con todas las instrucciones proporcionadas en esta página."
-
-#: ../../mod/connect.php:101
-msgid "(No specific instructions have been provided by the channel owner.)"
-msgstr "(No ha sido proporcionada ninguna instrucción específica por el propietario del canal.)"
-
-#: ../../mod/connect.php:109
-msgid "Restricted or Premium Channel"
-msgstr "Canal premium o restringido"
-
-#: ../../mod/mood.php:132
-msgid "Set your current mood and tell your friends"
-msgstr "Describir su estado de ánimo para comunicárselo a sus amigos"
-
-#: ../../mod/connections.php:52 ../../mod/connections.php:157
-#: ../../mod/connections.php:238
-msgid "Blocked"
-msgstr "Bloqueadas"
-
-#: ../../mod/connections.php:57 ../../mod/connections.php:164
-#: ../../mod/connections.php:237
-msgid "Ignored"
-msgstr "Ignoradas"
-
-#: ../../mod/connections.php:62 ../../mod/connections.php:178
-#: ../../mod/connections.php:236
-msgid "Hidden"
-msgstr "Ocultas"
-
-#: ../../mod/connections.php:67 ../../mod/connections.php:171
-#: ../../mod/connections.php:235
-msgid "Archived"
-msgstr "Archivadas"
-
-#: ../../mod/connections.php:134
-msgid "New Connections"
-msgstr "Nuevas conexiones"
-
-#: ../../mod/connections.php:137
-msgid "Show pending (new) connections"
-msgstr "Mostrar conexiones (nuevas) pendientes"
-
-#: ../../mod/connections.php:141 ../../mod/profperm.php:139
-msgid "All Connections"
-msgstr "Todas las conexiones"
-
-#: ../../mod/connections.php:144
-msgid "Show all connections"
-msgstr "Mostrar todas las conexiones"
-
-#: ../../mod/connections.php:160
-msgid "Only show blocked connections"
-msgstr "Mostrar solo las conexiones bloqueadas"
-
-#: ../../mod/connections.php:167
-msgid "Only show ignored connections"
-msgstr "Mostrar solo conexiones ignoradas"
-
-#: ../../mod/connections.php:174
-msgid "Only show archived connections"
-msgstr "Mostrar solo las conexiones archivadas"
-
-#: ../../mod/connections.php:181
-msgid "Only show hidden connections"
-msgstr "Mostrar solo las conexiones ocultas"
-
-#: ../../mod/connections.php:234
-msgid "Pending approval"
-msgstr "Pendiente de aprobación"
-
-#: ../../mod/connections.php:250
-#, php-format
-msgid "%1$s [%2$s]"
-msgstr "%1$s [%2$s]"
-
-#: ../../mod/connections.php:251
-msgid "Edit connection"
-msgstr "Editar conexión"
-
-#: ../../mod/connections.php:252
-msgid "Delete connection"
-msgstr "Eliminar conexión"
-
-#: ../../mod/connections.php:261
-msgid "Channel address"
-msgstr "Dirección del canal"
-
-#: ../../mod/connections.php:263
-msgid "Network"
-msgstr "Red"
-
-#: ../../mod/connections.php:268
-msgid "Connected"
-msgstr "Conectado/a"
-
-#: ../../mod/connections.php:270
-msgid "Approve connection"
-msgstr "Aprobar esta conexión"
-
-#: ../../mod/connections.php:272
-msgid "Ignore connection"
-msgstr "Ignorar esta conexión"
-
-#: ../../mod/connections.php:273 ../../mod/connedit.php:545
-#: ../../mod/notifications.php:51
-msgid "Ignore"
-msgstr "Ignorar"
-
-#: ../../mod/connections.php:274
-msgid "Recent activity"
-msgstr "Actividad reciente"
-
-#: ../../mod/connections.php:303
-msgid "Search your connections"
-msgstr "Buscar sus conexiones"
-
-#: ../../mod/connections.php:304
-msgid "Connections search"
-msgstr "Buscar conexiones"
-
-#: ../../mod/profile_photo.php:112 ../../mod/cover_photo.php:54
-msgid "Image uploaded but image cropping failed."
-msgstr "Imagen actualizada, pero el recorte de la imagen ha fallado. "
-
-#: ../../mod/profile_photo.php:166 ../../mod/cover_photo.php:150
-msgid "Image resize failed."
-msgstr "El ajuste del tamaño de la imagen ha fallado."
-
-#: ../../mod/profile_photo.php:212
-msgid ""
-"Shift-reload the page or clear browser cache if the new photo does not "
-"display immediately."
-msgstr "Recargue la página o limpie el caché del navegador si la nueva foto no se muestra inmediatamente."
-
-#: ../../mod/profile_photo.php:250 ../../mod/cover_photo.php:188
-msgid "Image upload failed."
-msgstr "La carga de la imagen ha fallado."
-
-#: ../../mod/profile_photo.php:269 ../../mod/cover_photo.php:206
-msgid "Unable to process image."
-msgstr "No ha sido posible procesar la imagen."
-
-#: ../../mod/profile_photo.php:316 ../../mod/profile_photo.php:357
-#: ../../mod/cover_photo.php:299 ../../mod/cover_photo.php:314
-msgid "Photo not available."
-msgstr "Foto no disponible."
-
-#: ../../mod/profile_photo.php:398 ../../mod/cover_photo.php:350
-msgid "Upload File:"
-msgstr "Subir fichero:"
-
-#: ../../mod/profile_photo.php:399 ../../mod/cover_photo.php:351
-msgid "Select a profile:"
-msgstr "Seleccionar un perfil:"
-
-#: ../../mod/profile_photo.php:400
-msgid "Upload Profile Photo"
-msgstr "Subir foto de perfil"
-
-#: ../../mod/profile_photo.php:407 ../../mod/cover_photo.php:357
-#: ../../mod/settings.php:992
-msgid "or"
-msgstr "o"
-
-#: ../../mod/profile_photo.php:407 ../../mod/cover_photo.php:357
-msgid "skip this step"
-msgstr "Omitir este paso"
-
-#: ../../mod/profile_photo.php:407 ../../mod/cover_photo.php:357
-msgid "select a photo from your photo albums"
-msgstr "Seleccione una foto de sus álbumes de fotos"
-
-#: ../../mod/profile_photo.php:423 ../../mod/cover_photo.php:373
-msgid "Crop Image"
-msgstr "Recortar imagen"
-
-#: ../../mod/profile_photo.php:424 ../../mod/cover_photo.php:374
-msgid "Please adjust the image cropping for optimum viewing."
-msgstr "Por favor ajuste el recorte de la imagen para una visión óptima."
-
-#: ../../mod/profile_photo.php:426 ../../mod/cover_photo.php:376
-msgid "Done Editing"
-msgstr "Edición completada"
-
-#: ../../mod/connedit.php:75
-msgid "Could not access contact record."
-msgstr "No se ha podido acceder al registro de contacto."
-
-#: ../../mod/connedit.php:99
-msgid "Could not locate selected profile."
-msgstr "No se ha podido localizar el perfil seleccionado."
-
-#: ../../mod/connedit.php:223
-msgid "Connection updated."
-msgstr "Conexión actualizada."
-
-#: ../../mod/connedit.php:225
-msgid "Failed to update connection record."
-msgstr "Error al actualizar el registro de la conexión."
-
-#: ../../mod/connedit.php:272
-msgid "is now connected to"
-msgstr "ahora está conectado/a"
-
-#: ../../mod/connedit.php:407
-msgid "Could not access address book record."
-msgstr "No se pudo acceder al registro en su libreta de direcciones."
-
-#: ../../mod/connedit.php:421
-msgid "Refresh failed - channel is currently unavailable."
-msgstr "Recarga fallida - no se puede encontrar el canal en este momento."
-
-#: ../../mod/connedit.php:436 ../../mod/connedit.php:445
-#: ../../mod/connedit.php:454 ../../mod/connedit.php:463
-#: ../../mod/connedit.php:476
-msgid "Unable to set address book parameters."
-msgstr "No ha sido posible establecer los parámetros de la libreta de direcciones."
-
-#: ../../mod/connedit.php:500
-msgid "Connection has been removed."
-msgstr "La conexión ha sido eliminada."
-
-#: ../../mod/connedit.php:519
-#, php-format
-msgid "View %s's profile"
-msgstr "Ver el perfil de %s"
-
-#: ../../mod/connedit.php:523
-msgid "Refresh Permissions"
-msgstr "Recargar los permisos"
-
-#: ../../mod/connedit.php:526
-msgid "Fetch updated permissions"
-msgstr "Obtener los permisos actualizados"
-
-#: ../../mod/connedit.php:530
-msgid "Recent Activity"
-msgstr "Actividad reciente"
-
-#: ../../mod/connedit.php:533
-msgid "View recent posts and comments"
-msgstr "Ver publicaciones y comentarios recientes"
-
-#: ../../mod/connedit.php:540
-msgid "Block (or Unblock) all communications with this connection"
-msgstr "Bloquear (o desbloquear) todas las comunicaciones con esta conexión"
-
-#: ../../mod/connedit.php:541
-msgid "This connection is blocked!"
-msgstr "¡Esta conexión está bloqueada!"
-
-#: ../../mod/connedit.php:545
-msgid "Unignore"
-msgstr "Dejar de ignorar"
-
-#: ../../mod/connedit.php:548
-msgid "Ignore (or Unignore) all inbound communications from this connection"
-msgstr "Ignorar (o dejar de ignorar) todas las comunicaciones entrantes de esta conexión"
-
-#: ../../mod/connedit.php:549
-msgid "This connection is ignored!"
-msgstr "¡Esta conexión es ignorada!"
-
-#: ../../mod/connedit.php:553
-msgid "Unarchive"
-msgstr "Desarchivar"
-
-#: ../../mod/connedit.php:553
-msgid "Archive"
-msgstr "Archivar"
-
-#: ../../mod/connedit.php:556
-msgid ""
-"Archive (or Unarchive) this connection - mark channel dead but keep content"
-msgstr "Archiva (o desarchiva) esta conexión - marca el canal como muerto aunque mantiene sus contenidos"
-
-#: ../../mod/connedit.php:557
-msgid "This connection is archived!"
-msgstr "¡Esta conexión esta archivada!"
-
-#: ../../mod/connedit.php:561
-msgid "Unhide"
-msgstr "Mostrar"
-
-#: ../../mod/connedit.php:561
-msgid "Hide"
-msgstr "Ocultar"
-
-#: ../../mod/connedit.php:564
-msgid "Hide or Unhide this connection from your other connections"
-msgstr "Ocultar o mostrar esta conexión a sus otras conexiones"
-
-#: ../../mod/connedit.php:565
-msgid "This connection is hidden!"
-msgstr "¡Esta conexión está oculta!"
-
-#: ../../mod/connedit.php:572
-msgid "Delete this connection"
-msgstr "Eliminar esta conexión"
-
-#: ../../mod/connedit.php:653
-msgid "Approve this connection"
-msgstr "Aprobar esta conexión"
-
-#: ../../mod/connedit.php:653
-msgid "Accept connection to allow communication"
-msgstr "Aceptar la conexión para permitir la comunicación"
-
-#: ../../mod/connedit.php:658
-msgid "Set Affinity"
-msgstr "Ajustar la afinidad"
-
-#: ../../mod/connedit.php:661
-msgid "Set Profile"
-msgstr "Ajustar el perfil"
-
-#: ../../mod/connedit.php:664
-msgid "Set Affinity & Profile"
-msgstr "Ajustar la afinidad y el perfil"
-
-#: ../../mod/connedit.php:697
-msgid "none"
-msgstr "-"
-
-#: ../../mod/connedit.php:702
-msgid "Apply these permissions automatically"
-msgstr "Aplicar estos permisos automaticamente"
-
-#: ../../mod/connedit.php:702
-msgid "Connection requests will be approved without your interaction"
-msgstr "Las solicitudes de conexión serán aprobadas sin su intervención"
-
-#: ../../mod/connedit.php:704
-msgid "This connection's primary address is"
-msgstr "La dirección primaria de esta conexión es"
-
-#: ../../mod/connedit.php:705
-msgid "Available locations:"
-msgstr "Ubicaciones disponibles:"
-
-#: ../../mod/connedit.php:709
-msgid ""
-"The permissions indicated on this page will be applied to all new "
-"connections."
-msgstr "Los permisos indicados en esta página serán aplicados en todas las nuevas conexiones."
-
-#: ../../mod/connedit.php:711
-msgid "Slide to adjust your degree of friendship"
-msgstr "Deslizar para ajustar el grado de amistad"
-
-#: ../../mod/connedit.php:713
-msgid "Slide to adjust your rating"
-msgstr "Deslizar para ajustar su valoración"
-
-#: ../../mod/connedit.php:714 ../../mod/connedit.php:719
-msgid "Optionally explain your rating"
-msgstr "Opcionalmente, puede explicar su valoración"
-
-#: ../../mod/connedit.php:716
-msgid "Custom Filter"
-msgstr "Filtro personalizado"
-
-#: ../../mod/connedit.php:717
-msgid "Only import posts with this text"
-msgstr "Importar solo entradas que contengan este texto"
-
-#: ../../mod/connedit.php:717 ../../mod/connedit.php:718
-msgid ""
-"words one per line or #tags or /patterns/ or lang=xx, leave blank to import "
-"all posts"
-msgstr "Una sola opción por línea: palabras, #etiquetas, /patrones/ o lang=xx. Dejar en blanco para importarlo todo"
-
-#: ../../mod/connedit.php:718
-msgid "Do not import posts with this text"
-msgstr "No importar entradas que contengan este texto"
-
-#: ../../mod/connedit.php:720
-msgid "This information is public!"
-msgstr "¡Esta información es pública!"
-
-#: ../../mod/connedit.php:725
-msgid "Connection Pending Approval"
-msgstr "Conexión pendiente de aprobación"
-
-#: ../../mod/connedit.php:728
-msgid "inherited"
-msgstr "heredado"
-
-#: ../../mod/connedit.php:730
-#, php-format
-msgid ""
-"Please choose the profile you would like to display to %s when viewing your "
-"profile securely."
-msgstr "Por favor, escoja el perfil que quiere mostrar a %s cuando esté viendo su perfil de forma segura."
-
-#: ../../mod/connedit.php:732
-msgid "Their Settings"
-msgstr "Sus ajustes"
-
-#: ../../mod/connedit.php:733
-msgid "My Settings"
-msgstr "Mis ajustes"
-
-#: ../../mod/connedit.php:735
-msgid "Individual Permissions"
-msgstr "Permisos individuales"
-
-#: ../../mod/connedit.php:736
-msgid ""
-"Some permissions may be inherited from your channel's <a "
-"href=\"settings\"><strong>privacy settings</strong></a>, which have higher "
-"priority than individual settings. You can <strong>not</strong> change those"
-" settings here."
-msgstr "Algunos permisos pueden ser heredados de los <a href=\"settings\"><strong>ajustes de privacidad</strong></a> de sus canales, los cuales tienen una prioridad más alta que los ajustes individuales. <strong>No</strong> puede cambiar estos ajustes aquí."
-
-#: ../../mod/connedit.php:737
-msgid ""
-"Some permissions may be inherited from your channel's <a "
-"href=\"settings\"><strong>privacy settings</strong></a>, which have higher "
-"priority than individual settings. You can change those settings here but "
-"they wont have any impact unless the inherited setting changes."
-msgstr "Algunos permisos pueden ser heredados de los <a href=\"settings\"><strong>ajustes de privacidad</strong></a> de sus canales, los cuales tienen una prioridad más alta que los ajustes individuales. Puede cambiar estos ajustes aquí, pero no tendrán ningún consecuencia hasta que cambie los ajustes heredados."
-
-#: ../../mod/connedit.php:738
-msgid "Last update:"
-msgstr "Última actualización:"
-
-#: ../../mod/network.php:91
-msgid "No such group"
-msgstr "No se encuentra el grupo"
-
-#: ../../mod/network.php:131
-msgid "No such channel"
-msgstr "No se encuentra el canal"
-
-#: ../../mod/network.php:136
-msgid "forum"
-msgstr "foro"
-
-#: ../../mod/network.php:148
-msgid "Search Results For:"
-msgstr "Buscar resultados para:"
-
-#: ../../mod/network.php:212
-msgid "Privacy group is empty"
-msgstr "El grupo de canales está vacío"
-
-#: ../../mod/network.php:221
-msgid "Privacy group: "
-msgstr "Grupo de canales: "
-
-#: ../../mod/network.php:247
-msgid "Invalid connection."
-msgstr "Conexión no válida."
-
-#: ../../mod/cover_photo.php:130 ../../mod/cover_photo.php:177
-msgid "Cover Photos"
-msgstr "Imágenes de portada del perfil"
-
-#: ../../mod/cover_photo.php:352
-msgid "Upload Cover Photo"
-msgstr "Subir imagen de portada del perfil"
-
-#: ../../mod/profiles.php:19 ../../mod/profiles.php:184
-#: ../../mod/profiles.php:241 ../../mod/profiles.php:620
-msgid "Profile not found."
-msgstr "Perfil no encontrado."
-
-#: ../../mod/profiles.php:39
-msgid "Profile deleted."
-msgstr "Perfil eliminado."
-
-#: ../../mod/profiles.php:63 ../../mod/profiles.php:99
-msgid "Profile-"
-msgstr "Perfil-"
-
-#: ../../mod/profiles.php:84 ../../mod/profiles.php:127
-msgid "New profile created."
-msgstr "El nuevo perfil ha sido creado."
-
-#: ../../mod/profiles.php:105
-msgid "Profile unavailable to clone."
-msgstr "Perfil no disponible para clonar."
-
-#: ../../mod/profiles.php:146
-msgid "Profile unavailable to export."
-msgstr "Perfil no disponible para exportar."
-
-#: ../../mod/profiles.php:251
-msgid "Profile Name is required."
-msgstr "Se necesita el nombre del perfil."
-
-#: ../../mod/profiles.php:422
-msgid "Marital Status"
-msgstr "Estado civil"
-
-#: ../../mod/profiles.php:426
-msgid "Romantic Partner"
-msgstr "Pareja sentimental"
-
-#: ../../mod/profiles.php:430 ../../mod/profiles.php:735
-msgid "Likes"
-msgstr "Me gusta"
-
-#: ../../mod/profiles.php:434 ../../mod/profiles.php:736
-msgid "Dislikes"
-msgstr "No me gusta"
-
-#: ../../mod/profiles.php:438 ../../mod/profiles.php:743
-msgid "Work/Employment"
-msgstr "Trabajo:"
-
-#: ../../mod/profiles.php:441
-msgid "Religion"
-msgstr "Religión"
-
-#: ../../mod/profiles.php:445
-msgid "Political Views"
-msgstr "Ideas políticas"
-
-#: ../../mod/profiles.php:449 ../../mod/id.php:33
-msgid "Gender"
-msgstr "Género"
-
-#: ../../mod/profiles.php:453
-msgid "Sexual Preference"
-msgstr "Preferencia sexual"
-
-#: ../../mod/profiles.php:457
-msgid "Homepage"
-msgstr "Página personal"
-
-#: ../../mod/profiles.php:461
-msgid "Interests"
-msgstr "Intereses"
-
-#: ../../mod/profiles.php:555
-msgid "Profile updated."
-msgstr "Perfil actualizado."
-
-#: ../../mod/profiles.php:644
-msgid "Hide your connections list from viewers of this profile"
-msgstr "Ocultar la lista de conexiones a los visitantes del perfil"
-
-#: ../../mod/profiles.php:686
-msgid "Edit Profile Details"
-msgstr "Modificar los detalles de este perfil"
-
-#: ../../mod/profiles.php:688
-msgid "View this profile"
-msgstr "Ver este perfil"
-
-#: ../../mod/profiles.php:690
-msgid "Change cover photo"
-msgstr "Cambiar la imagen de portada del perfil"
-
-#: ../../mod/profiles.php:692
-msgid "Create a new profile using these settings"
-msgstr "Crear un nuevo perfil usando estos ajustes"
-
-#: ../../mod/profiles.php:693
-msgid "Clone this profile"
-msgstr "Clonar este perfil"
-
-#: ../../mod/profiles.php:694
-msgid "Delete this profile"
-msgstr "Eliminar este perfil"
-
-#: ../../mod/profiles.php:695
-msgid "Add profile things"
-msgstr "Añadir cosas al perfil"
-
-#: ../../mod/profiles.php:698
-msgid "Relation"
-msgstr "Relación"
-
-#: ../../mod/profiles.php:701
-msgid "Import profile from file"
-msgstr "Importar perfil desde un fichero"
-
-#: ../../mod/profiles.php:702
-msgid "Export profile to file"
-msgstr "Exportar perfil a un fichero"
-
-#: ../../mod/profiles.php:703
-msgid "Your gender"
-msgstr "Género"
-
-#: ../../mod/profiles.php:704
-msgid "Marital status"
-msgstr "Estado civil"
-
-#: ../../mod/profiles.php:705
-msgid "Sexual preference"
-msgstr "Preferencia sexual"
-
-#: ../../mod/profiles.php:708
-msgid "Profile name"
-msgstr "Nombre del perfil"
-
-#: ../../mod/profiles.php:710
-msgid "This is your default profile."
-msgstr "Este es su perfil principal."
-
-#: ../../mod/profiles.php:712
-msgid "Your full name"
-msgstr "Nombre completo"
-
-#: ../../mod/profiles.php:713
-msgid "Title/Description"
-msgstr "Título o descripción"
-
-#: ../../mod/profiles.php:716
-msgid "Street address"
-msgstr "Dirección"
-
-#: ../../mod/profiles.php:717
-msgid "Locality/City"
-msgstr "Ciudad"
-
-#: ../../mod/profiles.php:718
-msgid "Region/State"
-msgstr "Región o Estado"
-
-#: ../../mod/profiles.php:719
-msgid "Postal/Zip code"
-msgstr "Código postal"
-
-#: ../../mod/profiles.php:720
-msgid "Country"
-msgstr "País"
-
-#: ../../mod/profiles.php:725
-msgid "Who (if applicable)"
-msgstr "Quién (si es pertinente)"
-
-#: ../../mod/profiles.php:725
-msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
-msgstr "Por ejemplo: ana123, María González, sara@ejemplo.com"
-
-#: ../../mod/profiles.php:726
-msgid "Since (date)"
-msgstr "Desde (fecha)"
-
-#: ../../mod/profiles.php:729
-msgid "Tell us about yourself"
-msgstr "Háblenos de usted"
-
-#: ../../mod/profiles.php:730 ../../mod/id.php:27
-msgid "Homepage URL"
-msgstr "Dirección de la página personal"
-
-#: ../../mod/profiles.php:731
-msgid "Hometown"
-msgstr "Lugar de nacimiento"
-
-#: ../../mod/profiles.php:732
-msgid "Political views"
-msgstr "Ideas políticas"
-
-#: ../../mod/profiles.php:733
-msgid "Religious views"
-msgstr "Creencias religiosas"
-
-#: ../../mod/profiles.php:734
-msgid "Keywords used in directory listings"
-msgstr "Palabras clave utilizadas en los listados de directorios"
-
-#: ../../mod/profiles.php:734
-msgid "Example: fishing photography software"
-msgstr "Por ejemplo: software de fotografía submarina"
-
-#: ../../mod/profiles.php:737
-msgid "Musical interests"
-msgstr "Preferencias musicales"
-
-#: ../../mod/profiles.php:738
-msgid "Books, literature"
-msgstr "Libros, literatura"
-
-#: ../../mod/profiles.php:739
-msgid "Television"
-msgstr "Televisión"
-
-#: ../../mod/profiles.php:740
-msgid "Film/Dance/Culture/Entertainment"
-msgstr "Cine, danza, cultura, entretenimiento"
-
-#: ../../mod/profiles.php:741
-msgid "Hobbies/Interests"
-msgstr "Aficiones o intereses"
-
-#: ../../mod/profiles.php:742
-msgid "Love/Romance"
-msgstr "Vida sentimental o amorosa"
-
-#: ../../mod/profiles.php:744
-msgid "School/Education"
-msgstr "Estudios"
-
-#: ../../mod/profiles.php:745
-msgid "Contact information and social networks"
-msgstr "Información de contacto y redes sociales"
-
-#: ../../mod/profiles.php:746
-msgid "My other channels"
-msgstr "Mis otros canales"
-
-#: ../../mod/dav.php:121
-msgid "$Projectname channel"
-msgstr "Canal $Projectname"
-
-#: ../../mod/profperm.php:29 ../../mod/profperm.php:58
-msgid "Invalid profile identifier."
-msgstr "Identificador del perfil no válido"
-
-#: ../../mod/profperm.php:110
-msgid "Profile Visibility Editor"
-msgstr "Editor de visibilidad del perfil"
-
-#: ../../mod/profperm.php:114
-msgid "Click on a contact to add or remove."
-msgstr "Pulsar en un contacto para añadirlo o eliminarlo."
-
-#: ../../mod/profperm.php:123
-msgid "Visible To"
-msgstr "Visible para"
-
-#: ../../mod/directory.php:239
-#, php-format
-msgid "%d rating"
-msgid_plural "%d ratings"
-msgstr[0] "%d valoración"
-msgstr[1] "%d valoraciones"
-
-#: ../../mod/directory.php:250
-msgid "Gender: "
-msgstr "Género:"
-
-#: ../../mod/directory.php:252
-msgid "Status: "
-msgstr "Estado:"
-
-#: ../../mod/directory.php:254
-msgid "Homepage: "
-msgstr "Página personal:"
-
-#: ../../mod/directory.php:313
-msgid "Description:"
-msgstr "Descripción:"
-
-#: ../../mod/directory.php:322
-msgid "Public Forum:"
-msgstr "Foro público:"
-
-#: ../../mod/directory.php:325
-msgid "Keywords: "
-msgstr "Palabras clave:"
-
-#: ../../mod/directory.php:328
-msgid "Don't suggest"
-msgstr "No sugerir:"
-
-#: ../../mod/directory.php:330
-msgid "Common connections:"
-msgstr "Conexiones comunes:"
-
-#: ../../mod/directory.php:379
-msgid "Global Directory"
-msgstr "Directorio global:"
-
-#: ../../mod/directory.php:379
-msgid "Local Directory"
-msgstr "Directorio local:"
-
-#: ../../mod/directory.php:385
-msgid "Finding:"
-msgstr "Encontrar:"
-
-#: ../../mod/directory.php:390
-msgid "next page"
-msgstr "siguiente página"
-
-#: ../../mod/directory.php:390
-msgid "previous page"
-msgstr "página anterior"
-
-#: ../../mod/directory.php:391
-msgid "Sort options"
-msgstr "Ordenar opciones"
-
-#: ../../mod/directory.php:392
-msgid "Alphabetic"
-msgstr "Alfabético"
-
-#: ../../mod/directory.php:393
-msgid "Reverse Alphabetic"
-msgstr "Alfabético inverso"
-
-#: ../../mod/directory.php:394
-msgid "Newest to Oldest"
-msgstr "De más nuevo a más antiguo"
-
-#: ../../mod/directory.php:395
-msgid "Oldest to Newest"
-msgstr "De más antiguo a más nuevo"
-
-#: ../../mod/directory.php:412
-msgid "No entries (some entries may be hidden)."
-msgstr "Sin entradas (algunas entradas pueden estar ocultas)."
-
-#: ../../mod/dirsearch.php:21 ../../mod/regdir.php:45
-msgid "This site is not a directory server"
-msgstr "Este sitio no es un servidor de directorio"
-
-#: ../../mod/dirsearch.php:29
-msgid "This directory server requires an access token"
-msgstr "El servidor de este directorio necesita un \"token\" de acceso"
-
-#: ../../mod/pubsites.php:21
-msgid ""
-"The listed hubs allow public registration for the $Projectname network. All "
-"hubs in the network are interlinked so membership on any of them conveys "
-"membership in the network as a whole. Some hubs may require subscription or "
-"provide tiered service plans. The hub itself <strong>may</strong> provide "
-"additional details."
-msgstr "Los sitios listados permiten el registro público en la red $Projectname. Todos los sitios de la red están vinculados entre sí, por lo que sus miembros, en ninguno de ellos, indican la pertenencia a la red en su conjunto. Algunos sitios pueden requerir suscripción o proporcionar planes de servicio por niveles. Los mismos hubs <strong>pueden</strong> proporcionar detalles adicionales."
-
-#: ../../mod/pubsites.php:27
-msgid "Hub URL"
-msgstr "Dirección del hub"
-
-#: ../../mod/pubsites.php:27
-msgid "Access Type"
-msgstr "Tipo de acceso"
-
-#: ../../mod/pubsites.php:27
-msgid "Registration Policy"
-msgstr "Normas de registro"
-
-#: ../../mod/pubsites.php:33
-msgid "Rate"
-msgstr "Valorar"
-
-#: ../../mod/dreport.php:23
-msgid "Invalid message"
-msgstr "Mensaje no válido"
-
-#: ../../mod/dreport.php:55
-msgid "no results"
-msgstr "sin resultados"
-
-#: ../../mod/dreport.php:60
-#, php-format
-msgid "Delivery report for %1$s"
-msgstr "Informe de entrega para %1$s"
-
-#: ../../mod/dreport.php:74
-msgid "channel sync processed"
-msgstr "se ha realizado la sincronización del canal"
-
-#: ../../mod/dreport.php:78
-msgid "queued"
-msgstr "encolado"
-
-#: ../../mod/dreport.php:82
-msgid "posted"
-msgstr "enviado"
-
-#: ../../mod/dreport.php:86
-msgid "accepted for delivery"
-msgstr "aceptado para el envío"
-
-#: ../../mod/dreport.php:90
-msgid "updated"
-msgstr "actualizado"
-
-#: ../../mod/dreport.php:93
-msgid "update ignored"
-msgstr "actualización ignorada"
-
-#: ../../mod/dreport.php:96
-msgid "permission denied"
-msgstr "permiso denegado"
-
-#: ../../mod/dreport.php:100
-msgid "recipient not found"
-msgstr "destinatario no encontrado"
-
-#: ../../mod/dreport.php:103
-msgid "mail recalled"
-msgstr "mensaje de correo revocado"
-
-#: ../../mod/dreport.php:106
-msgid "duplicate mail received"
-msgstr "se ha recibido mensaje duplicado"
-
-#: ../../mod/dreport.php:109
-msgid "mail delivered"
-msgstr "correo enviado"
-
-#: ../../mod/editblock.php:118
-msgid "Delete block?"
-msgstr "¿Borrar bloque?"
-
-#: ../../mod/editblock.php:182
-msgid "Edit Block"
-msgstr "Modificar este bloque"
-
-#: ../../mod/new_channel.php:117 ../../mod/manage.php:130
-#, php-format
-msgid "You have created %1$.0f of %2$.0f allowed channels."
-msgstr "Ha creado %1$.0f de %2$.0f canales permitidos."
-
-#: ../../mod/new_channel.php:124 ../../mod/register.php:227
-msgid "Name or caption"
-msgstr "Nombre o descripción"
-
-#: ../../mod/new_channel.php:124 ../../mod/register.php:227
-msgid "Examples: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \"Aviation Group\""
-msgstr "Ejemplos: \"Juan García\", \"Luisa y sus caballos\", \"Fútbol\", \"Grupo de aviación\""
-
-#: ../../mod/new_channel.php:126 ../../mod/register.php:229
-msgid "Choose a short nickname"
-msgstr "Elija un alias corto"
-
-#: ../../mod/new_channel.php:126 ../../mod/register.php:229
-#, php-format
-msgid ""
-"Your nickname will be used to create an easy to remember channel address "
-"e.g. nickname%s"
-msgstr "Su alias se usará para crear una dirección de canal fácil de recordar, p. ej.: alias%s"
-
-#: ../../mod/new_channel.php:128 ../../mod/register.php:231
-msgid "Channel role and privacy"
-msgstr "Clase de canal y privacidad"
-
-#: ../../mod/new_channel.php:128 ../../mod/register.php:231
-msgid "Select a channel role with your privacy requirements."
-msgstr "Seleccione un tipo de canal con sus requisitos de privacidad"
-
-#: ../../mod/new_channel.php:128 ../../mod/register.php:231
-msgid "Read more about roles"
-msgstr "Leer más sobre los roles"
-
-#: ../../mod/new_channel.php:131
-msgid "Create Channel"
-msgstr "Crear un canal"
-
-#: ../../mod/new_channel.php:132
-msgid ""
-"A channel is your identity on this network. It can represent a person, a "
-"blog, or a forum to name a few. Channels can make connections with other "
-"channels to share information with highly detailed permissions."
-msgstr "Un canal es su identidad en esta red. Puede representar a una persona, un blog o un foro, por nombrar unos pocos ejemplos. Los canales se pueden conectar con otros canales para compartir información con una gama de permisos extremadamente detallada."
-
-#: ../../mod/new_channel.php:133
-msgid ""
-"or <a href=\"import\">import an existing channel</a> from another location."
-msgstr "O <a href=\"import\">importar un canal existente</a> desde otro lugar."
-
-#: ../../mod/editlayout.php:112
-msgid "Delete layout?"
-msgstr "¿Borrar la plantilla?"
-
-#: ../../mod/editlayout.php:160 ../../mod/layouts.php:124
-msgid "Layout Description (Optional)"
-msgstr "Descripción de la plantilla (opcional)"
-
-#: ../../mod/editlayout.php:162 ../../mod/layouts.php:121
-#: ../../mod/layouts.php:180
-msgid "Layout Name"
-msgstr "Nombre de la plantilla"
-
-#: ../../mod/editlayout.php:179
-msgid "Edit Layout"
-msgstr "Modificar la plantilla"
-
-#: ../../mod/rate.php:158
-msgid "Website:"
-msgstr "Sitio web:"
-
-#: ../../mod/rate.php:161
-#, php-format
-msgid "Remote Channel [%s] (not yet known on this site)"
-msgstr "Canal remoto [%s] (aún no es conocido en este sitio)"
-
-#: ../../mod/rate.php:162
-msgid "Rating (this information is public)"
-msgstr "Valoración (esta información es pública)"
-
-#: ../../mod/rate.php:163
-msgid "Optionally explain your rating (this information is public)"
-msgstr "Opcionalmente puede explicar su valoración (esta información es pública)"
-
-#: ../../mod/webpages.php:195
-msgid "Page Title"
-msgstr "Título de página"
-
-#: ../../mod/editwebpage.php:153
-msgid "Delete webpage?"
-msgstr "¿Eliminar la página web?"
-
-#: ../../mod/editwebpage.php:173
-msgid "Page link title"
-msgstr "Título del enlace de la página"
-
-#: ../../mod/editwebpage.php:223
-msgid "Edit Webpage"
-msgstr "Editar la página web"
-
-#: ../../mod/blocks.php:95 ../../mod/blocks.php:150
-msgid "Block Name"
-msgstr "Nombre del bloque"
-
-#: ../../mod/blocks.php:151
-msgid "Block Title"
-msgstr "Título del bloque"
-
-#: ../../mod/ratings.php:69
-msgid "No ratings"
-msgstr "Ninguna valoración"
-
-#: ../../mod/ratings.php:100
-msgid "Rating: "
-msgstr "Valoración:"
-
-#: ../../mod/ratings.php:101
-msgid "Website: "
-msgstr "Sitio web:"
-
-#: ../../mod/ratings.php:103
-msgid "Description: "
-msgstr "Descripción:"
-
-#: ../../mod/events.php:21
-msgid "Calendar entries imported."
-msgstr "Entradas de calendario importadas."
-
-#: ../../mod/events.php:23
-msgid "No calendar entries found."
-msgstr "No se han encontrado entradas de calendario."
-
-#: ../../mod/events.php:100
-msgid "Event can not end before it has started."
-msgstr "Un evento no puede terminar antes de que haya comenzado."
-
-#: ../../mod/events.php:102 ../../mod/events.php:111 ../../mod/events.php:131
-msgid "Unable to generate preview."
-msgstr "No se puede crear la vista previa."
-
-#: ../../mod/events.php:109
-msgid "Event title and start time are required."
-msgstr "Se requieren el título del evento y su hora de inicio."
-
-#: ../../mod/events.php:129 ../../mod/events.php:254
-msgid "Event not found."
-msgstr "Evento no encontrado."
-
-#: ../../mod/events.php:444
-msgid "Edit event title"
-msgstr "Editar el título del evento"
-
-#: ../../mod/events.php:444
-msgid "Event title"
-msgstr "Título del evento"
-
-#: ../../mod/events.php:446
-msgid "Categories (comma-separated list)"
-msgstr "Categorías (lista separada por comas)"
-
-#: ../../mod/events.php:447
-msgid "Edit Category"
-msgstr "Editar la categoría"
-
-#: ../../mod/events.php:447
-msgid "Category"
-msgstr "Categoría"
-
-#: ../../mod/events.php:450
-msgid "Edit start date and time"
-msgstr "Modificar la fecha y hora de comienzo"
-
-#: ../../mod/events.php:450
-msgid "Start date and time"
-msgstr "Fecha y hora de comienzo"
-
-#: ../../mod/events.php:451 ../../mod/events.php:454
-msgid "Finish date and time are not known or not relevant"
-msgstr "La fecha y hora de terminación no se conocen o no son relevantes"
-
-#: ../../mod/events.php:453
-msgid "Edit finish date and time"
-msgstr "Modificar la fecha y hora de terminación"
-
-#: ../../mod/events.php:453
-msgid "Finish date and time"
-msgstr "Fecha y hora de terminación"
-
-#: ../../mod/events.php:455 ../../mod/events.php:456
-msgid "Adjust for viewer timezone"
-msgstr "Ajustar para obtener el visor de los husos horarios"
-
-#: ../../mod/events.php:455
-msgid ""
-"Important for events that happen in a particular place. Not practical for "
-"global holidays."
-msgstr "Importante para los eventos que suceden en un lugar determinado. No es práctico para los globales."
-
-#: ../../mod/events.php:457
-msgid "Edit Description"
-msgstr "Editar la descripción"
-
-#: ../../mod/events.php:459
-msgid "Edit Location"
-msgstr "Modificar la dirección"
-
-#: ../../mod/events.php:462 ../../mod/events.php:464
-msgid "Share this event"
-msgstr "Compartir este evento"
-
-#: ../../mod/events.php:469
-msgid "Advanced Options"
-msgstr "Opciones avanzadas"
-
-#: ../../mod/events.php:603
-msgid "Edit event"
-msgstr "Editar evento"
-
-#: ../../mod/events.php:605
-msgid "Delete event"
-msgstr "Borrar evento"
-
-#: ../../mod/events.php:639
-msgid "calendar"
-msgstr "calendario"
-
-#: ../../mod/events.php:699
-msgid "Event removed"
-msgstr "Evento borrado"
-
-#: ../../mod/events.php:702
-msgid "Failed to remove event"
-msgstr "Error al eliminar el evento"
-
-#: ../../mod/rbmark.php:90
-msgid "Select a bookmark folder"
-msgstr "Seleccionar una carpeta de marcadores"
-
-#: ../../mod/rbmark.php:95
-msgid "Save Bookmark"
-msgstr "Guardar marcador"
-
-#: ../../mod/rbmark.php:96
-msgid "URL of bookmark"
-msgstr "Dirección del marcador"
-
-#: ../../mod/rbmark.php:101
-msgid "Or enter new bookmark folder name"
-msgstr "O introduzca un nuevo nombre para la carpeta de marcadores"
-
-#: ../../mod/ffsapi.php:8
-msgid "Share content from Firefox to $Projectname"
-msgstr "Compartir contenido desde Firefox a $Projectname"
-
-#: ../../mod/ffsapi.php:11
-msgid "Activate the Firefox $Projectname provider"
-msgstr "Servicio de compartición de Firefox: activar el proveedor $Projectname "
-
-#: ../../mod/register.php:45
-msgid "Maximum daily site registrations exceeded. Please try again tomorrow."
-msgstr "Se ha superado el límite máximo de inscripciones diarias de este sitio. Por favor, pruebe de nuevo mañana."
-
-#: ../../mod/register.php:51
-msgid ""
-"Please indicate acceptance of the Terms of Service. Registration failed."
-msgstr "Por favor, confirme que acepta los Términos del servicio. El registro ha fallado."
-
-#: ../../mod/register.php:85
-msgid "Passwords do not match."
-msgstr "Las contraseñas no coinciden."
-
-#: ../../mod/register.php:127
-msgid ""
-"Registration successful. Please check your email for validation "
-"instructions."
-msgstr "Registro realizado con éxito. Por favor, compruebe su correo electrónico para ver las instrucciones para validarlo."
-
-#: ../../mod/register.php:133
-msgid "Your registration is pending approval by the site owner."
-msgstr "Su registro está pendiente de aprobación por el propietario del sitio."
-
-#: ../../mod/register.php:136
-msgid "Your registration can not be processed."
-msgstr "Su registro no puede ser procesado."
-
-#: ../../mod/register.php:180
-msgid "Registration on this hub is disabled."
-msgstr "El registro está deshabilitado en este sitio."
-
-#: ../../mod/register.php:189
-msgid "Registration on this hub is by approval only."
-msgstr "El registro en este hub está sometido a aprobación previa."
-
-#: ../../mod/register.php:190
-msgid "<a href=\"pubsites\">Register at another affiliated hub.</a>"
-msgstr "<a href=\"pubsites\">Registrarse en otro hub afiliado.</a>"
-
-#: ../../mod/register.php:200
-msgid ""
-"This site has exceeded the number of allowed daily account registrations. "
-"Please try again tomorrow."
-msgstr "Este sitio ha excedido el límite de inscripción diaria de cuentas. Por favor, inténtelo de nuevo mañana."
-
-#: ../../mod/register.php:211
-msgid "Terms of Service"
-msgstr "Términos del servicio"
-
-#: ../../mod/register.php:217
-#, php-format
-msgid "I accept the %s for this website"
-msgstr "Acepto los %s de este sitio"
-
-#: ../../mod/register.php:219
-#, php-format
-msgid "I am over 13 years of age and accept the %s for this website"
-msgstr "Tengo más de 13 años de edad y acepto los %s de este sitio"
-
-#: ../../mod/register.php:223
-msgid "Your email address"
-msgstr "Su dirección de correo electrónico"
-
-#: ../../mod/register.php:224
-msgid "Choose a password"
-msgstr "Elija una contraseña"
-
-#: ../../mod/register.php:225
-msgid "Please re-enter your password"
-msgstr "Por favor, vuelva a escribir su contraseña"
-
-#: ../../mod/register.php:226
-msgid "Please enter your invitation code"
-msgstr "Por favor, introduzca el código de su invitación"
-
-#: ../../mod/register.php:232
-msgid "no"
-msgstr "no"
-
-#: ../../mod/register.php:232
-msgid "yes"
-msgstr "sí"
-
-#: ../../mod/register.php:246
-msgid "Membership on this site is by invitation only."
-msgstr "Para registrarse en este sitio es necesaria una invitación."
-
-#: ../../mod/register.php:258
-msgid "Proceed to create your first channel"
-msgstr "Crear su primer canal"
-
-#: ../../mod/regmod.php:11
-msgid "Please login."
-msgstr "Por favor, inicie sesión."
-
-#: ../../mod/filer.php:48
-msgid "- select -"
-msgstr "- seleccionar -"
-
-#: ../../mod/notifications.php:26
-msgid "Invalid request identifier."
-msgstr "Petición inválida del identificador."
-
-#: ../../mod/notifications.php:35
-msgid "Discard"
-msgstr "Descartar"
-
-#: ../../mod/notifications.php:94 ../../mod/notify.php:53
-msgid "No more system notifications."
-msgstr "No hay más notificaciones del sistema"
-
-#: ../../mod/notifications.php:98 ../../mod/notify.php:57
-msgid "System Notifications"
-msgstr "Notificaciones del sistema"
-
-#: ../../mod/filestorage.php:82
-msgid "Permission Denied."
-msgstr "Permiso denegado"
-
-#: ../../mod/filestorage.php:98
-msgid "File not found."
-msgstr "Fichero no encontrado."
-
-#: ../../mod/filestorage.php:141
-msgid "Edit file permissions"
-msgstr "Modificar los permisos del fichero"
-
-#: ../../mod/filestorage.php:150
-msgid "Set/edit permissions"
-msgstr "Establecer/editar los permisos"
-
-#: ../../mod/filestorage.php:151
-msgid "Include all files and sub folders"
-msgstr "Incluir todos los ficheros y subcarpetas"
-
-#: ../../mod/filestorage.php:152
-msgid "Return to file list"
-msgstr "Volver a la lista de ficheros"
-
-#: ../../mod/filestorage.php:154
-msgid "Copy/paste this code to attach file to a post"
-msgstr "Copiar/pegar este código para adjuntar el fichero al envío"
-
-#: ../../mod/filestorage.php:155
-msgid "Copy/paste this URL to link file from a web page"
-msgstr "Copiar/pegar esta dirección para enlazar el fichero desde una página web"
-
-#: ../../mod/filestorage.php:157
-msgid "Share this file"
-msgstr "Compartir este fichero"
-
-#: ../../mod/filestorage.php:158
-msgid "Show URL to this file"
-msgstr "Mostrar la dirección de este fichero"
-
-#: ../../mod/filestorage.php:159
-msgid "Notify your contacts about this file"
-msgstr "Avisar a sus contactos sobre este fichero"
-
-#: ../../mod/removeaccount.php:30
-msgid ""
-"Account removals are not allowed within 48 hours of changing the account "
-"password."
-msgstr "La eliminación de cuentas no está permitida hasta después de que hayan transcurrido 48 horas desde el último cambio de contraseña."
-
-#: ../../mod/removeaccount.php:57
-msgid "Remove This Account"
-msgstr "Eliminar esta cuenta"
-
-#: ../../mod/removeaccount.php:58 ../../mod/removeme.php:58
-msgid "WARNING: "
-msgstr "ATENCIÓN:"
-
-#: ../../mod/removeaccount.php:58
-msgid ""
-"This account and all its channels will be completely removed from the "
-"network. "
-msgstr "Esta cuenta y todos sus canales van a ser eliminados de la red."
-
-#: ../../mod/removeaccount.php:58 ../../mod/removeme.php:58
-msgid "This action is permanent and can not be undone!"
-msgstr "¡Esta acción tiene carácter definitivo y no se puede deshacer!"
-
-#: ../../mod/removeaccount.php:59 ../../mod/removeme.php:59
-msgid "Please enter your password for verification:"
-msgstr "Por favor, introduzca su contraseña para su verificación:"
-
-#: ../../mod/removeaccount.php:60
-msgid ""
-"Remove this account, all its channels and all its channel clones from the "
-"network"
-msgstr "Remover esta cuenta, todos sus canales y clones de la red"
-
-#: ../../mod/removeaccount.php:60
-msgid ""
-"By default only the instances of the channels located on this hub will be "
-"removed from the network"
-msgstr "Por defecto, solo las instancias de los canales ubicados en este servidor serán eliminados de la red"
-
-#: ../../mod/removeaccount.php:61 ../../mod/settings.php:712
-msgid "Remove Account"
-msgstr "Eliminar cuenta"
-
-#: ../../mod/follow.php:27
-msgid "Channel added."
-msgstr "Canal añadido."
-
-#: ../../mod/removeme.php:29
-msgid ""
-"Channel removals are not allowed within 48 hours of changing the account "
-"password."
-msgstr "La eliminación de canales no está permitida hasta pasadas 48 horas desde el último cambio de contraseña."
-
-#: ../../mod/removeme.php:57
-msgid "Remove This Channel"
-msgstr "Eliminar este canal"
-
-#: ../../mod/removeme.php:58
-msgid "This channel will be completely removed from the network. "
-msgstr "Este canal va a ser completamente eliminado de la red."
-
-#: ../../mod/removeme.php:60
-msgid "Remove this channel and all its clones from the network"
-msgstr "Eliminar este canal y todos sus clones de la red"
+#: ../../include/nav.php:82 ../../include/nav.php:113 ../../boot.php:1601
+msgid "Logout"
+msgstr "Finalizar sesión"
-#: ../../mod/removeme.php:60
-msgid ""
-"By default only the instance of the channel located on this hub will be "
-"removed from the network"
-msgstr "Por defecto, solo la instancia del canal alojado en este servidor será eliminado de la red"
+#: ../../include/nav.php:82 ../../include/nav.php:113
+msgid "End this session"
+msgstr "Finalizar esta sesión"
-#: ../../mod/removeme.php:61 ../../mod/settings.php:1131
-msgid "Remove Channel"
-msgstr "Eliminar el canal"
+#: ../../include/nav.php:85 ../../include/nav.php:144
+msgid "Home"
+msgstr "Inicio"
-#: ../../mod/fsuggest.php:20 ../../mod/fsuggest.php:92
-msgid "Contact not found."
-msgstr "Contacto no encontrado"
+#: ../../include/nav.php:85
+msgid "Your posts and conversations"
+msgstr "Sus publicaciones y conversaciones"
-#: ../../mod/fsuggest.php:63
-msgid "Friend suggestion sent."
-msgstr "Enviar sugerencia a un amigo."
+#: ../../include/nav.php:86
+msgid "Your profile page"
+msgstr "Su página del perfil"
-#: ../../mod/fsuggest.php:97
-msgid "Suggest Friends"
-msgstr "Sugerir amigos"
+#: ../../include/nav.php:88
+msgid "Manage/Edit profiles"
+msgstr "Administrar/editar perfiles"
-#: ../../mod/fsuggest.php:99
-#, php-format
-msgid "Suggest a friend for %s"
-msgstr "Sugerir un amigo a %s"
+#: ../../include/nav.php:90
+msgid "Edit your profile"
+msgstr "Editar su perfil"
-#: ../../mod/rmagic.php:40
-msgid ""
-"We encountered a problem while logging in with the OpenID you provided. "
-"Please check the correct spelling of the ID."
-msgstr "Encontramos un problema durante el inicio de sesión con la OpenID que proporcionó. Por favor, compruebe que la ID está correctamente escrita."
+#: ../../include/nav.php:92
+msgid "Your photos"
+msgstr "Sus fotos"
-#: ../../mod/rmagic.php:40
-msgid "The error message was:"
-msgstr "El mensaje de error fue:"
+#: ../../include/nav.php:93
+msgid "Your files"
+msgstr "Sus ficheros"
-#: ../../mod/rmagic.php:44
-msgid "Authentication failed."
-msgstr "Falló la autenticación."
+#: ../../include/nav.php:96
+msgid "Your chatrooms"
+msgstr "Sus salas de chat"
-#: ../../mod/rmagic.php:84
-msgid "Remote Authentication"
-msgstr "Acceso desde su servidor"
+#: ../../include/nav.php:102
+msgid "Your bookmarks"
+msgstr "Sus marcadores"
-#: ../../mod/rmagic.php:85
-msgid "Enter your channel address (e.g. channel@example.com)"
-msgstr "Introduzca la dirección del canal (p.ej. canal@ejemplo.com)"
+#: ../../include/nav.php:106
+msgid "Your webpages"
+msgstr "Sus páginas web"
-#: ../../mod/rmagic.php:86
-msgid "Authenticate"
+#: ../../include/nav.php:110
+msgid "Sign in"
msgstr "Acceder"
-#: ../../mod/help.php:163
-msgid "Documentation Search"
-msgstr "Búsqueda de Documentación"
-
-#: ../../mod/help.php:204 ../../mod/help.php:210 ../../mod/help.php:216
-msgid "Help:"
-msgstr "Ayuda:"
-
-#: ../../mod/help.php:257
-msgid "$Projectname Documentation"
-msgstr "Documentación de $Projectname"
-
-#: ../../mod/group.php:20
-msgid "Privacy group created."
-msgstr "El grupo de canales ha sido creado."
-
-#: ../../mod/group.php:26
-msgid "Could not create privacy group."
-msgstr "No se puede crear el grupo de canales"
-
-#: ../../mod/group.php:54
-msgid "Privacy group updated."
-msgstr "Grupo de canales actualizado."
-
-#: ../../mod/group.php:86
-msgid "Create a group of channels."
-msgstr "Crear un grupo de canales."
-
-#: ../../mod/group.php:87 ../../mod/group.php:180
-msgid "Privacy group name: "
-msgstr "Nombre del grupo de canales:"
-
-#: ../../mod/group.php:89 ../../mod/group.php:183
-msgid "Members are visible to other channels"
-msgstr "Los miembros son visibles para otros canales"
-
-#: ../../mod/group.php:107
-msgid "Privacy group removed."
-msgstr "Grupo de canales eliminado."
-
-#: ../../mod/group.php:109
-msgid "Unable to remove privacy group."
-msgstr "Imposible eliminar el grupo de canales."
-
-#: ../../mod/group.php:179
-msgid "Privacy group editor"
-msgstr "Editor de grupos de canales"
-
-#: ../../mod/group.php:193
-msgid "Members"
-msgstr "Miembros"
-
-#: ../../mod/group.php:195
-msgid "All Connected Channels"
-msgstr "Todos los canales conectados"
-
-#: ../../mod/group.php:227
-msgid "Click on a channel to add or remove."
-msgstr "Haga clic en un canal para agregarlo o quitarlo."
-
-#: ../../mod/search.php:212
-#, php-format
-msgid "Items tagged with: %s"
-msgstr "elementos etiquetados con: %s"
-
-#: ../../mod/search.php:214
-#, php-format
-msgid "Search results for: %s"
-msgstr "Resultados de la búsqueda para: %s"
-
-#: ../../mod/home.php:57 ../../mod/home.php:65 ../../mod/siteinfo.php:61
-msgid "$Projectname"
-msgstr "$Projectname"
-
-#: ../../mod/home.php:75
-#, php-format
-msgid "Welcome to %s"
-msgstr "Bienvenido a %s"
-
-#: ../../mod/service_limits.php:19
-msgid "No service class restrictions found."
-msgstr "No se han encontrado restricciones sobre esta clase de servicio."
-
-#: ../../mod/settings.php:76
-msgid "Name is required"
-msgstr "El nombre es obligatorio"
-
-#: ../../mod/settings.php:80
-msgid "Key and Secret are required"
-msgstr "\"Key\" y \"Secret\" son obligatorios"
-
-#: ../../mod/settings.php:232
-msgid "Not valid email."
-msgstr "Correo electrónico no válido."
-
-#: ../../mod/settings.php:235
-msgid "Protected email address. Cannot change to that email."
-msgstr "Dirección de correo electrónico protegida. No se puede cambiar a ella."
-
-#: ../../mod/settings.php:244
-msgid "System failure storing new email. Please try again."
-msgstr "Fallo de sistema al guardar el nuevo correo electrónico. Por favor, inténtelo de nuevo."
-
-#: ../../mod/settings.php:261
-msgid "Password verification failed."
-msgstr "La comprobación de la contraseña ha fallado."
-
-#: ../../mod/settings.php:268
-msgid "Passwords do not match. Password unchanged."
-msgstr "Las contraseñas no coinciden. La contraseña no se ha cambiado."
-
-#: ../../mod/settings.php:272
-msgid "Empty passwords are not allowed. Password unchanged."
-msgstr "No se permiten contraseñas vacías. La contraseña no se ha cambiado."
-
-#: ../../mod/settings.php:286
-msgid "Password changed."
-msgstr "Contraseña cambiada."
-
-#: ../../mod/settings.php:288
-msgid "Password update failed. Please try again."
-msgstr "La actualización de la contraseña ha fallado. Por favor, inténtalo de nuevo."
-
-#: ../../mod/settings.php:532
-msgid "Settings updated."
-msgstr "Ajustes actualizados."
-
-#: ../../mod/settings.php:596 ../../mod/settings.php:622
-#: ../../mod/settings.php:658
-msgid "Add application"
-msgstr "Añadir aplicación"
-
-#: ../../mod/settings.php:599
-msgid "Name of application"
-msgstr "Nombre de la aplicación"
-
-#: ../../mod/settings.php:600 ../../mod/settings.php:626
-msgid "Consumer Key"
-msgstr "Consumer Key"
-
-#: ../../mod/settings.php:600 ../../mod/settings.php:601
-msgid "Automatically generated - change if desired. Max length 20"
-msgstr "Generado automáticamente - si lo desea, cámbielo. Longitud máxima: 20"
-
-#: ../../mod/settings.php:601 ../../mod/settings.php:627
-msgid "Consumer Secret"
-msgstr "Consumer Secret"
-
-#: ../../mod/settings.php:602 ../../mod/settings.php:628
-msgid "Redirect"
-msgstr "Redirigir"
-
-#: ../../mod/settings.php:602
-msgid ""
-"Redirect URI - leave blank unless your application specifically requires "
-"this"
-msgstr "URI de redirección - dejar en blanco a menos que su aplicación específicamente lo requiera"
-
-#: ../../mod/settings.php:603 ../../mod/settings.php:629
-msgid "Icon url"
-msgstr "Dirección del icono"
-
-#: ../../mod/settings.php:603
-msgid "Optional"
-msgstr "Opcional"
-
-#: ../../mod/settings.php:614
-msgid "Application not found."
-msgstr "Aplicación no encontrada."
-
-#: ../../mod/settings.php:657
-msgid "Connected Apps"
-msgstr "Aplicaciones conectadas"
-
-#: ../../mod/settings.php:661
-msgid "Client key starts with"
-msgstr "La \"client key\" empieza por"
-
-#: ../../mod/settings.php:662
-msgid "No name"
-msgstr "Sin nombre"
-
-#: ../../mod/settings.php:663
-msgid "Remove authorization"
-msgstr "Eliminar autorización"
-
-#: ../../mod/settings.php:676
-msgid "No feature settings configured"
-msgstr "No se ha establecido la configuración de los complementos"
-
-#: ../../mod/settings.php:683
-msgid "Feature/Addon Settings"
-msgstr "Ajustes de los complementos"
-
-#: ../../mod/settings.php:706
-msgid "Account Settings"
-msgstr "Configuración de la cuenta"
-
-#: ../../mod/settings.php:707
-msgid "Current Password"
-msgstr "Contraseña actual"
-
-#: ../../mod/settings.php:708
-msgid "Enter New Password"
-msgstr "Escribir una nueva contraseña"
-
-#: ../../mod/settings.php:709
-msgid "Confirm New Password"
-msgstr "Confirmar la nueva contraseña"
-
-#: ../../mod/settings.php:709
-msgid "Leave password fields blank unless changing"
-msgstr "Dejar en blanco la contraseña a menos que desee cambiarla."
-
-#: ../../mod/settings.php:711 ../../mod/settings.php:1048
-msgid "Email Address:"
-msgstr "Dirección de correo electrónico:"
-
-#: ../../mod/settings.php:713
-msgid "Remove this account including all its channels"
-msgstr "Eliminar esta cuenta incluyendo todos sus canales"
-
-#: ../../mod/settings.php:736
-msgid "Additional Features"
-msgstr "Funcionalidades"
-
-#: ../../mod/settings.php:760
-msgid "Connector Settings"
-msgstr "Configuración del conector"
-
-#: ../../mod/settings.php:799
-msgid "No special theme for mobile devices"
-msgstr "Sin tema especial para dispositivos móviles"
-
-#: ../../mod/settings.php:802
-#, php-format
-msgid "%s - (Experimental)"
-msgstr "%s - (Experimental)"
-
-#: ../../mod/settings.php:844
-msgid "Display Settings"
-msgstr "Ajustes de visualización"
-
-#: ../../mod/settings.php:845
-msgid "Theme Settings"
-msgstr "Ajustes del tema"
-
-#: ../../mod/settings.php:846
-msgid "Custom Theme Settings"
-msgstr "Ajustes personalizados del tema"
-
-#: ../../mod/settings.php:847
-msgid "Content Settings"
-msgstr "Ajustes del contenido"
-
-#: ../../mod/settings.php:853
-msgid "Display Theme:"
-msgstr "Tema gráfico del perfil:"
-
-#: ../../mod/settings.php:854
-msgid "Mobile Theme:"
-msgstr "Tema para el móvil:"
-
-#: ../../mod/settings.php:855
-msgid "Preload images before rendering the page"
-msgstr "Carga previa de las imágenes antes de generar la página"
-
-#: ../../mod/settings.php:855
-msgid ""
-"The subjective page load time will be longer but the page will be ready when"
-" displayed"
-msgstr "El tiempo subjetivo de carga de la página será más largo, pero la página estará lista cuando se muestre."
-
-#: ../../mod/settings.php:856
-msgid "Enable user zoom on mobile devices"
-msgstr "Habilitar zoom de usuario en dispositivos móviles"
-
-#: ../../mod/settings.php:857
-msgid "Update browser every xx seconds"
-msgstr "Actualizar navegador cada xx segundos"
-
-#: ../../mod/settings.php:857
-msgid "Minimum of 10 seconds, no maximum"
-msgstr "Mínimo de 10 segundos, sin máximo"
-
-#: ../../mod/settings.php:858
-msgid "Maximum number of conversations to load at any time:"
-msgstr "Máximo número de conversaciones a cargar en cualquier momento:"
-
-#: ../../mod/settings.php:858
-msgid "Maximum of 100 items"
-msgstr "Máximo de 100 elementos"
-
-#: ../../mod/settings.php:859
-msgid "Show emoticons (smilies) as images"
-msgstr "Mostrar emoticonos (smilies) como imágenes"
-
-#: ../../mod/settings.php:860
-msgid "Link post titles to source"
-msgstr "Enlazar título de la publicación a la fuente original"
-
-#: ../../mod/settings.php:861
-msgid "System Page Layout Editor - (advanced)"
-msgstr "Editor de plantilla de página del sistema - (avanzado)"
-
-#: ../../mod/settings.php:864
-msgid "Use blog/list mode on channel page"
-msgstr "Usar modo blog/lista en la página de inicio del canal"
-
-#: ../../mod/settings.php:864 ../../mod/settings.php:865
-msgid "(comments displayed separately)"
-msgstr "(comentarios mostrados de forma separada)"
-
-#: ../../mod/settings.php:865
-msgid "Use blog/list mode on grid page"
-msgstr "Mostrar mi red en modo blog"
-
-#: ../../mod/settings.php:866
-msgid "Channel page max height of content (in pixels)"
-msgstr "Altura máxima del contenido de la página del canal (en píxeles)"
-
-#: ../../mod/settings.php:866 ../../mod/settings.php:867
-msgid "click to expand content exceeding this height"
-msgstr "Pulsar para expandir el contenido que exceda de esta altura"
-
-#: ../../mod/settings.php:867
-msgid "Grid page max height of content (in pixels)"
-msgstr "Altura máxima del contenido de mi red (en píxeles)"
-
-#: ../../mod/settings.php:901
-msgid "Nobody except yourself"
-msgstr "Nadie excepto usted"
-
-#: ../../mod/settings.php:902
-msgid "Only those you specifically allow"
-msgstr "Solo aquellos a los que usted permita explícitamente"
-
-#: ../../mod/settings.php:903
-msgid "Approved connections"
-msgstr "Conexiones aprobadas"
-
-#: ../../mod/settings.php:904
-msgid "Any connections"
-msgstr "Cualquier conexión"
-
-#: ../../mod/settings.php:905
-msgid "Anybody on this website"
-msgstr "Cualquiera en este sitio web"
-
-#: ../../mod/settings.php:906
-msgid "Anybody in this network"
-msgstr "Cualquiera en esta red"
-
-#: ../../mod/settings.php:907
-msgid "Anybody authenticated"
-msgstr "Cualquiera que esté autenticado"
-
-#: ../../mod/settings.php:908
-msgid "Anybody on the internet"
-msgstr "Cualquiera en internet"
-
-#: ../../mod/settings.php:983
-msgid "Publish your default profile in the network directory"
-msgstr "Publicar su perfil principal en el directorio de la red"
-
-#: ../../mod/settings.php:988
-msgid "Allow us to suggest you as a potential friend to new members?"
-msgstr "¿Nos permite sugerirle como amigo potencial a los nuevos miembros?"
-
-#: ../../mod/settings.php:997
-msgid "Your channel address is"
-msgstr "Su dirección de canal es"
-
-#: ../../mod/settings.php:1039
-msgid "Channel Settings"
-msgstr "Ajustes del canal"
-
-#: ../../mod/settings.php:1046
-msgid "Basic Settings"
-msgstr "Configuración básica"
-
-#: ../../mod/settings.php:1049
-msgid "Your Timezone:"
-msgstr "Su huso horario:"
-
-#: ../../mod/settings.php:1050
-msgid "Default Post Location:"
-msgstr "Localización geográfica predeterminada para sus publicaciones:"
-
-#: ../../mod/settings.php:1050
-msgid "Geographical location to display on your posts"
-msgstr "Localización geográfica que debe mostrarse en sus publicaciones"
-
-#: ../../mod/settings.php:1051
-msgid "Use Browser Location:"
-msgstr "Usar la localización geográfica del navegador:"
-
-#: ../../mod/settings.php:1053
-msgid "Adult Content"
-msgstr "Contenido solo para adultos"
-
-#: ../../mod/settings.php:1053
-msgid ""
-"This channel frequently or regularly publishes adult content. (Please tag "
-"any adult material and/or nudity with #NSFW)"
-msgstr "Este canal publica contenido solo para adultos con frecuencia o regularmente. (Por favor etiquete cualquier material para adultos con la etiqueta #NSFW)"
-
-#: ../../mod/settings.php:1055
-msgid "Security and Privacy Settings"
-msgstr "Configuración de seguridad y privacidad"
-
-#: ../../mod/settings.php:1058
-msgid "Your permissions are already configured. Click to view/adjust"
-msgstr "Sus permisos ya están configurados. Pulse para ver/ajustar"
-
-#: ../../mod/settings.php:1060
-msgid "Hide my online presence"
-msgstr "Ocultar mi presencia en línea"
-
-#: ../../mod/settings.php:1060
-msgid "Prevents displaying in your profile that you are online"
-msgstr "Evitar mostrar en su perfil que está en línea"
-
-#: ../../mod/settings.php:1062
-msgid "Simple Privacy Settings:"
-msgstr "Configuración de privacidad sencilla:"
-
-#: ../../mod/settings.php:1063
-msgid ""
-"Very Public - <em>extremely permissive (should be used with caution)</em>"
-msgstr "Muy Público - <em>extremadamente permisivo (debería ser usado con precaución)</em>"
-
-#: ../../mod/settings.php:1064
-msgid ""
-"Typical - <em>default public, privacy when desired (similar to social "
-"network permissions but with improved privacy)</em>"
-msgstr "Típico - <em>por defecto público, privado cuando se desee (similar a los permisos de una red social pero con privacidad mejorada)</em>"
-
-#: ../../mod/settings.php:1065
-msgid "Private - <em>default private, never open or public</em>"
-msgstr "Privado - <em>por defecto, privado, nunca abierto o público</em>"
-
-#: ../../mod/settings.php:1066
-msgid "Blocked - <em>default blocked to/from everybody</em>"
-msgstr "Bloqueado - <em>por defecto, bloqueado/a para cualquiera</em>"
-
-#: ../../mod/settings.php:1068
-msgid "Allow others to tag your posts"
-msgstr "Permitir a otros etiquetar sus publicaciones"
-
-#: ../../mod/settings.php:1068
-msgid ""
-"Often used by the community to retro-actively flag inappropriate content"
-msgstr "A menudo usado por la comunidad para marcar contenido inapropiado de forma retroactiva."
-
-#: ../../mod/settings.php:1070
-msgid "Advanced Privacy Settings"
-msgstr "Configuración de privacidad avanzada"
-
-#: ../../mod/settings.php:1072
-msgid "Expire other channel content after this many days"
-msgstr "Caducar contenido de otros canales después de este número de días"
-
-#: ../../mod/settings.php:1072
-#, php-format
-msgid ""
-"0 or blank to use the website limit. The website expires after %d days."
-msgstr "0 o en blanco para usar el límite del sitio. El sitio web caduca después de %d días."
-
-#: ../../mod/settings.php:1073
-msgid "Maximum Friend Requests/Day:"
-msgstr "Máximo de solicitudes de amistad por día:"
-
-#: ../../mod/settings.php:1073
-msgid "May reduce spam activity"
-msgstr "Podría reducir la actividad de spam"
-
-#: ../../mod/settings.php:1074
-msgid "Default Post Permissions"
-msgstr "Permisos de publicación predeterminados"
-
-#: ../../mod/settings.php:1079
-msgid "Channel permissions category:"
-msgstr "Categoría de permisos del canal:"
-
-#: ../../mod/settings.php:1085
-msgid "Maximum private messages per day from unknown people:"
-msgstr "Máximo de mensajes privados por día de gente desconocida:"
-
-#: ../../mod/settings.php:1085
-msgid "Useful to reduce spamming"
-msgstr "Útil para reducir el envío de correo no deseado"
-
-#: ../../mod/settings.php:1088
-msgid "Notification Settings"
-msgstr "Configuración de las notificaciones"
-
-#: ../../mod/settings.php:1089
-msgid "By default post a status message when:"
-msgstr "Por defecto, enviar un mensaje de estado cuando:"
-
-#: ../../mod/settings.php:1090
-msgid "accepting a friend request"
-msgstr "Acepte una solicitud de amistad"
-
-#: ../../mod/settings.php:1091
-msgid "joining a forum/community"
-msgstr "al unirse a un foro o comunidad"
-
-#: ../../mod/settings.php:1092
-msgid "making an <em>interesting</em> profile change"
-msgstr "Realice un cambio <em>interesante</em> en su perfil"
-
-#: ../../mod/settings.php:1093
-msgid "Send a notification email when:"
-msgstr "Enviar una notificación por correo electrónico cuando:"
-
-#: ../../mod/settings.php:1094
-msgid "You receive a connection request"
-msgstr "Reciba una solicitud de conexión"
-
-#: ../../mod/settings.php:1095
-msgid "Your connections are confirmed"
-msgstr "Sus conexiones hayan sido confirmadas"
-
-#: ../../mod/settings.php:1096
-msgid "Someone writes on your profile wall"
-msgstr "Alguien escriba en la página de su perfil (\"muro\")"
-
-#: ../../mod/settings.php:1097
-msgid "Someone writes a followup comment"
-msgstr "Alguien escriba un comentario sobre sus publicaciones"
-
-#: ../../mod/settings.php:1098
-msgid "You receive a private message"
-msgstr "Reciba un mensaje privado"
-
-#: ../../mod/settings.php:1099
-msgid "You receive a friend suggestion"
-msgstr "Reciba una sugerencia de amistad"
-
-#: ../../mod/settings.php:1100
-msgid "You are tagged in a post"
-msgstr "Usted sea etiquetado en una publicación"
-
-#: ../../mod/settings.php:1101
-msgid "You are poked/prodded/etc. in a post"
-msgstr "Reciba un toque o incitación en una publicación"
-
-#: ../../mod/settings.php:1104
-msgid "Show visual notifications including:"
-msgstr "Mostrar notificaciones visuales que incluyan:"
-
-#: ../../mod/settings.php:1106
-msgid "Unseen grid activity"
-msgstr "Nueva actividad en la red"
-
-#: ../../mod/settings.php:1107
-msgid "Unseen channel activity"
-msgstr "Actividad no vista en el canal"
-
-#: ../../mod/settings.php:1108
-msgid "Unseen private messages"
-msgstr "Mensajes privados no leídos"
-
-#: ../../mod/settings.php:1108 ../../mod/settings.php:1113
-#: ../../mod/settings.php:1114 ../../mod/settings.php:1115
-msgid "Recommended"
-msgstr "Recomendado"
-
-#: ../../mod/settings.php:1109
-msgid "Upcoming events"
-msgstr "Próximos eventos"
-
-#: ../../mod/settings.php:1110
-msgid "Events today"
-msgstr "Eventos de hoy"
-
-#: ../../mod/settings.php:1111
-msgid "Upcoming birthdays"
-msgstr "Próximos cumpleaños"
-
-#: ../../mod/settings.php:1111
-msgid "Not available in all themes"
-msgstr "No disponible en todos los temas"
-
-#: ../../mod/settings.php:1112
-msgid "System (personal) notifications"
-msgstr "Notificaciones del sistema (personales)"
-
-#: ../../mod/settings.php:1113
-msgid "System info messages"
-msgstr "Mensajes de información del sistema"
-
-#: ../../mod/settings.php:1114
-msgid "System critical alerts"
-msgstr "Alertas críticas del sistema"
-
-#: ../../mod/settings.php:1115
-msgid "New connections"
-msgstr "Nuevas conexiones"
-
-#: ../../mod/settings.php:1116
-msgid "System Registrations"
-msgstr "Registros del sistema"
-
-#: ../../mod/settings.php:1117
-msgid ""
-"Also show new wall posts, private messages and connections under Notices"
-msgstr "Mostrar también en Avisos las nuevas publicaciones, los mensajes privados y las conexiones"
-
-#: ../../mod/settings.php:1119
-msgid "Notify me of events this many days in advance"
-msgstr "Avisarme de los eventos con algunos días de antelación"
-
-#: ../../mod/settings.php:1119
-msgid "Must be greater than 0"
-msgstr "Debe ser mayor que 0"
-
-#: ../../mod/settings.php:1121
-msgid "Advanced Account/Page Type Settings"
-msgstr "Ajustes avanzados de la cuenta y de los tipos de página"
-
-#: ../../mod/settings.php:1122
-msgid "Change the behaviour of this account for special situations"
-msgstr "Cambiar el comportamiento de esta cuenta en situaciones especiales"
-
-#: ../../mod/settings.php:1125
-msgid ""
-"Please enable expert mode (in <a href=\"settings/features\">Settings > "
-"Additional features</a>) to adjust!"
-msgstr "¡Activar el modo de experto (en <a href=\"settings/features\">Ajustes > Funcionalidades</a>) para realizar cambios!."
-
-#: ../../mod/settings.php:1126
-msgid "Miscellaneous Settings"
-msgstr "Ajustes diversos"
-
-#: ../../mod/settings.php:1127
-msgid "Default photo upload folder"
-msgstr "Carpeta por defecto de las fotos subidas"
-
-#: ../../mod/settings.php:1127 ../../mod/settings.php:1128
-msgid "%Y - current year, %m - current month"
-msgstr "%Y - año en curso, %m - mes actual"
-
-#: ../../mod/settings.php:1128
-msgid "Default file upload folder"
-msgstr "Carpeta por defecto de los archivos subidos"
-
-#: ../../mod/settings.php:1130
-msgid "Personal menu to display in your channel pages"
-msgstr "Menú personal que debe mostrarse en las páginas de su canal"
-
-#: ../../mod/settings.php:1132
-msgid "Remove this channel."
-msgstr "Eliminar este canal."
-
-#: ../../mod/settings.php:1133
-msgid "Firefox Share $Projectname provider"
-msgstr "Servicio de compartición de Firefox: proveedor $Projectname"
-
-#: ../../mod/settings.php:1134
-msgid "Start calendar week on monday"
-msgstr "Comenzar el calendario semanal por el lunes"
-
-#: ../../mod/id.php:11
-msgid "First Name"
-msgstr "Nombre"
-
-#: ../../mod/id.php:12
-msgid "Last Name"
-msgstr "Apellido"
-
-#: ../../mod/id.php:13
-msgid "Nickname"
-msgstr "Sobrenombre o Alias"
-
-#: ../../mod/id.php:14
-msgid "Full Name"
-msgstr "Nombre completo"
-
-#: ../../mod/id.php:20
-msgid "Profile Photo 16px"
-msgstr "Foto del perfil 16px"
-
-#: ../../mod/id.php:21
-msgid "Profile Photo 32px"
-msgstr "Foto del perfil 32px"
-
-#: ../../mod/id.php:22
-msgid "Profile Photo 48px"
-msgstr "Foto del perfil 48px"
-
-#: ../../mod/id.php:23
-msgid "Profile Photo 64px"
-msgstr "Foto del perfil 64px"
-
-#: ../../mod/id.php:24
-msgid "Profile Photo 80px"
-msgstr "Foto del perfil 80px"
-
-#: ../../mod/id.php:25
-msgid "Profile Photo 128px"
-msgstr "Foto del perfil 128px"
-
-#: ../../mod/id.php:26
-msgid "Timezone"
-msgstr "Huso horario"
-
-#: ../../mod/id.php:29
-msgid "Birth Year"
-msgstr "Año de nacimiento"
-
-#: ../../mod/id.php:30
-msgid "Birth Month"
-msgstr "Mes de nacimiento"
-
-#: ../../mod/id.php:31
-msgid "Birth Day"
-msgstr "Día de nacimiento"
-
-#: ../../mod/id.php:32
-msgid "Birthdate"
-msgstr "Fecha de nacimiento"
-
-#: ../../mod/setup.php:197
-msgid "$Projectname Server - Setup"
-msgstr "Servidor $Projectname - Instalación"
-
-#: ../../mod/setup.php:201
-msgid "Could not connect to database."
-msgstr "No se ha podido conectar a la base de datos."
-
-#: ../../mod/setup.php:205
-msgid ""
-"Could not connect to specified site URL. Possible SSL certificate or DNS "
-"issue."
-msgstr "No se puede conectar con la dirección del sitio indicada. Podría tratarse de un problema de SSL o DNS."
-
-#: ../../mod/setup.php:212
-msgid "Could not create table."
-msgstr "No se puede crear la tabla."
-
-#: ../../mod/setup.php:217
-msgid "Your site database has been installed."
-msgstr "La base de datos del sitio ha sido instalada."
-
-#: ../../mod/setup.php:221
-msgid ""
-"You may need to import the file \"install/schema_xxx.sql\" manually using a "
-"database client."
-msgstr "Podría tener que importar manualmente el fichero \"install/schema_xxx.sql\" usando un cliente de base de datos."
-
-#: ../../mod/setup.php:222 ../../mod/setup.php:290 ../../mod/setup.php:740
-msgid "Please see the file \"install/INSTALL.txt\"."
-msgstr "Por favor, lea el fichero \"install/INSTALL.txt\"."
-
-#: ../../mod/setup.php:287
-msgid "System check"
-msgstr "Verificación del sistema"
-
-#: ../../mod/setup.php:292
-msgid "Check again"
-msgstr "Verificar de nuevo"
-
-#: ../../mod/setup.php:314
-msgid "Database connection"
-msgstr "Conexión a la base de datos"
-
-#: ../../mod/setup.php:315
-msgid ""
-"In order to install $Projectname we need to know how to connect to your "
-"database."
-msgstr "Para instalar $Projectname es necesario saber cómo conectar con su base de datos."
-
-#: ../../mod/setup.php:316
-msgid ""
-"Please contact your hosting provider or site administrator if you have "
-"questions about these settings."
-msgstr "Por favor, contacte con el proveedor de servicios o el administrador del sitio si tiene dudas sobre estos ajustes."
-
-#: ../../mod/setup.php:317
-msgid ""
-"The database you specify below should already exist. If it does not, please "
-"create it before continuing."
-msgstr "La base de datos que especifique a continuación debe existir ya. Si no es así, por favor, créela antes de seguir."
-
-#: ../../mod/setup.php:321
-msgid "Database Server Name"
-msgstr "Nombre del servidor de base de datos"
-
-#: ../../mod/setup.php:321
-msgid "Default is 127.0.0.1"
-msgstr "De forma predeterminada es 127.0.0.1"
-
-#: ../../mod/setup.php:322
-msgid "Database Port"
-msgstr "Puerto de la base de datos"
-
-#: ../../mod/setup.php:322
-msgid "Communication port number - use 0 for default"
-msgstr "Número del puerto de comunicaciones - use 0 como valor por defecto"
-
-#: ../../mod/setup.php:323
-msgid "Database Login Name"
-msgstr "Usuario de la base de datos"
-
-#: ../../mod/setup.php:324
-msgid "Database Login Password"
-msgstr "Contraseña de acceso a la base de datos"
-
-#: ../../mod/setup.php:325
-msgid "Database Name"
-msgstr "Nombre de la base de datos"
-
-#: ../../mod/setup.php:326
-msgid "Database Type"
-msgstr "Tipo de base de datos"
-
-#: ../../mod/setup.php:328 ../../mod/setup.php:368
-msgid "Site administrator email address"
-msgstr "Dirección de correo electrónico del administrador del sitio"
-
-#: ../../mod/setup.php:328 ../../mod/setup.php:368
-msgid ""
-"Your account email address must match this in order to use the web admin "
-"panel."
-msgstr "Su cuenta deberá usar la misma dirección de correo electrónico para poder utilizar el panel de administración web."
-
-#: ../../mod/setup.php:329 ../../mod/setup.php:370
-msgid "Website URL"
-msgstr "Dirección del sitio web"
-
-#: ../../mod/setup.php:329 ../../mod/setup.php:370
-msgid "Please use SSL (https) URL if available."
-msgstr "Por favor, use SSL (https) si está disponible."
-
-#: ../../mod/setup.php:330 ../../mod/setup.php:373
-msgid "Please select a default timezone for your website"
-msgstr "Por favor, selecciones el huso horario por defecto de su sitio web"
-
-#: ../../mod/setup.php:357
-msgid "Site settings"
-msgstr "Ajustes del sitio"
-
-#: ../../mod/setup.php:371
-msgid "Enable $Projectname <strong>advanced</strong> features?"
-msgstr "¿Habilitar las funcionalidades <strong>avanzadas</strong> de $Projectname ?"
-
-#: ../../mod/setup.php:371
-msgid ""
-"Some advanced features, while useful - may be best suited for technically "
-"proficient audiences"
-msgstr "Algunas funcionalidades avanzadas, si bien son útiles, pueden ser más adecuadas para un público técnicamente competente"
-
-#: ../../mod/setup.php:423
-msgid "Could not find a command line version of PHP in the web server PATH."
-msgstr "No se puede encontrar una versión en línea de comandos de PHP en la ruta del servidor web."
-
-#: ../../mod/setup.php:424
-msgid ""
-"If you don't have a command line version of PHP installed on server, you "
-"will not be able to run background polling via cron."
-msgstr "Si no tiene instalada la versión de línea de comandos de PHP en su servidor, no podrá realizar envíos en segundo plano mediante cron."
-
-#: ../../mod/setup.php:428
-msgid "PHP executable path"
-msgstr "Ruta del ejecutable PHP"
-
-#: ../../mod/setup.php:428
-msgid ""
-"Enter full path to php executable. You can leave this blank to continue the "
-"installation."
-msgstr "Introducir la ruta completa del ejecutable PHP. Puede dejar la línea en blanco para continuar la instalación."
-
-#: ../../mod/setup.php:433
-msgid "Command line PHP"
-msgstr "PHP en línea de comandos"
-
-#: ../../mod/setup.php:442
-msgid ""
-"The command line version of PHP on your system does not have "
-"\"register_argc_argv\" enabled."
-msgstr "La línea de comandos PHP de su sistema no tiene activado \"register_argc_argv\"."
-
-#: ../../mod/setup.php:443
-msgid "This is required for message delivery to work."
-msgstr "Esto es necesario para que funcione la transmisión de mensajes."
-
-#: ../../mod/setup.php:446
-msgid "PHP register_argc_argv"
-msgstr "PHP register_argc_argv"
-
-#: ../../mod/setup.php:464
-#, php-format
-msgid ""
-"Your max allowed total upload size is set to %s. Maximum size of one file to"
-" upload is set to %s. You are allowed to upload up to %d files at once."
-msgstr "La carga máxima que se le permite subir está establecida en %s. El tamaño máximo de un fichero está establecido en %s. Está permitido subir hasta un máximo de %d ficheros de una sola vez."
-
-#: ../../mod/setup.php:469
-msgid "You can adjust these settings in the servers php.ini."
-msgstr "Puede ajustar estos valores en el fichero php.ini de su servidor."
-
-#: ../../mod/setup.php:471
-msgid "PHP upload limits"
-msgstr "Límites PHP de subida"
-
-#: ../../mod/setup.php:494
-msgid ""
-"Error: the \"openssl_pkey_new\" function on this system is not able to "
-"generate encryption keys"
-msgstr "Error: La función \"openssl_pkey_new\" en este sistema no es capaz de general claves de cifrado."
-
-#: ../../mod/setup.php:495
-msgid ""
-"If running under Windows, please see "
-"\"http://www.php.net/manual/en/openssl.installation.php\"."
-msgstr "Si está en un servidor Windows, por favor, lea \"http://www.php.net/manual/en/openssl.installation.php\"."
-
-#: ../../mod/setup.php:498
-msgid "Generate encryption keys"
-msgstr "Generar claves de cifrado"
-
-#: ../../mod/setup.php:510
-msgid "libCurl PHP module"
-msgstr "módulo libCurl PHP"
-
-#: ../../mod/setup.php:511
-msgid "GD graphics PHP module"
-msgstr "módulo PHP GD graphics"
-
-#: ../../mod/setup.php:512
-msgid "OpenSSL PHP module"
-msgstr "módulo PHP OpenSSL"
-
-#: ../../mod/setup.php:513
-msgid "mysqli or postgres PHP module"
-msgstr "módulo PHP mysqli o postgres"
-
-#: ../../mod/setup.php:514
-msgid "mb_string PHP module"
-msgstr "módulo PHP mb_string"
-
-#: ../../mod/setup.php:515
-msgid "mcrypt PHP module"
-msgstr "módulo PHP mcrypt "
-
-#: ../../mod/setup.php:516
-msgid "xml PHP module"
-msgstr "módulo PHP xml"
-
-#: ../../mod/setup.php:520 ../../mod/setup.php:522
-msgid "Apache mod_rewrite module"
-msgstr "módulo Apache mod_rewrite "
-
-#: ../../mod/setup.php:520
-msgid ""
-"Error: Apache webserver mod-rewrite module is required but not installed."
-msgstr "Error: se necesita el módulo del servidor web Apache mod-rewrite pero no está instalado."
-
-#: ../../mod/setup.php:526 ../../mod/setup.php:529
-msgid "proc_open"
-msgstr "proc_open"
-
-#: ../../mod/setup.php:526
-msgid ""
-"Error: proc_open is required but is either not installed or has been "
-"disabled in php.ini"
-msgstr "Error: se necesita proc_open pero o no está instalado o ha sido desactivado en el fichero php.ini"
-
-#: ../../mod/setup.php:534
-msgid "Error: libCURL PHP module required but not installed."
-msgstr "Error: se necesita el módulo PHP libCURL pero no está instalado."
-
-#: ../../mod/setup.php:538
-msgid ""
-"Error: GD graphics PHP module with JPEG support required but not installed."
-msgstr "Error: el módulo PHP GD graphics es necesario, pero no está instalado."
-
-#: ../../mod/setup.php:542
-msgid "Error: openssl PHP module required but not installed."
-msgstr "Error: el módulo PHP openssl es necesario, pero no está instalado."
-
-#: ../../mod/setup.php:546
-msgid ""
-"Error: mysqli or postgres PHP module required but neither are installed."
-msgstr "Error: el módulo PHP mysqli o postgres es necesario pero ninguno de los dos está instalado."
-
-#: ../../mod/setup.php:550
-msgid "Error: mb_string PHP module required but not installed."
-msgstr "Error: el módulo PHP mb_string es necesario, pero no está instalado."
-
-#: ../../mod/setup.php:554
-msgid "Error: mcrypt PHP module required but not installed."
-msgstr "Error: el módulo PHP mcrypt es necesario, pero no está instalado."
-
-#: ../../mod/setup.php:558
-msgid "Error: xml PHP module required for DAV but not installed."
-msgstr "Error: el módulo PHP xml es necesario para DAV, pero no está instalado."
-
-#: ../../mod/setup.php:576
-msgid ""
-"The web installer needs to be able to create a file called \".htconfig.php\""
-" in the top folder of your web server and it is unable to do so."
-msgstr "El instalador web no ha podido crear un fichero llamado “.htconfig.php” en la carpeta base de su servidor."
-
-#: ../../mod/setup.php:577
-msgid ""
-"This is most often a permission setting, as the web server may not be able "
-"to write files in your folder - even if you can."
-msgstr "Esto está generalmente ligado a un problema de permisos, a causa del cual el servidor web tiene prohibido modificar ficheros en su carpeta - incluso si usted mismo tiene esos permisos."
-
-#: ../../mod/setup.php:578
-msgid ""
-"At the end of this procedure, we will give you a text to save in a file "
-"named .htconfig.php in your Red top folder."
-msgstr "Al término de este procedimiento, podemos crear un fichero de texto para guardar con el nombre .htconfig.php en el directorio raíz de su instalación de Hubzilla."
-
-#: ../../mod/setup.php:579
-msgid ""
-"You can alternatively skip this procedure and perform a manual installation."
-" Please see the file \"install/INSTALL.txt\" for instructions."
-msgstr "Como alternativa, puede dejar este procedimiento e intentar realizar una instalación manual. Lea, por favor, el fichero\"install/INSTALL.txt\" para las instrucciones."
-
-#: ../../mod/setup.php:582
-msgid ".htconfig.php is writable"
-msgstr ".htconfig.php tiene permisos de escritura"
-
-#: ../../mod/setup.php:596
-msgid ""
-"Red uses the Smarty3 template engine to render its web views. Smarty3 "
-"compiles templates to PHP to speed up rendering."
-msgstr "Hubzilla hace uso del motor de plantillas Smarty3 para diseñar sus plantillas gráficas. Smarty3 es más rápido porque compila las plantillas de páginas directamente en PHP."
-
-#: ../../mod/setup.php:597
-#, php-format
-msgid ""
-"In order to store these compiled templates, the web server needs to have "
-"write access to the directory %s under the Red top level folder."
-msgstr "Para poder guardar las plantillas compiladas, el servidor web necesita permisos para acceder al subdirectorio %s en el directorio de instalación de Hubzilla."
-
-#: ../../mod/setup.php:598 ../../mod/setup.php:619
-msgid ""
-"Please ensure that the user that your web server runs as (e.g. www-data) has"
-" write access to this folder."
-msgstr "Por favor, asegúrese de que el servidor web está siendo ejecutado por un usuario que tenga permisos de escritura sobre esta carpeta (por ejemplo, www-data)."
-
-#: ../../mod/setup.php:599
-#, php-format
-msgid ""
-"Note: as a security measure, you should give the web server write access to "
-"%s only--not the template files (.tpl) that it contains."
-msgstr "Nota: como medida de seguridad, debe dar al servidor web permisos de escritura solo sobre %s - no sobre el fichero de plantilla (.tpl) que contiene."
-
-#: ../../mod/setup.php:602
-#, php-format
-msgid "%s is writable"
-msgstr "%s tiene permisos de escritura"
-
-#: ../../mod/setup.php:618
-msgid ""
-"Red uses the store directory to save uploaded files. The web server needs to"
-" have write access to the store directory under the Red top level folder"
-msgstr "Hubzilla guarda los ficheros descargados en la carpeta \"store\". El servidor web necesita tener permisos de escritura sobre esa carpeta, en el directorio de instalación."
-
-#: ../../mod/setup.php:622
-msgid "store is writable"
-msgstr "\"store\" tiene permisos de escritura"
-
-#: ../../mod/setup.php:655
-msgid ""
-"SSL certificate cannot be validated. Fix certificate or disable https access"
-" to this site."
-msgstr "El certificado SSL no ha podido ser validado. Corrija este problema o desactive el acceso https a este sitio."
-
-#: ../../mod/setup.php:656
-msgid ""
-"If you have https access to your website or allow connections to TCP port "
-"443 (the https: port), you MUST use a browser-valid certificate. You MUST "
-"NOT use self-signed certificates!"
-msgstr "Si su servidor soporta conexiones cifradas SSL o si permite conexiones al puerto TCP 443 (el puerto usado por el protocolo https), debe utilizar un certificado válido. No debe usar un certificado firmado por usted mismo."
-
-#: ../../mod/setup.php:657
-msgid ""
-"This restriction is incorporated because public posts from you may for "
-"example contain references to images on your own hub."
-msgstr "Se ha incorporado esta restricción para evitar que sus publicaciones públicas hagan referencia a imágenes en su propio servidor."
-
-#: ../../mod/setup.php:658
-msgid ""
-"If your certificate is not recognized, members of other sites (who may "
-"themselves have valid certificates) will get a warning message on their own "
-"site complaining about security issues."
-msgstr "Si su certificado no ha sido reconocido, los miembros de otros sitios (con certificados válidos) recibirán mensajes de aviso en sus propios sitios web."
-
-#: ../../mod/setup.php:659
-msgid ""
-"This can cause usability issues elsewhere (not just on your own site) so we "
-"must insist on this requirement."
-msgstr "Por razones de compatibilidad (sobre el conjunto de la red, no solo sobre su propio sitio), debemos insistir en estos requisitos."
-
-#: ../../mod/setup.php:660
-msgid ""
-"Providers are available that issue free certificates which are browser-"
-"valid."
-msgstr "Existen varias Autoridades de Certificación que le pueden proporcionar certificados válidos."
-
-#: ../../mod/setup.php:662
-msgid "SSL certificate validation"
-msgstr "validación del certificado SSL"
-
-#: ../../mod/setup.php:668
-msgid ""
-"Url rewrite in .htaccess is not working. Check your server "
-"configuration.Test: "
-msgstr "No se pueden reescribir las direcciones web en .htaccess. Compruebe la configuración de su servidor:"
-
-#: ../../mod/setup.php:671
-msgid "Url rewrite is working"
-msgstr "La reescritura de las direcciones funciona correctamente"
-
-#: ../../mod/setup.php:680
-msgid ""
-"The database configuration file \".htconfig.php\" could not be written. "
-"Please use the enclosed text to create a configuration file in your web "
-"server root."
-msgstr "El fichero de configuración de la base de datos .htconfig.php no se ha podido modificar. Por favor, copie el texto generado en un fichero con ese nombre en el directorio raíz de su servidor."
-
-#: ../../mod/setup.php:704
-msgid "Errors encountered creating database tables."
-msgstr "Se han encontrado errores al crear las tablas de la base de datos."
-
-#: ../../mod/setup.php:738
-msgid "<h1>What next</h1>"
-msgstr "<h1>Siguiente paso</h1>"
-
-#: ../../mod/setup.php:739
-msgid ""
-"IMPORTANT: You will need to [manually] setup a scheduled task for the "
-"poller."
-msgstr "IMPORTANTE: Debe crear [manualmente] una tarea programada para el \"poller\"."
-
-#: ../../mod/impel.php:192
-#, php-format
-msgid "%s element installed"
-msgstr "%s elemento instalado"
-
-#: ../../mod/impel.php:195
-#, php-format
-msgid "%s element installation failed"
-msgstr "Elemento con instalación fallida: %s"
-
-#: ../../mod/import.php:28
-#, php-format
-msgid "Your service plan only allows %d channels."
-msgstr "Su paquete de servicios solo permite %d canales."
-
-#: ../../mod/import.php:66 ../../mod/import_items.php:38
-msgid "Nothing to import."
-msgstr "No hay nada para importar."
-
-#: ../../mod/import.php:90 ../../mod/import_items.php:62
-msgid "Unable to download data from old server"
-msgstr "No se han podido descargar datos de su antiguo servidor"
-
-#: ../../mod/import.php:96 ../../mod/import_items.php:68
-msgid "Imported file is empty."
-msgstr "El fichero importado está vacío."
-
-#: ../../mod/import.php:118 ../../mod/import_items.php:82
-#, php-format
-msgid "Warning: Database versions differ by %1$d updates."
-msgstr "Atención: Las versiones de la base de datos difieren en %1$d actualizaciones."
-
-#: ../../mod/import.php:156
-msgid "No channel. Import failed."
-msgstr "No hay canal. La importación ha fallado"
-
-#: ../../mod/import.php:524
-msgid "You must be logged in to use this feature."
-msgstr "Debe estar registrado para poder usar esta funcionalidad."
-
-#: ../../mod/import.php:529
-msgid "Import Channel"
-msgstr "Importar canal"
-
-#: ../../mod/import.php:530
-msgid ""
-"Use this form to import an existing channel from a different server/hub. You"
-" may retrieve the channel identity from the old server/hub via the network "
-"or provide an export file."
-msgstr "Emplee este formulario para importar un canal desde un servidor/hub diferente. Puede recuperar el canal desde el antiguo servidor/hub a través de la red o proporcionando un fichero de exportación."
-
-#: ../../mod/import.php:531 ../../mod/import_items.php:115
-msgid "File to Upload"
-msgstr "Fichero para subir"
-
-#: ../../mod/import.php:532
-msgid "Or provide the old server/hub details"
-msgstr "O proporcione los detalles de su antiguo servidor/hub"
-
-#: ../../mod/import.php:533
-msgid "Your old identity address (xyz@example.com)"
-msgstr "Su identidad en el antiguo servidor (canal@ejemplo.com)"
-
-#: ../../mod/import.php:534
-msgid "Your old login email address"
-msgstr "Su antigua dirección de correo electrónico"
-
-#: ../../mod/import.php:535
-msgid "Your old login password"
-msgstr "Su antigua contraseña"
-
-#: ../../mod/import.php:536
-msgid ""
-"For either option, please choose whether to make this hub your new primary "
-"address, or whether your old location should continue this role. You will be"
-" able to post from either location, but only one can be marked as the "
-"primary location for files, photos, and media."
-msgstr "Para cualquiera de las opciones, elija si hacer de este servidor su nueva dirección primaria, o si su antigua dirección debe continuar con este papel. Usted podrá publicar desde cualquier ubicación, pero sólo una puede estar marcada como la ubicación principal para los ficheros, fotos y otras imágenes o vídeos."
-
-#: ../../mod/import.php:537
-msgid "Make this hub my primary location"
-msgstr "Convertir este servidor en mi ubicación primaria"
-
-#: ../../mod/import.php:538
-msgid ""
-"Import existing posts if possible (experimental - limited by available "
-"memory"
-msgstr "Importar el contenido publicado si es posible (experimental - limitado por la memoria disponible"
-
-#: ../../mod/import.php:539
-msgid ""
-"This process may take several minutes to complete. Please submit the form "
-"only once and leave this page open until finished."
-msgstr "Este proceso puede tardar varios minutos en completarse. Por favor envíe el formulario una sola vez y mantenga esta página abierta hasta que termine."
-
-#: ../../mod/import_items.php:98
-msgid "Import completed"
-msgstr "Importación completada"
-
-#: ../../mod/import_items.php:113
-msgid "Import Items"
-msgstr "Importar elementos"
-
-#: ../../mod/import_items.php:114
-msgid ""
-"Use this form to import existing posts and content from an export file."
-msgstr "Utilice este formulario para importar entradas existentes y contenido desde un archivo de exportación."
-
-#: ../../mod/sharedwithme.php:94
-msgid "Files: shared with me"
-msgstr "Ficheros: compartidos conmigo"
-
-#: ../../mod/sharedwithme.php:96
-msgid "NEW"
-msgstr "NUEVO"
-
-#: ../../mod/sharedwithme.php:99
-msgid "Remove all files"
-msgstr "Eliminar todos los ficheros"
-
-#: ../../mod/sharedwithme.php:100
-msgid "Remove this file"
-msgstr "Eliminar este fichero"
-
-#: ../../mod/invite.php:25
-msgid "Total invitation limit exceeded."
-msgstr "Se ha superado el límite máximo de invitaciones."
-
-#: ../../mod/invite.php:49
-#, php-format
-msgid "%s : Not a valid email address."
-msgstr "%s : No es una dirección de correo electrónico válida. "
-
-#: ../../mod/invite.php:59
-msgid "Please join us on $Projectname"
-msgstr "Únase a nosotros en $Projectname"
-
-#: ../../mod/invite.php:70
-msgid "Invitation limit exceeded. Please contact your site administrator."
-msgstr "Excedido el límite de invitaciones. Por favor, contacte con el Administrador de su sitio."
-
-#: ../../mod/invite.php:75
-#, php-format
-msgid "%s : Message delivery failed."
-msgstr "%s : Falló el envío del mensaje."
-
-#: ../../mod/invite.php:79
-#, php-format
-msgid "%d message sent."
-msgid_plural "%d messages sent."
-msgstr[0] "%d mensajes enviados."
-msgstr[1] "%d mensajes enviados."
-
-#: ../../mod/invite.php:98
-msgid "You have no more invitations available"
-msgstr "No tiene más invitaciones disponibles"
-
-#: ../../mod/invite.php:129
-msgid "Send invitations"
-msgstr "Enviar invitaciones"
-
-#: ../../mod/invite.php:130
-msgid "Enter email addresses, one per line:"
-msgstr "Introduzca las direcciones de correo electrónico, una por línea:"
-
-#: ../../mod/invite.php:131 ../../mod/mail.php:246
-msgid "Your message:"
-msgstr "Su mensaje:"
-
-#: ../../mod/invite.php:132
-msgid "Please join my community on $Projectname."
-msgstr "Por favor, únase a mi comunidad en $Projectname."
-
-#: ../../mod/invite.php:134
-msgid "You will need to supply this invitation code:"
-msgstr "Tendrá que suministrar este código de invitación:"
-
-#: ../../mod/invite.php:135
-msgid ""
-"1. Register at any $Projectname location (they are all inter-connected)"
-msgstr "1. Regístrese en cualquier sitio de $Projectname (están todos interconectados)"
-
-#: ../../mod/invite.php:137
-msgid "2. Enter my $Projectname network address into the site searchbar."
-msgstr "2. Introduzca mi dirección $Projectname en la caja de búsqueda del sitio."
-
-#: ../../mod/invite.php:138
-msgid "or visit"
-msgstr "o visitar"
-
-#: ../../mod/invite.php:140
-msgid "3. Click [Connect]"
-msgstr "3. Pulse [conectar]"
-
-#: ../../mod/siteinfo.php:15
-#, php-format
-msgid "Version %s"
-msgstr "Versión %s"
-
-#: ../../mod/siteinfo.php:36
-msgid "Installed plugins/addons/apps:"
-msgstr "Extensiones, complementos o aplicaciones instaladas:"
-
-#: ../../mod/siteinfo.php:49
-msgid "No installed plugins/addons/apps"
-msgstr "No hay instalada ninguna extensión, complemento o aplicación"
-
-#: ../../mod/siteinfo.php:62
-msgid ""
-"This is a hub of $Projectname - a global cooperative network of "
-"decentralized privacy enhanced websites."
-msgstr "Este es un sitio integrado en $Projectname - una red cooperativa mundial de sitios web descentralizados de privacidad mejorada."
-
-#: ../../mod/siteinfo.php:64
-msgid "Tag: "
-msgstr "Etiqueta:"
-
-#: ../../mod/siteinfo.php:66
-msgid "Last background fetch: "
-msgstr "Última actualización en segundo plano:"
-
-#: ../../mod/siteinfo.php:68
-msgid "Current load average: "
-msgstr "Carga media actual:"
-
-#: ../../mod/siteinfo.php:71
-msgid "Running at web location"
-msgstr "Corriendo en el sitio web"
-
-#: ../../mod/siteinfo.php:72
-msgid ""
-"Please visit <a href=\"http://hubzilla.org\">hubzilla.org</a> to learn more "
-"about $Projectname."
-msgstr "Por favor, visite <a href=\"http://hubzilla.org\">hubzilla.org</a> para más información sobre $Projectname."
-
-#: ../../mod/siteinfo.php:73
-msgid "Bug reports and issues: please visit"
-msgstr "Informes de errores e incidencias: por favor visite"
-
-#: ../../mod/siteinfo.php:75
-msgid "$projectname issues"
-msgstr "Problemas en $projectname"
-
-#: ../../mod/siteinfo.php:76
-msgid ""
-"Suggestions, praise, etc. - please email \"redmatrix\" at librelist - dot "
-"com"
-msgstr "Sugerencias, elogios, etc - por favor, un correo electrónico a \"redmatrix\" en librelist - punto com"
-
-#: ../../mod/siteinfo.php:78
-msgid "Site Administrators"
-msgstr "Administradores del sitio"
-
-#: ../../mod/item.php:174
-msgid "Unable to locate original post."
-msgstr "No ha sido posible encontrar la entrada original."
-
-#: ../../mod/item.php:423
-msgid "Empty post discarded."
-msgstr "La entrada vacía ha sido desechada."
-
-#: ../../mod/item.php:463
-msgid "Executable content type not permitted to this channel."
-msgstr "Contenido de tipo ejecutable no permitido en este canal."
-
-#: ../../mod/item.php:843
-msgid "Duplicate post suppressed."
-msgstr "Se ha suprimido la entrada duplicada."
-
-#: ../../mod/item.php:973
-msgid "System error. Post not saved."
-msgstr "Error del sistema. La entrada no se ha podido salvar."
-
-#: ../../mod/item.php:1240
-msgid "Unable to obtain post information from database."
-msgstr "No ha sido posible obtener información de la entrada en la base de datos."
-
-#: ../../mod/item.php:1247
-#, php-format
-msgid "You have reached your limit of %1$.0f top level posts."
-msgstr "Ha alcanzado su límite de %1$.0f entradas en la página principal."
-
-#: ../../mod/item.php:1254
-#, php-format
-msgid "You have reached your limit of %1$.0f webpages."
-msgstr "Ha alcanzado su límite de %1$.0f páginas web."
-
-#: ../../mod/layouts.php:177
-msgid "Comanche page description language help"
-msgstr "Página de ayuda del lenguaje de descripción de páginas (PDL) Comanche"
-
-#: ../../mod/layouts.php:181
-msgid "Layout Description"
-msgstr "Descripción de la plantilla"
-
-#: ../../mod/layouts.php:186
-msgid "Download PDL file"
-msgstr "Descargar el fichero PDL"
-
-#: ../../mod/like.php:15
-msgid "Like/Dislike"
-msgstr "Me gusta/No me gusta"
-
-#: ../../mod/like.php:20
-msgid "This action is restricted to members."
-msgstr "Esta acción está restringida solo para miembros."
-
-#: ../../mod/like.php:21
-msgid ""
-"Please <a href=\"rmagic\">login with your $Projectname ID</a> or <a "
-"href=\"register\">register as a new $Projectname member</a> to continue."
-msgstr "Por favor, <a href=\"rmagic\">identifíquese con su $Projectname ID</a> o <a href=\"register\">rregístrese como un nuevo $Projectname member</a> para continuar."
-
-#: ../../mod/like.php:101 ../../mod/like.php:127 ../../mod/like.php:165
-msgid "Invalid request."
-msgstr "Solicitud incorrecta."
-
-#: ../../mod/like.php:142
-msgid "thing"
-msgstr "elemento"
-
-#: ../../mod/like.php:188
-msgid "Channel unavailable."
-msgstr "Canal no disponible."
-
-#: ../../mod/like.php:236
-msgid "Previous action reversed."
-msgstr "Acción anterior revocada."
-
-#: ../../mod/like.php:420
-#, php-format
-msgid "%1$s agrees with %2$s's %3$s"
-msgstr "%3$s de %2$s: %1$s está de acuerdo"
-
-#: ../../mod/like.php:422
-#, php-format
-msgid "%1$s doesn't agree with %2$s's %3$s"
-msgstr "%3$s de %2$s: %1$s no está de acuerdo"
-
-#: ../../mod/like.php:424
-#, php-format
-msgid "%1$s abstains from a decision on %2$s's %3$s"
-msgstr "%3$s de %2$s: %1$s se abstiene"
-
-#: ../../mod/like.php:426
-#, php-format
-msgid "%1$s is attending %2$s's %3$s"
-msgstr "%3$s de %2$s: %1$s participa"
-
-#: ../../mod/like.php:428
-#, php-format
-msgid "%1$s is not attending %2$s's %3$s"
-msgstr "%3$s de %2$s: %1$s no participa"
-
-#: ../../mod/like.php:430
-#, php-format
-msgid "%1$s may attend %2$s's %3$s"
-msgstr "%3$s de %2$s: %1$s quizá participe"
-
-#: ../../mod/like.php:533
-msgid "Action completed."
-msgstr "Acción completada."
-
-#: ../../mod/like.php:534
-msgid "Thank you."
-msgstr "Gracias."
-
-#: ../../mod/locs.php:21 ../../mod/locs.php:50
-msgid "Location not found."
-msgstr "Dirección no encontrada."
-
-#: ../../mod/locs.php:58
-msgid "Location lookup failed."
-msgstr "Ha fallado la búsqueda de la dirección."
-
-#: ../../mod/locs.php:62
-msgid ""
-"Please select another location to become primary before removing the primary"
-" location."
-msgstr "Por favor, seleccione una copia de su canal (un clon) para convertirlo en primario antes de eliminar su canal principal."
-
-#: ../../mod/locs.php:91
-msgid "Syncing locations"
-msgstr "Sincronización de ubicaciones"
-
-#: ../../mod/locs.php:101
-msgid "No locations found."
-msgstr "No encontrada ninguna dirección."
-
-#: ../../mod/locs.php:112
-msgid "Manage Channel Locations"
-msgstr "Gestionar las direcciones del canal"
-
-#: ../../mod/locs.php:115
-msgid "Primary"
-msgstr "Primario"
-
-#: ../../mod/locs.php:116 ../../mod/menu.php:109
-msgid "Drop"
-msgstr "Eliminar"
-
-#: ../../mod/locs.php:118
-msgid "Sync Now"
-msgstr "Sincronizar ahora"
-
-#: ../../mod/locs.php:119
-msgid "Please wait several minutes between consecutive operations."
-msgstr "Por favor, espere algunos minutos entre operaciones consecutivas."
-
-#: ../../mod/locs.php:120
-msgid ""
-"When possible, drop a location by logging into that website/hub and removing"
-" your channel."
-msgstr "Cuando sea posible, elimine una ubicación iniciando sesión en el sitio web o \"hub\" y borrando su canal."
-
-#: ../../mod/locs.php:121
-msgid "Use this form to drop the location if the hub is no longer operating."
-msgstr "Utilice este formulario para eliminar la dirección si el \"hub\" no está funcionando desde hace tiempo."
-
-#: ../../mod/sources.php:32
-msgid "Failed to create source. No channel selected."
-msgstr "Imposible crear el origen de los contenidos. Ningún canal ha sido seleccionado."
-
-#: ../../mod/sources.php:45
-msgid "Source created."
-msgstr "Fuente creada."
-
-#: ../../mod/sources.php:57
-msgid "Source updated."
-msgstr "Fuente actualizada."
-
-#: ../../mod/sources.php:82
-msgid "*"
-msgstr "*"
-
-#: ../../mod/sources.php:89
-msgid "Manage remote sources of content for your channel."
-msgstr "Gestionar contenido de origen remoto para su canal."
-
-#: ../../mod/sources.php:90 ../../mod/sources.php:100
-msgid "New Source"
-msgstr "Nueva fuente"
-
-#: ../../mod/sources.php:101 ../../mod/sources.php:133
-msgid ""
-"Import all or selected content from the following channel into this channel "
-"and distribute it according to your channel settings."
-msgstr "Importar todo el contenido o una selección de los siguientes canales en este canal y distribuirlo de acuerdo con sus ajustes."
-
-#: ../../mod/sources.php:102 ../../mod/sources.php:134
-msgid "Only import content with these words (one per line)"
-msgstr "Importar solo contenido que contenga estas palabras (una por línea)"
-
-#: ../../mod/sources.php:102 ../../mod/sources.php:134
-msgid "Leave blank to import all public content"
-msgstr "Dejar en blanco para importar todo el contenido público"
-
-#: ../../mod/sources.php:103 ../../mod/sources.php:137
-msgid "Channel Name"
-msgstr "Nombre del canal"
-
-#: ../../mod/sources.php:123 ../../mod/sources.php:150
-msgid "Source not found."
-msgstr "Fuente no encontrada"
-
-#: ../../mod/sources.php:130
-msgid "Edit Source"
-msgstr "Editar fuente"
-
-#: ../../mod/sources.php:131
-msgid "Delete Source"
-msgstr "Eliminar fuente"
-
-#: ../../mod/sources.php:158
-msgid "Source removed"
-msgstr "Fuente eliminada"
-
-#: ../../mod/sources.php:160
-msgid "Unable to remove source."
-msgstr "Imposible eliminar la fuente."
-
-#: ../../mod/lostpass.php:15
-msgid "No valid account found."
-msgstr "No se ha encontrado una cuenta válida."
-
-#: ../../mod/lostpass.php:29
-msgid "Password reset request issued. Check your email."
-msgstr "Se ha recibido una solicitud de restablecimiento de contraseña. Consulte su correo electrónico."
-
-#: ../../mod/lostpass.php:35 ../../mod/lostpass.php:103
-#, php-format
-msgid "Site Member (%s)"
-msgstr "Usuario del sitio (%s)"
-
-#: ../../mod/lostpass.php:40
-#, php-format
-msgid "Password reset requested at %s"
-msgstr "Se ha solicitado restablecer la contraseña en %s"
-
-#: ../../mod/lostpass.php:63
-msgid ""
-"Request could not be verified. (You may have previously submitted it.) "
-"Password reset failed."
-msgstr "La solicitud no ha podido ser verificada. (Puede que la haya enviado con anterioridad) El restablecimiento de la contraseña ha fallado."
-
-#: ../../mod/lostpass.php:86 ../../boot.php:1608
-msgid "Password Reset"
-msgstr "Restablecer la contraseña"
-
-#: ../../mod/lostpass.php:87
-msgid "Your password has been reset as requested."
-msgstr "Su contraseña ha sido restablecida según lo solicitó."
-
-#: ../../mod/lostpass.php:88
-msgid "Your new password is"
-msgstr "Su nueva contraseña es"
-
-#: ../../mod/lostpass.php:89
-msgid "Save or copy your new password - and then"
-msgstr "Guarde o copie su nueva contraseña - y después"
-
-#: ../../mod/lostpass.php:90
-msgid "click here to login"
-msgstr "pulse aquí para conectarse"
-
-#: ../../mod/lostpass.php:91
-msgid ""
-"Your password may be changed from the <em>Settings</em> page after "
-"successful login."
-msgstr "Puede cambiar la contraseña en la página <em>Ajustes</em> una vez iniciada la sesión."
-
-#: ../../mod/lostpass.php:108
-#, php-format
-msgid "Your password has changed at %s"
-msgstr "Su contraseña en %s ha sido cambiada"
-
-#: ../../mod/lostpass.php:123
-msgid "Forgot your Password?"
-msgstr "¿Ha olvidado su contraseña?"
-
-#: ../../mod/lostpass.php:124
-msgid ""
-"Enter your email address and submit to have your password reset. Then check "
-"your email for further instructions."
-msgstr "Introduzca y envíe su dirección de correo electrónico para el restablecimiento de su contraseña. Luego revise su correo para obtener más instrucciones."
-
-#: ../../mod/lostpass.php:125
-msgid "Email Address"
-msgstr "Dirección de correo electrónico"
-
-#: ../../mod/lostpass.php:126
-msgid "Reset"
-msgstr "Reiniciar"
-
-#: ../../mod/magic.php:69
-msgid "Hub not found."
-msgstr "Servidor no encontrado"
-
-#: ../../mod/subthread.php:114
-#, php-format
-msgid "%1$s is following %2$s's %3$s"
-msgstr "%1$s está siguiendo %3$s de %2$s"
-
-#: ../../mod/subthread.php:116
-#, php-format
-msgid "%1$s stopped following %2$s's %3$s"
-msgstr "%1$s ha dejado de seguir %3$s de %2$s"
-
-#: ../../mod/mail.php:34
-msgid "Unable to lookup recipient."
-msgstr "Imposible asociar a un destinatario."
-
-#: ../../mod/mail.php:42
-msgid "Unable to communicate with requested channel."
-msgstr "Imposible comunicar con el canal solicitado."
-
-#: ../../mod/mail.php:49
-msgid "Cannot verify requested channel."
-msgstr "No se puede verificar el canal solicitado."
-
-#: ../../mod/mail.php:75
-msgid "Selected channel has private message restrictions. Send failed."
-msgstr "El canal seleccionado tiene restricciones sobre los mensajes privados. El envío falló."
-
-#: ../../mod/mail.php:140
-msgid "Messages"
-msgstr "Mensajes"
-
-#: ../../mod/mail.php:175
-msgid "Message recalled."
-msgstr "Mensaje revocado."
-
-#: ../../mod/mail.php:188
-msgid "Conversation removed."
-msgstr "Conversación eliminada."
-
-#: ../../mod/mail.php:231
-msgid "Requested channel is not in this network"
-msgstr "El canal solicitado no existe en esta red"
-
-#: ../../mod/mail.php:239
-msgid "Send Private Message"
-msgstr "Enviar un mensaje privado"
-
-#: ../../mod/mail.php:240 ../../mod/mail.php:370
-msgid "To:"
-msgstr "Para:"
-
-#: ../../mod/mail.php:243 ../../mod/mail.php:372
-msgid "Subject:"
-msgstr "Asunto:"
-
-#: ../../mod/mail.php:250
-msgid "Send"
-msgstr "Enviar"
-
-#: ../../mod/mail.php:342
-msgid "Delete message"
-msgstr "Borrar mensaje"
-
-#: ../../mod/mail.php:343
-msgid "Delivery report"
-msgstr "Informe de transmisión"
-
-#: ../../mod/mail.php:344
-msgid "Recall message"
-msgstr "Revocar el mensaje"
-
-#: ../../mod/mail.php:346
-msgid "Message has been recalled."
-msgstr "El mensaje ha sido revocado."
-
-#: ../../mod/mail.php:363
-msgid "Delete Conversation"
-msgstr "Eliminar conversación"
-
-#: ../../mod/mail.php:365
-msgid ""
-"No secure communications available. You <strong>may</strong> be able to "
-"respond from the sender's profile page."
-msgstr "Comunicación segura no disponible. Pero <strong>puede</strong> responder desde la página del perfil del remitente."
-
-#: ../../mod/mail.php:369
-msgid "Send Reply"
-msgstr "Responder"
-
-#: ../../mod/mail.php:374
-#, php-format
-msgid "Your message for %s (%s):"
-msgstr "Su mensaje para %s (%s):"
-
-#: ../../mod/suggest.php:35
-msgid ""
-"No suggestions available. If this is a new site, please try again in 24 "
-"hours."
-msgstr "No hay sugerencias disponibles. Si es un sitio nuevo, espere 24 horas y pruebe de nuevo."
-
-#: ../../mod/manage.php:137
-msgid "Create a new channel"
-msgstr "Crear un nuevo canal"
-
-#: ../../mod/manage.php:159
-msgid "Current Channel"
-msgstr "Canal actual"
-
-#: ../../mod/manage.php:161
-msgid "Switch to one of your channels by selecting it."
-msgstr "Cambiar a uno de sus canales seleccionándolo."
-
-#: ../../mod/manage.php:162
-msgid "Default Channel"
-msgstr "Canal principal"
-
-#: ../../mod/manage.php:163
-msgid "Make Default"
-msgstr "Convertir en predeterminado"
-
-#: ../../mod/manage.php:166
-#, php-format
-msgid "%d new messages"
-msgstr "%d mensajes nuevos"
-
-#: ../../mod/manage.php:167
-#, php-format
-msgid "%d new introductions"
-msgstr "%d nuevas isolicitudes de conexión"
-
-#: ../../mod/manage.php:169
-msgid "Delegated Channel"
-msgstr "Canal delegado"
-
-#: ../../mod/tagger.php:96
+#: ../../include/nav.php:127
#, php-format
-msgid "%1$s tagged %2$s's %3$s with %4$s"
-msgstr "%1$s ha etiquetado %3$s de %2$s con %4$s"
-
-#: ../../mod/match.php:22
-msgid "Profile Match"
-msgstr "Perfil compatible"
-
-#: ../../mod/match.php:31
-msgid "No keywords to match. Please add keywords to your default profile."
-msgstr "No hay palabras clave en el perfil principal para poder encontrar perfiles compatibles. Por favor, añada palabras clave a su perfil principal."
-
-#: ../../mod/match.php:63
-msgid "is interested in:"
-msgstr "está interesado en:"
-
-#: ../../mod/match.php:70
-msgid "No matches"
-msgstr "No se han encontrado perfiles compatibles"
-
-#: ../../mod/tagrm.php:44 ../../mod/tagrm.php:94
-msgid "Tag removed"
-msgstr "Etiqueta eliminada."
-
-#: ../../mod/tagrm.php:119
-msgid "Remove Item Tag"
-msgstr "Eliminar etiqueta del elemento."
-
-#: ../../mod/tagrm.php:121
-msgid "Select a tag to remove: "
-msgstr "Seleccionar una etiqueta para eliminar:"
-
-#: ../../mod/menu.php:45
-msgid "Unable to update menu."
-msgstr "No se puede actualizar el menú."
-
-#: ../../mod/menu.php:56
-msgid "Unable to create menu."
-msgstr "No se puede crear el menú."
-
-#: ../../mod/menu.php:94 ../../mod/menu.php:106
-msgid "Menu Name"
-msgstr "Nombre del menú"
-
-#: ../../mod/menu.php:94
-msgid "Unique name (not visible on webpage) - required"
-msgstr "Nombre único (no será visible en la página web) - requerido"
-
-#: ../../mod/menu.php:95 ../../mod/menu.php:107
-msgid "Menu Title"
-msgstr "Título del menú"
-
-#: ../../mod/menu.php:95
-msgid "Visible on webpage - leave empty for no title"
-msgstr "Visible en la página web - no ponga nada si no desea un título"
-
-#: ../../mod/menu.php:96
-msgid "Allow Bookmarks"
-msgstr "Permitir marcadores"
-
-#: ../../mod/menu.php:96 ../../mod/menu.php:153
-msgid "Menu may be used to store saved bookmarks"
-msgstr "El menú se puede usar para guardar marcadores"
-
-#: ../../mod/menu.php:97 ../../mod/menu.php:155
-msgid "Submit and proceed"
-msgstr "Enviar y proceder"
-
-#: ../../mod/menu.php:113
-msgid "Bookmarks allowed"
-msgstr "Marcadores permitidos"
-
-#: ../../mod/menu.php:115
-msgid "Delete this menu"
-msgstr "Borrar este menú"
-
-#: ../../mod/menu.php:116 ../../mod/menu.php:150
-msgid "Edit menu contents"
-msgstr "Editar los contenidos del menú"
-
-#: ../../mod/menu.php:117
-msgid "Edit this menu"
-msgstr "Modificar este menú"
-
-#: ../../mod/menu.php:132
-msgid "Menu could not be deleted."
-msgstr "El menú no puede ser eliminado."
-
-#: ../../mod/menu.php:145
-msgid "Edit Menu"
-msgstr "Modificar el menú"
-
-#: ../../mod/menu.php:149
-msgid "Add or remove entries to this menu"
-msgstr "Añadir o quitar entradas en este menú"
-
-#: ../../mod/menu.php:151
-msgid "Menu name"
-msgstr "Nombre del menú"
+msgid "%s - click to logout"
+msgstr "%s - pulsar para finalizar sesión"
-#: ../../mod/menu.php:151
-msgid "Must be unique, only seen by you"
-msgstr "Debe ser único, solo será visible para usted"
+#: ../../include/nav.php:130
+msgid "Remote authentication"
+msgstr "Acceder desde su servidor"
-#: ../../mod/menu.php:152
-msgid "Menu title"
-msgstr "Título del menú"
+#: ../../include/nav.php:130
+msgid "Click to authenticate to your home hub"
+msgstr "Pulsar para identificarse en su servidor de inicio"
-#: ../../mod/menu.php:152
-msgid "Menu title as seen by others"
-msgstr "El título del menú tal como será visto por los demás"
+#: ../../include/nav.php:144
+msgid "Home Page"
+msgstr "Página de inicio"
-#: ../../mod/menu.php:153
-msgid "Allow bookmarks"
-msgstr "Permitir marcadores"
+#: ../../include/nav.php:148
+msgid "Create an account"
+msgstr "Crear una cuenta"
-#: ../../mod/thing.php:110
-msgid "Thing updated"
-msgstr "Elemento actualizado."
+#: ../../include/nav.php:161
+msgid "Help and documentation"
+msgstr "Ayuda y documentación"
-#: ../../mod/thing.php:162
-msgid "Object store: failed"
-msgstr "Guardar objeto: ha fallado"
+#: ../../include/nav.php:165
+msgid "Applications, utilities, links, games"
+msgstr "Aplicaciones, utilidades, enlaces, juegos"
-#: ../../mod/thing.php:166
-msgid "Thing added"
-msgstr "Elemento añadido"
+#: ../../include/nav.php:167
+msgid "Search site @name, #tag, ?docs, content"
+msgstr "Buscar en el sitio por @nombre, #etiqueta, ?ayuda o contenido"
-#: ../../mod/thing.php:192
-#, php-format
-msgid "OBJ: %1$s %2$s %3$s"
-msgstr "OBJ: %1$s %2$s %3$s"
+#: ../../include/nav.php:170
+msgid "Channel Directory"
+msgstr "Directorio de canales"
-#: ../../mod/thing.php:255
-msgid "Show Thing"
-msgstr "Mostrar elemento"
+#: ../../include/nav.php:182
+msgid "Your grid"
+msgstr "Mi red"
-#: ../../mod/thing.php:262
-msgid "item not found."
-msgstr "elemento no encontrado."
+#: ../../include/nav.php:183
+msgid "Mark all grid notifications seen"
+msgstr "Marcar todas las notificaciones de la red como vistas"
-#: ../../mod/thing.php:295
-msgid "Edit Thing"
-msgstr "Editar elemento"
+#: ../../include/nav.php:185
+msgid "Channel home"
+msgstr "Mi canal"
-#: ../../mod/thing.php:297 ../../mod/thing.php:347
-msgid "Select a profile"
-msgstr "Seleccionar un perfil"
+#: ../../include/nav.php:186
+msgid "Mark all channel notifications seen"
+msgstr "Marcar todas las notificaciones del canal como leídas"
-#: ../../mod/thing.php:301 ../../mod/thing.php:350
-msgid "Post an activity"
-msgstr "Publicar una actividad"
+#: ../../include/nav.php:192
+msgid "Notices"
+msgstr "Avisos"
-#: ../../mod/thing.php:301 ../../mod/thing.php:350
-msgid "Only sends to viewers of the applicable profile"
-msgstr "Sólo enviar a espectadores del perfil pertinente."
+#: ../../include/nav.php:192
+msgid "Notifications"
+msgstr "Notificaciones"
-#: ../../mod/thing.php:303 ../../mod/thing.php:352
-msgid "Name of thing e.g. something"
-msgstr "Nombre del elemento, p. ej.:. \"algo\""
+#: ../../include/nav.php:193
+msgid "See all notifications"
+msgstr "Ver todas las notificaciones"
-#: ../../mod/thing.php:305 ../../mod/thing.php:353
-msgid "URL of thing (optional)"
-msgstr "Dirección del elemento (opcional)"
+#: ../../include/nav.php:196
+msgid "Private mail"
+msgstr "Correo privado"
-#: ../../mod/thing.php:307 ../../mod/thing.php:354
-msgid "URL for photo of thing (optional)"
-msgstr "Dirección para la foto o elemento (opcional)"
+#: ../../include/nav.php:197
+msgid "See all private messages"
+msgstr "Ver todas los mensajes privados"
-#: ../../mod/thing.php:345
-msgid "Add Thing to your Profile"
-msgstr "Añadir alguna cosa a su perfil"
+#: ../../include/nav.php:198
+msgid "Mark all private messages seen"
+msgstr "Marcar todos los mensajes privados como leídos"
-#: ../../mod/uexport.php:51 ../../mod/uexport.php:52
-msgid "Export Channel"
-msgstr "Exportar el canal"
+#: ../../include/nav.php:204
+msgid "Event Calendar"
+msgstr "Calendario de eventos"
-#: ../../mod/uexport.php:53
-msgid ""
-"Export your basic channel information to a file. This acts as a backup of "
-"your connections, permissions, profile and basic data, which can be used to "
-"import your data to a new server hub, but does not contain your content."
-msgstr "Exportar la información básica del canal a un fichero. Este equivale a una copia de seguridad de sus conexiones, el perfil y datos fundamentales, que puede usarse para importar sus datos a un nuevo servidor, pero no incluye su contenido."
+#: ../../include/nav.php:205
+msgid "See all events"
+msgstr "Ver todos los eventos"
-#: ../../mod/uexport.php:54
-msgid "Export Content"
-msgstr "Exportar contenidos"
+#: ../../include/nav.php:206
+msgid "Mark all events seen"
+msgstr "Marcar todos los eventos como leidos"
-#: ../../mod/uexport.php:55
-msgid ""
-"Export your channel information and recent content to a JSON backup that can"
-" be restored or imported to another server hub. This backs up all of your "
-"connections, permissions, profile data and several months of posts. This "
-"file may be VERY large. Please be patient - it may take several minutes for"
-" this download to begin."
-msgstr "Exportar la información sobre su canal y el contenido reciente a un fichero de respaldo JSON, que puede ser restaurado o importado a otro servidor. Este fichero incluye todas sus conexiones, permisos, datos del perfil y publicaciones de varios meses. Puede llegar a ser MUY grande. Por favor, sea paciente, la descarga puede tardar varios minutos en comenzar."
+#: ../../include/nav.php:209
+msgid "Manage Your Channels"
+msgstr "Gestionar sus canales"
-#: ../../mod/uexport.php:56
-msgid "Export your posts from a given year."
-msgstr "Exporta sus publicaciones de un año dado."
+#: ../../include/nav.php:211
+msgid "Account/Channel Settings"
+msgstr "Ajustes de cuenta/canales"
-#: ../../mod/uexport.php:58
-msgid ""
-"You may also export your posts and conversations for a particular year or "
-"month. Adjust the date in your browser location bar to select other dates. "
-"If the export fails (possibly due to memory exhaustion on your server hub), "
-"please try again selecting a more limited date range."
-msgstr "También puede exportar sus mensajes y conversaciones durante un año o mes en particular. Ajuste la fecha en la barra de direcciones del navegador para seleccionar otras fechas. Si la exportación falla (posiblemente debido al agotamiento de la memoria del servidor hub), por favor, intente de nuevo la selección de un rango de fechas más pequeño."
+#: ../../include/nav.php:219
+msgid "Site Setup and Configuration"
+msgstr "Ajustes y configuración del sitio"
-#: ../../mod/uexport.php:59
-#, php-format
-msgid ""
-"To select all posts for a given year, such as this year, visit <a "
-"href=\"%1$s\">%2$s</a>"
-msgstr "Para seleccionar todos los mensajes de un año determinado, como este año, visite <a href=\"%1$s\">%2$s</a>"
+#: ../../include/nav.php:261
+msgid "@name, #tag, ?doc, content"
+msgstr "@nombre, #etiqueta, ?ayuda, contenido"
-#: ../../mod/uexport.php:60
-#, php-format
-msgid ""
-"To select all posts for a given month, such as January of this year, visit "
-"<a href=\"%1$s\">%2$s</a>"
-msgstr "Para seleccionar todos los mensajes de un mes determinado, como el de enero de este año, visite <a href=\"%1$s\">%2$s</a>"
+#: ../../include/nav.php:262
+msgid "Please wait..."
+msgstr "Espere por favor…"
-#: ../../mod/uexport.php:61
-#, php-format
-msgid ""
-"These content files may be imported or restored by visiting <a "
-"href=\"%1$s\">%2$s</a> on any site containing your channel. For best results"
-" please import or restore these in date order (oldest first)."
-msgstr "Estos ficheros pueden ser importados o restaurados visitando <a href=\"%1$s\">%2$s</a> o cualquier sitio que contenga su canal. Para obtener los mejores resultados, por favor, importar o restaurar estos ficheros en orden de fecha (la más antigua primero)."
+#: ../../include/zot.php:680
+msgid "Invalid data packet"
+msgstr "Paquete de datos no válido"
-#: ../../mod/viewconnections.php:59
-msgid "No connections."
-msgstr "Sin conexiones."
+#: ../../include/zot.php:696
+msgid "Unable to verify channel signature"
+msgstr "No ha sido posible de verificar la firma del canal"
-#: ../../mod/viewconnections.php:72
+#: ../../include/zot.php:2332
#, php-format
-msgid "Visit %s's profile [%s]"
-msgstr "Visitar el perfil de %s [%s]"
-
-#: ../../mod/viewconnections.php:101
-msgid "View Connections"
-msgstr "Ver conexiones"
-
-#: ../../mod/viewsrc.php:40
-msgid "Source of Item"
-msgstr "Origen del elemento"
-
-#: ../../mod/xchan.php:6
-msgid "Xchan Lookup"
-msgstr "Búsqueda de canales"
+msgid "Unable to verify site signature for %s"
+msgstr "No ha sido posible de verificar la firma del sitio para %s"
-#: ../../mod/xchan.php:9
-msgid "Lookup xchan beginning with (or webbie): "
-msgstr "Buscar un canal (o un \"webbie\") que comience por:"
+#: ../../include/zot.php:3670
+msgid "invalid target signature"
+msgstr "La firma recibida no es válida"
#: ../../view/theme/redbasic/php/config.php:82
msgid "Focus (Hubzilla default)"
@@ -9602,62 +9773,62 @@ msgstr "Ajustar el tamaño de la foto del autor de la conversación"
msgid "Set size of followup author photos"
msgstr "Ajustar el tamaño de foto de los seguidores del autor"
-#: ../../boot.php:1073
+#: ../../boot.php:1075
#, php-format
msgctxt "opensearch"
msgid "Search %1$s (%2$s)"
msgstr "Buscar %1$s (%2$s)"
-#: ../../boot.php:1073
+#: ../../boot.php:1075
msgctxt "opensearch"
msgid "$Projectname"
msgstr "$Projectname"
-#: ../../boot.php:1390
+#: ../../boot.php:1392
#, php-format
msgid "Update %s failed. See error logs."
msgstr "La actualización %s ha fallado. Mire el informe de errores."
-#: ../../boot.php:1393
+#: ../../boot.php:1395
#, php-format
msgid "Update Error at %s"
msgstr "Error de actualización en %s"
-#: ../../boot.php:1581
+#: ../../boot.php:1583
msgid ""
"Create an account to access services and applications within the Hubzilla"
msgstr "Crear una cuenta para acceder a los servicios y aplicaciones dentro de Hubzilla"
-#: ../../boot.php:1603
+#: ../../boot.php:1605
msgid "Password"
msgstr "Contraseña"
-#: ../../boot.php:1604
+#: ../../boot.php:1606
msgid "Remember me"
msgstr "Recordarme"
-#: ../../boot.php:1607
+#: ../../boot.php:1609
msgid "Forgot your password?"
msgstr "¿Olvidó su contraseña?"
-#: ../../boot.php:2236
+#: ../../boot.php:2238
msgid "toggle mobile"
msgstr "cambiar a modo móvil"
-#: ../../boot.php:2389
+#: ../../boot.php:2391
msgid "Website SSL certificate is not valid. Please correct."
msgstr "El certificado SSL del sitio web no es válido. Por favor, solucione el problema."
-#: ../../boot.php:2392
+#: ../../boot.php:2394
#, php-format
msgid "[hubzilla] Website SSL error for %s"
msgstr "[hubzilla] Error SSL del sitio web en %s"
-#: ../../boot.php:2429
+#: ../../boot.php:2431
msgid "Cron/Scheduled tasks not running."
msgstr "Las tareas del Planificador/Cron no están funcionando."
-#: ../../boot.php:2433
+#: ../../boot.php:2435
#, php-format
msgid "[hubzilla] Cron tasks not running on %s"
msgstr "[hubzilla] Las tareas de Cron no están funcionando en %s"
diff --git a/view/es-es/hstrings.php b/view/es-es/hstrings.php
index d66c2650c..f4512d058 100644
--- a/view/es-es/hstrings.php
+++ b/view/es-es/hstrings.php
@@ -34,1010 +34,12 @@ App::$strings["Not Found"] = "No encontrado";
App::$strings["Page not found."] = "Página no encontrada.";
App::$strings["Remote authentication blocked. You are logged into this site locally. Please logout and retry."] = "La autenticación desde su servidor está bloqueada. Ha iniciado sesión localmente. Por favor, salga de la sesión y vuelva a intentarlo.";
App::$strings["Welcome %s. Remote authentication successful."] = "Bienvenido %s. La identificación desde su servidor se ha llevado a cabo correctamente.";
-App::$strings["No username found in import file."] = "No se ha encontrado el nombre de usuario en el fichero importado.";
-App::$strings["Unable to create a unique channel address. Import failed."] = "No se ha podido crear una dirección de canal única. Ha fallado la importación.";
-App::$strings["Import completed."] = "Importación completada.";
-App::$strings["Cannot locate DNS info for database server '%s'"] = "No se ha podido localizar información de DNS para el servidor de base de datos “%s”";
-App::$strings["Profile Photos"] = "Fotos del perfil";
-App::$strings["Unable to obtain identity information from database"] = "No ha sido posible obtener información sobre la identidad desde la base de datos";
-App::$strings["Empty name"] = "Nombre vacío";
-App::$strings["Name too long"] = "Nombre demasiado largo";
-App::$strings["No account identifier"] = "Ningún identificador de la cuenta";
-App::$strings["Nickname is required."] = "Se requiere un sobrenombre (alias).";
-App::$strings["Reserved nickname. Please choose another."] = "Sobrenombre en uso. Por favor, elija otro.";
-App::$strings["Nickname has unsupported characters or is already being used on this site."] = "El alias contiene caracteres no admitidos o está ya en uso por otros miembros de este sitio.";
-App::$strings["Unable to retrieve created identity"] = "No ha sido posible recuperar la identidad creada";
-App::$strings["Default Profile"] = "Perfil principal";
-App::$strings["Friends"] = "Amigos/as";
-App::$strings["Requested channel is not available."] = "El canal solicitado no está disponible.";
App::$strings["Requested profile is not available."] = "El perfil solicitado no está disponible.";
-App::$strings["Change profile photo"] = "Cambiar la foto del perfil";
-App::$strings["Edit Profiles"] = "Editar perfiles";
-App::$strings["Create New Profile"] = "Crear un nuevo perfil";
-App::$strings["Edit Profile"] = "Editar el perfil";
-App::$strings["Profile Image"] = "Imagen del perfil";
-App::$strings["Visible to everybody"] = "Visible para todos";
-App::$strings["Edit visibility"] = "Editar visibilidad";
-App::$strings["Connect"] = "Conectar";
-App::$strings["Location:"] = "Ubicación:";
-App::$strings["Gender:"] = "Género:";
-App::$strings["Status:"] = "Estado:";
-App::$strings["Homepage:"] = "Página personal:";
-App::$strings["Online Now"] = "Ahora en línea";
-App::$strings["g A l F d"] = "g A l d F";
-App::$strings["F d"] = "d F";
-App::$strings["[today]"] = "[hoy]";
-App::$strings["Birthday Reminders"] = "Recordatorios de cumpleaños";
-App::$strings["Birthdays this week:"] = "Cumpleaños de esta semana:";
-App::$strings["[No description]"] = "[Sin descripción]";
-App::$strings["Event Reminders"] = "Recordatorios de eventos";
-App::$strings["Events this week:"] = "Eventos de esta semana:";
-App::$strings["Full Name:"] = "Nombre completo:";
-App::$strings["Like this channel"] = "Me gusta este canal";
-App::$strings["__ctx:noun__ Like"] = array(
- 0 => "Me gusta",
- 1 => "Me gusta",
-);
-App::$strings["j F, Y"] = "j F Y";
-App::$strings["j F"] = "j F";
-App::$strings["Birthday:"] = "Cumpleaños:";
-App::$strings["Age:"] = "Edad:";
-App::$strings["for %1\$d %2\$s"] = "por %1\$d %2\$s";
-App::$strings["Sexual Preference:"] = "Orientación sexual:";
-App::$strings["Hometown:"] = "Lugar de nacimiento:";
-App::$strings["Tags:"] = "Etiquetas:";
-App::$strings["Political Views:"] = "Posición política:";
-App::$strings["Religion:"] = "Religión:";
-App::$strings["About:"] = "Sobre mí:";
-App::$strings["Hobbies/Interests:"] = "Aficciones o intereses:";
-App::$strings["Likes:"] = "Me gusta:";
-App::$strings["Dislikes:"] = "No me gusta:";
-App::$strings["Contact information and Social Networks:"] = "Información de contacto y redes sociales:";
-App::$strings["My other channels:"] = "Mis otros canales:";
-App::$strings["Musical interests:"] = "Preferencias musicales:";
-App::$strings["Books, literature:"] = "Libros, literatura:";
-App::$strings["Television:"] = "Televisión:";
-App::$strings["Film/dance/culture/entertainment:"] = "Cine, danza, cultura, entretenimiento:";
-App::$strings["Love/Romance:"] = "Vida sentimental o amorosa:";
-App::$strings["Work/employment:"] = "Trabajo:";
-App::$strings["School/education:"] = "Estudios:";
-App::$strings["Profile"] = "Perfil";
-App::$strings["Like this thing"] = "Me gusta esto";
-App::$strings["cover photo"] = "Imagen de portada del perfil";
-App::$strings["created a new post"] = "ha creado una nueva entrada";
-App::$strings["commented on %s's post"] = "ha comentado la entrada de %s";
-App::$strings["Private Message"] = "Mensaje Privado";
-App::$strings["Select"] = "Seleccionar";
-App::$strings["Save to Folder"] = "Guardar en carpeta";
-App::$strings["I will attend"] = "Participaré";
-App::$strings["I will not attend"] = "No participaré";
-App::$strings["I might attend"] = "Quizá participe";
-App::$strings["I agree"] = "Estoy de acuerdo";
-App::$strings["I disagree"] = "No estoy de acuerdo";
-App::$strings["I abstain"] = "Me abstengo";
-App::$strings["View all"] = "Ver todo";
-App::$strings["__ctx:noun__ Dislike"] = array(
- 0 => "No me gusta",
- 1 => "No me gusta",
-);
-App::$strings["Add Star"] = "Destacar añadiendo una estrella";
-App::$strings["Remove Star"] = "Eliminar estrella";
-App::$strings["Toggle Star Status"] = "Activar o desactivar el estado de entrada preferida";
-App::$strings["starred"] = "preferidas";
-App::$strings["Message signature validated"] = "Firma de mensaje validada";
-App::$strings["Message signature incorrect"] = "Firma de mensaje incorrecta";
-App::$strings["Add Tag"] = "Añadir etiqueta";
-App::$strings["I like this (toggle)"] = "Me gusta (cambiar)";
-App::$strings["like"] = "me gusta";
-App::$strings["I don't like this (toggle)"] = "No me gusta esto (cambiar)";
-App::$strings["dislike"] = "no me gusta";
-App::$strings["Share This"] = "Compartir esto";
-App::$strings["share"] = "compartir";
-App::$strings["Delivery Report"] = "Informe de transmisión";
-App::$strings["%d comment"] = array(
- 0 => "%d comentario",
- 1 => "%d comentarios",
-);
-App::$strings["View %s's profile - %s"] = "Ver el perfil de %s - %s";
-App::$strings["to"] = "a";
-App::$strings["via"] = "mediante";
-App::$strings["Wall-to-Wall"] = "De página del perfil a página del perfil (de \"muro\" a \"muro\")";
-App::$strings["via Wall-To-Wall:"] = "Mediante el procedimiento página del perfil a página del perfil (de \"muro\" a \"muro\")";
-App::$strings["from %s"] = "desde %s";
-App::$strings["last edited: %s"] = "último cambio: %s";
-App::$strings["Expires: %s"] = "Caduca: %s";
-App::$strings["Save Bookmarks"] = "Guardar en Marcadores";
-App::$strings["Add to Calendar"] = "Añadir al calendario";
-App::$strings["Mark all seen"] = "Marcar todo como visto";
-App::$strings["__ctx:noun__ Likes"] = "Me gusta";
-App::$strings["__ctx:noun__ Dislikes"] = "No me gusta";
-App::$strings["Close"] = "Cerrar";
-App::$strings["Please wait"] = "Espere por favor";
-App::$strings["[+] show all"] = "[+] mostrar todo:";
-App::$strings["This is you"] = "Este es usted";
-App::$strings["Comment"] = "Comentar";
-App::$strings["Submit"] = "Enviar";
-App::$strings["Bold"] = "Negrita";
-App::$strings["Italic"] = "Itálico ";
-App::$strings["Underline"] = "Subrayar";
-App::$strings["Quote"] = "Citar";
-App::$strings["Code"] = "Código";
-App::$strings["Image"] = "Imagen";
-App::$strings["Insert Link"] = "Insertar enlace";
-App::$strings["Video"] = "Vídeo";
-App::$strings["Preview"] = "Previsualizar";
-App::$strings["Encrypt text"] = "Cifrar texto";
-App::$strings["Not a valid email address"] = "Dirección de correo no válida";
-App::$strings["Your email domain is not among those allowed on this site"] = "Su dirección de correo no pertenece a ninguno de los dominios permitidos en este sitio.";
-App::$strings["Your email address is already registered at this site."] = "Su dirección de correo está ya registrada en este sitio.";
-App::$strings["An invitation is required."] = "Es obligatorio que le inviten.";
-App::$strings["Invitation could not be verified."] = "No se ha podido verificar su invitación.";
-App::$strings["Please enter the required information."] = "Por favor introduzca la información requerida.";
-App::$strings["Failed to store account information."] = "La información de la cuenta no se ha podido guardar.";
-App::$strings["Registration confirmation for %s"] = "Confirmación de registro para %s";
-App::$strings["Registration request at %s"] = "Solicitud de registro en %s";
-App::$strings["Administrator"] = "Administrador";
-App::$strings["your registration password"] = "su contraseña de registro";
-App::$strings["Registration details for %s"] = "Detalles del registro de %s";
-App::$strings["Account approved."] = "Cuenta aprobada.";
-App::$strings["Registration revoked for %s"] = "Registro revocado para %s";
-App::$strings["Account verified. Please login."] = "Cuenta verificada. Por favor, inicie sesión.";
-App::$strings["Click here to upgrade."] = "Pulse aquí para actualizar";
-App::$strings["This action exceeds the limits set by your subscription plan."] = "Esta acción supera los límites establecidos por su plan de suscripción ";
-App::$strings["This action is not available under your subscription plan."] = "Esta acción no está disponible en su plan de suscripción.";
-App::$strings["Male"] = "Hombre";
-App::$strings["Female"] = "Mujer";
-App::$strings["Currently Male"] = "Actualmente hombre";
-App::$strings["Currently Female"] = "Actualmente mujer";
-App::$strings["Mostly Male"] = "Generalmente hombre";
-App::$strings["Mostly Female"] = "Generalmente mujer";
-App::$strings["Transgender"] = "Transgénero";
-App::$strings["Intersex"] = "Intersexual";
-App::$strings["Transsexual"] = "Transexual";
-App::$strings["Hermaphrodite"] = "Hermafrodita";
-App::$strings["Neuter"] = "Neutral";
-App::$strings["Non-specific"] = "No especificado";
-App::$strings["Other"] = "Otro";
-App::$strings["Undecided"] = "Indeciso/a";
-App::$strings["Males"] = "Hombres";
-App::$strings["Females"] = "Mujeres";
-App::$strings["Gay"] = "Homosexual";
-App::$strings["Lesbian"] = "Lesbiana";
-App::$strings["No Preference"] = "Sin preferencias";
-App::$strings["Bisexual"] = "Bisexual";
-App::$strings["Autosexual"] = "Autosexual";
-App::$strings["Abstinent"] = "Casto/a";
-App::$strings["Virgin"] = "Virgen";
-App::$strings["Deviant"] = "Fuera de lo común";
-App::$strings["Fetish"] = "Fetichista";
-App::$strings["Oodles"] = "Orgías";
-App::$strings["Nonsexual"] = "Asexual";
-App::$strings["Single"] = "Soltero/a";
-App::$strings["Lonely"] = "Solo/a";
-App::$strings["Available"] = "Disponible";
-App::$strings["Unavailable"] = "No disponible";
-App::$strings["Has crush"] = "Enamorado/a";
-App::$strings["Infatuated"] = "Apasionado/a";
-App::$strings["Dating"] = "Saliendo con alguien";
-App::$strings["Unfaithful"] = "Infiel";
-App::$strings["Sex Addict"] = "Con adicción al sexo";
-App::$strings["Friends/Benefits"] = "Amigos con algo extra";
-App::$strings["Casual"] = "Casual";
-App::$strings["Engaged"] = "Prometido/a";
-App::$strings["Married"] = "Casado/a";
-App::$strings["Imaginarily married"] = "Casado/a en sueños";
-App::$strings["Partners"] = "Pareja";
-App::$strings["Cohabiting"] = "Cohabitando";
-App::$strings["Common law"] = "Matrimonio tradicional";
-App::$strings["Happy"] = "Felíz";
-App::$strings["Not looking"] = "No estoy buscando";
-App::$strings["Swinger"] = "Libertino";
-App::$strings["Betrayed"] = "Engañado/a";
-App::$strings["Separated"] = "Separado/a";
-App::$strings["Unstable"] = "Inestable";
-App::$strings["Divorced"] = "Divorciado/a";
-App::$strings["Imaginarily divorced"] = "Divorciado/a en sueños";
-App::$strings["Widowed"] = "Viudo/a";
-App::$strings["Uncertain"] = "Indeterminado";
-App::$strings["It's complicated"] = "Es complicado";
-App::$strings["Don't care"] = "No me importa";
-App::$strings["Ask me"] = "Pregúnteme";
-App::$strings["Visible to your default audience"] = "Visible para su público predeterminado.";
-App::$strings["Show"] = "Mostrar";
-App::$strings["Don't show"] = "No mostrar";
-App::$strings["Other networks and post services"] = "Otras redes y servicios de publicación";
-App::$strings["Permissions"] = "Permisos";
-App::$strings[" and "] = " y ";
-App::$strings["public profile"] = "el perfil público";
-App::$strings["%1\$s changed %2\$s to &ldquo;%3\$s&rdquo;"] = "%1\$s ha cambiado %2\$s a &ldquo;%3\$s&rdquo;";
-App::$strings["Visit %1\$s's %2\$s"] = "Visitar %2\$s de %1\$s";
-App::$strings["%1\$s has an updated %2\$s, changing %3\$s."] = "%1\$s ha actualizado %2\$s, cambiando %3\$s.";
-App::$strings["Site Admin"] = "Administrador del sitio";
-App::$strings["Bookmarks"] = "Marcadores";
-App::$strings["Address Book"] = "Libreta de direcciones";
-App::$strings["Login"] = "Iniciar sesión";
-App::$strings["Channel Manager"] = "Administración de canales";
-App::$strings["Grid"] = "Red";
-App::$strings["Settings"] = "Ajustes";
-App::$strings["Webpages"] = "Páginas web";
-App::$strings["Channel Home"] = "Mi canal";
-App::$strings["Photos"] = "Fotos";
-App::$strings["Events"] = "Eventos";
-App::$strings["Directory"] = "Directorio";
-App::$strings["Help"] = "Ayuda";
-App::$strings["Mail"] = "Correo";
-App::$strings["Mood"] = "Estado de ánimo";
-App::$strings["Poke"] = "Toques y otras cosas";
-App::$strings["Chat"] = "Chat";
-App::$strings["Search"] = "Buscar";
-App::$strings["Probe"] = "Probar";
-App::$strings["Suggest"] = "Sugerir";
-App::$strings["Random Channel"] = "Canal aleatorio";
-App::$strings["Invite"] = "Invitar";
-App::$strings["Features"] = "Funcionalidades";
-App::$strings["Language"] = "Idioma";
-App::$strings["Post"] = "Publicación";
-App::$strings["Profile Photo"] = "Foto del perfil";
-App::$strings["Update"] = "Actualizar";
-App::$strings["Install"] = "Instalar";
-App::$strings["Purchase"] = "Comprar";
-App::$strings["Permission denied"] = "Permiso denegado";
-App::$strings["(Unknown)"] = "(Desconocido)";
-App::$strings["Visible to anybody on the internet."] = "Visible para cualquiera en internet.";
-App::$strings["Visible to you only."] = "Visible sólo para usted.";
-App::$strings["Visible to anybody in this network."] = "Visible para cualquiera en esta red.";
-App::$strings["Visible to anybody authenticated."] = "Visible para cualquiera que haya sido autenticado.";
-App::$strings["Visible to anybody on %s."] = "Visible para cualquiera en %s.";
-App::$strings["Visible to all connections."] = "Visible para todas las conexiones.";
-App::$strings["Visible to approved connections."] = "Visible para las conexiones permitidas.";
-App::$strings["Visible to specific connections."] = "Visible para conexiones específicas.";
-App::$strings["Item not found."] = "Elemento no encontrado.";
-App::$strings["Privacy group not found."] = "Grupo de canales no encontrado.";
-App::$strings["Privacy group is empty."] = "El grupo de canales está vacío.";
-App::$strings["Privacy group: %s"] = "Grupo de canales: %s";
-App::$strings["Connection: %s"] = "Conexión: %s";
-App::$strings["Connection not found."] = "Conexión no encontrada";
-App::$strings["female"] = "mujer";
-App::$strings["%1\$s updated her %2\$s"] = "%1\$s ha actualizado su %2\$s";
-App::$strings["male"] = "hombre";
-App::$strings["%1\$s updated his %2\$s"] = "%1\$s ha actualizado su %2\$s";
-App::$strings["%1\$s updated their %2\$s"] = "%1\$s ha actualizado su %2\$s";
-App::$strings["profile photo"] = "foto del perfil";
-App::$strings["view full size"] = "Ver en el tamaño original";
-App::$strings["\$Projectname Notification"] = "Notificación de \$Projectname";
-App::$strings["\$projectname"] = "\$projectname";
-App::$strings["Thank You,"] = "Gracias,";
-App::$strings["%s Administrator"] = "%s Administrador";
-App::$strings["No Subject"] = "Sin asunto";
-App::$strings["Image exceeds website size limit of %lu bytes"] = "La imagen excede el límite de %lu bytes del sitio";
-App::$strings["Image file is empty."] = "El fichero de imagen está vacío. ";
-App::$strings["Unable to process image"] = "No ha sido posible procesar la imagen";
-App::$strings["Photo storage failed."] = "La foto no ha podido ser guardada.";
-App::$strings["a new photo"] = "una nueva foto";
-App::$strings["__ctx:photo_upload__ %1\$s posted %2\$s to %3\$s"] = "%1\$s ha publicado %2\$s en %3\$s";
-App::$strings["Photo Albums"] = "Álbumes de fotos";
-App::$strings["Upload New Photos"] = "Subir nuevas fotos";
-App::$strings["Attachments:"] = "Ficheros adjuntos:";
-App::$strings["l F d, Y \\@ g:i A"] = "l d de F, Y \\@ G:i";
-App::$strings["\$Projectname event notification:"] = "Notificación de eventos de \$Projectname:";
-App::$strings["Starts:"] = "Comienza:";
-App::$strings["Finishes:"] = "Finaliza:";
-App::$strings["Image/photo"] = "Imagen/foto";
-App::$strings["Encrypted content"] = "Contenido cifrado";
-App::$strings["Install %s element: "] = "Instalar el elemento %s:";
-App::$strings["This post contains an installable %s element, however you lack permissions to install it on this site."] = "Esta entrada contiene el elemento instalable %s, sin embargo le faltan permisos para instalarlo en este sitio.";
-App::$strings["webpage"] = "página web";
-App::$strings["layout"] = "plantilla";
-App::$strings["block"] = "bloque";
-App::$strings["menu"] = "menú";
-App::$strings["%1\$s wrote the following %2\$s %3\$s"] = "%1\$s escribió %2\$s siguiente %3\$s";
-App::$strings["post"] = "la entrada";
-App::$strings["Different viewers will see this text differently"] = "Visitantes diferentes verán este texto de forma distinta";
-App::$strings["$1 spoiler"] = "$1 spoiler";
-App::$strings["$1 wrote:"] = "$1 escribió:";
-App::$strings["photo"] = "foto";
-App::$strings["event"] = "evento";
-App::$strings["channel"] = "el canal";
-App::$strings["status"] = "el mensaje de estado";
-App::$strings["comment"] = "el comentario";
-App::$strings["%1\$s likes %2\$s's %3\$s"] = "A %1\$s le gusta %3\$s de %2\$s";
-App::$strings["%1\$s doesn't like %2\$s's %3\$s"] = "A %1\$s no le gusta %3\$s de %2\$s";
-App::$strings["%1\$s is now connected with %2\$s"] = "%1\$s ahora está conectado/a con %2\$s";
-App::$strings["%1\$s poked %2\$s"] = "%1\$s ha dado un toque a %2\$s";
-App::$strings["poked"] = "ha dado un toque a";
-App::$strings["__ctx:mood__ %1\$s is %2\$s"] = "%1\$s está %2\$s";
-App::$strings["__ctx:title__ Likes"] = "Me gusta";
-App::$strings["__ctx:title__ Dislikes"] = "No me gusta";
-App::$strings["__ctx:title__ Agree"] = "De acuerdo";
-App::$strings["__ctx:title__ Disagree"] = "En desacuerdo";
-App::$strings["__ctx:title__ Abstain"] = "Abstención";
-App::$strings["__ctx:title__ Attending"] = "Participaré";
-App::$strings["__ctx:title__ Not attending"] = "No participaré";
-App::$strings["__ctx:title__ Might attend"] = "Quizá participe";
-App::$strings["View %s's profile @ %s"] = "Ver el perfil @ %s de %s";
-App::$strings["Categories:"] = "Categorías:";
-App::$strings["Filed under:"] = "Archivado bajo:";
-App::$strings["View in context"] = "Mostrar en su contexto";
-App::$strings["remove"] = "eliminar";
-App::$strings["Loading..."] = "Cargando...";
-App::$strings["Delete Selected Items"] = "Eliminar elementos seleccionados";
-App::$strings["View Source"] = "Ver la fuente original de la publicación";
-App::$strings["Follow Thread"] = "Seguir este hilo";
-App::$strings["Unfollow Thread"] = "Dejar de seguir este hilo";
-App::$strings["View Profile"] = "Ver el perfil";
-App::$strings["Activity/Posts"] = "Actividad y publicaciones";
-App::$strings["Edit Connection"] = "Editar conexión";
-App::$strings["Message"] = "Mensaje";
-App::$strings["Ratings"] = "Valoraciones";
-App::$strings["%s likes this."] = "A %s le gusta esto.";
-App::$strings["%s doesn't like this."] = "A %s no le gusta esto.";
-App::$strings["<span %1\$s>%2\$d people</span> like this."] = array(
- 0 => "a <span %1\$s>%2\$d personas</span> le gusta esto.",
- 1 => "A <span %1\$s>%2\$d personas</span> les gusta esto.",
-);
-App::$strings["<span %1\$s>%2\$d people</span> don't like this."] = array(
- 0 => "a <span %1\$s>%2\$d personas</span> no les gusta esto.",
- 1 => "A <span %1\$s>%2\$d personas</span> no les gusta esto.",
-);
-App::$strings["and"] = "y";
-App::$strings[", and %d other people"] = array(
- 0 => ", y %d persona más",
- 1 => ", y %d personas más",
-);
-App::$strings["%s like this."] = "A %s le gusta esto.";
-App::$strings["%s don't like this."] = "A %s no le gusta esto.";
-App::$strings["Visible to <strong>everybody</strong>"] = "Visible para <strong>cualquiera</strong>";
-App::$strings["Please enter a link URL:"] = "Por favor, introduzca la dirección del enlace:";
-App::$strings["Please enter a video link/URL:"] = "Por favor, introduzca un enlace de vídeo:";
-App::$strings["Please enter an audio link/URL:"] = "Por favor, introduzca un enlace de audio:";
-App::$strings["Tag term:"] = "Término de la etiqueta:";
-App::$strings["Save to Folder:"] = "Guardar en carpeta:";
-App::$strings["Where are you right now?"] = "¿Donde está ahora?";
-App::$strings["Expires YYYY-MM-DD HH:MM"] = "Caduca YYYY-MM-DD HH:MM";
-App::$strings["Share"] = "Compartir";
-App::$strings["Page link name"] = "Nombre del enlace de la página";
-App::$strings["Post as"] = "Publicar como";
-App::$strings["Upload photo"] = "Subir foto";
-App::$strings["upload photo"] = "subir foto";
-App::$strings["Attach file"] = "Adjuntar fichero";
-App::$strings["attach file"] = "adjuntar fichero";
-App::$strings["Insert web link"] = "Insertar enlace web";
-App::$strings["web link"] = "enlace web";
-App::$strings["Insert video link"] = "Insertar enlace de vídeo";
-App::$strings["video link"] = "enlace de vídeo";
-App::$strings["Insert audio link"] = "Insertar enlace de audio";
-App::$strings["audio link"] = "enlace de audio";
-App::$strings["Set your location"] = "Establecer su ubicación";
-App::$strings["set location"] = "establecer ubicación";
-App::$strings["Toggle voting"] = "Cambiar votación";
-App::$strings["Clear browser location"] = "Eliminar los datos de localización geográfica del navegador";
-App::$strings["clear location"] = "borrar los datos de ubicación";
-App::$strings["Title (optional)"] = "Título (opcional)";
-App::$strings["Categories (optional, comma-separated list)"] = "Categorías (opcional, lista separada por comas)";
-App::$strings["Permission settings"] = "Configuración de permisos";
-App::$strings["permissions"] = "permisos";
-App::$strings["Public post"] = "Entrada pública";
-App::$strings["Example: bob@example.com, mary@example.com"] = "Ejemplo: roberto@ejemplo.com, maría@ejemplo.com";
-App::$strings["Set expiration date"] = "Configurar fecha de caducidad";
-App::$strings["Set publish date"] = "Establecer la fecha de publicación";
-App::$strings["OK"] = "OK";
-App::$strings["Cancel"] = "Cancelar";
-App::$strings["Discover"] = "Descubrir";
-App::$strings["Imported public streams"] = "Contenidos públicos importados";
-App::$strings["Commented Order"] = "Comentarios recientes";
-App::$strings["Sort by Comment Date"] = "Ordenar por fecha de comentario";
-App::$strings["Posted Order"] = "Publicaciones recientes";
-App::$strings["Sort by Post Date"] = "Ordenar por fecha de publicación";
-App::$strings["Personal"] = "Personales";
-App::$strings["Posts that mention or involve you"] = "Publicaciones que le mencionan o involucran";
-App::$strings["New"] = "Nuevas";
-App::$strings["Activity Stream - by date"] = "Contenido - por fecha";
-App::$strings["Starred"] = "Preferidas";
-App::$strings["Favourite Posts"] = "Publicaciones favoritas";
-App::$strings["Spam"] = "Correo basura";
-App::$strings["Posts flagged as SPAM"] = "Publicaciones marcadas como basura";
-App::$strings["Channel"] = "Canal";
-App::$strings["Status Messages and Posts"] = "Mensajes de estado y publicaciones";
-App::$strings["About"] = "Mi perfil";
-App::$strings["Profile Details"] = "Detalles del perfil";
-App::$strings["Files and Storage"] = "Ficheros y repositorio";
-App::$strings["Chatrooms"] = "Salas de chat";
-App::$strings["Saved Bookmarks"] = "Marcadores guardados";
-App::$strings["Manage Webpages"] = "Administrar páginas web";
-App::$strings["__ctx:noun__ Attending"] = array(
- 0 => "Participaré",
- 1 => "Participaré",
-);
-App::$strings["__ctx:noun__ Not Attending"] = array(
- 0 => "No participaré",
- 1 => "No participaré",
-);
-App::$strings["__ctx:noun__ Undecided"] = array(
- 0 => "Indeciso/a",
- 1 => "Indecisos/as",
-);
-App::$strings["__ctx:noun__ Agree"] = array(
- 0 => "De acuerdo",
- 1 => "De acuerdo",
-);
-App::$strings["__ctx:noun__ Disagree"] = array(
- 0 => "En desacuerdo",
- 1 => "En desacuerdo",
-);
-App::$strings["__ctx:noun__ Abstain"] = array(
- 0 => "se abstiene",
- 1 => "Se abstienen",
-);
-App::$strings["%1\$s's bookmarks"] = "Marcadores de %1\$s";
-App::$strings["Missing room name"] = "Sala de chat sin nombre";
-App::$strings["Duplicate room name"] = "Nombre de sala duplicado.";
-App::$strings["Invalid room specifier."] = "Especificador de sala no válido.";
-App::$strings["Room not found."] = "Sala no encontrada.";
-App::$strings["Room is full"] = "La sala está llena.";
-App::$strings["New window"] = "Nueva ventana";
-App::$strings["Open the selected location in a different window or browser tab"] = "Abrir la dirección seleccionada en una ventana o pestaña aparte";
-App::$strings["User '%s' deleted"] = "El usuario '%s' ha sido eliminado";
-App::$strings["Logged out."] = "Desconectado/a.";
-App::$strings["Failed authentication"] = "Autenticación fallida.";
-App::$strings["Login failed."] = "El acceso ha fallado.";
-App::$strings["The form security token was not correct. This probably happened because the form has been opened for too long (>3 hours) before submitting it."] = "El \"token\" de seguridad del formulario no es correcto. Esto ha ocurrido probablemente porque el formulario ha estado abierto demasiado tiempo (>3 horas) antes de ser enviado";
-App::$strings["Default"] = "Predeterminado";
-App::$strings["Frequently"] = "Frecuentemente";
-App::$strings["Hourly"] = "Cada hora";
-App::$strings["Twice daily"] = "Dos veces al día";
-App::$strings["Daily"] = "Diariamente";
-App::$strings["Weekly"] = "Semanalmente";
-App::$strings["Monthly"] = "Mensualmente";
-App::$strings["Friendica"] = "Friendica";
-App::$strings["OStatus"] = "OStatus";
-App::$strings["GNU-Social"] = "GNU Social";
-App::$strings["RSS/Atom"] = "RSS/Atom";
-App::$strings["Email"] = "Correo electrónico";
-App::$strings["Diaspora"] = "Diaspora";
-App::$strings["Facebook"] = "Facebook";
-App::$strings["Zot"] = "Zot";
-App::$strings["LinkedIn"] = "LinkedIn";
-App::$strings["XMPP/IM"] = "XMPP/IM";
-App::$strings["MySpace"] = "MySpace";
-App::$strings["%d invitation available"] = array(
- 0 => "%d invitación pendiente",
- 1 => "%d invitaciones disponibles",
-);
-App::$strings["Advanced"] = "Avanzado";
-App::$strings["Find Channels"] = "Encontrar canales";
-App::$strings["Enter name or interest"] = "Introducir nombre o interés";
-App::$strings["Connect/Follow"] = "Conectar/Seguir";
-App::$strings["Examples: Robert Morgenstein, Fishing"] = "Ejemplos: José Fernández, Pesca";
-App::$strings["Find"] = "Encontrar";
-App::$strings["Channel Suggestions"] = "Sugerencias de canales";
-App::$strings["Random Profile"] = "Perfil aleatorio";
-App::$strings["Invite Friends"] = "Invitar a amigos";
-App::$strings["Advanced example: name=fred and country=iceland"] = "Ejemplo avanzado: nombre=juan y país=españa";
-App::$strings["Saved Folders"] = "Carpetas guardadas";
-App::$strings["Everything"] = "Todo";
-App::$strings["Categories"] = "Categorías";
-App::$strings["%d connection in common"] = array(
- 0 => "%d conexión en común",
- 1 => "%d conexiones en común",
-);
-App::$strings["show more"] = "mostrar más";
-App::$strings["Item was not found."] = "Elemento no encontrado.";
-App::$strings["No source file."] = "Ningún fichero de origen";
-App::$strings["Cannot locate file to replace"] = "No se puede localizar el fichero que va a ser sustituido.";
-App::$strings["Cannot locate file to revise/update"] = "No se puede localizar el fichero para revisar/actualizar";
-App::$strings["File exceeds size limit of %d"] = "El fichero supera el limite de tamaño de %d";
-App::$strings["You have reached your limit of %1$.0f Mbytes attachment storage."] = "Ha alcanzado su límite de %1$.0f Mbytes de almacenamiento de adjuntos.";
-App::$strings["File upload failed. Possible system limit or action terminated."] = "Error de carga, posiblemente por limite del sistema o porque la acción ha finalizado.";
-App::$strings["Stored file could not be verified. Upload failed."] = "El fichero almacenado no ha podido ser verificado. El envío ha fallado.";
-App::$strings["Path not available."] = "Ruta no disponible.";
-App::$strings["Empty pathname"] = "Ruta vacía";
-App::$strings["duplicate filename or path"] = "Nombre duplicado de ruta o fichero";
-App::$strings["Path not found."] = "Ruta no encontrada";
-App::$strings["mkdir failed."] = "mkdir ha fallado.";
-App::$strings["database storage failed."] = "el almacenamiento en la base de datos ha fallado.";
-App::$strings["Empty path"] = "Ruta vacía";
-App::$strings["Miscellaneous"] = "Varios";
-App::$strings["Birthday"] = "Cumpleaños";
-App::$strings["Age: "] = "Edad:";
-App::$strings["YYYY-MM-DD or MM-DD"] = "AAAA-MM-DD o MM-DD";
-App::$strings["Required"] = "Obligatorio";
-App::$strings["never"] = "nunca";
-App::$strings["less than a second ago"] = "hace un instante";
-App::$strings["__ctx:e.g. 22 hours ago, 1 minute ago__ %1\$d %2\$s ago"] = "hace %1\$d %2\$s";
-App::$strings["__ctx:relative_date__ year"] = array(
- 0 => "año",
- 1 => "años",
-);
-App::$strings["__ctx:relative_date__ month"] = array(
- 0 => "mes",
- 1 => "meses",
-);
-App::$strings["__ctx:relative_date__ week"] = array(
- 0 => "semana",
- 1 => "semanas",
-);
-App::$strings["__ctx:relative_date__ day"] = array(
- 0 => "día",
- 1 => "días",
-);
-App::$strings["__ctx:relative_date__ hour"] = array(
- 0 => "hora",
- 1 => "horas",
-);
-App::$strings["__ctx:relative_date__ minute"] = array(
- 0 => "minuto",
- 1 => "minutos",
-);
-App::$strings["__ctx:relative_date__ second"] = array(
- 0 => "segundo",
- 1 => "segundos",
-);
-App::$strings["%1\$s's birthday"] = "Cumpleaños de %1\$s";
-App::$strings["Happy Birthday %1\$s"] = "Feliz cumpleaños %1\$s";
-App::$strings["Directory Options"] = "Opciones del directorio";
-App::$strings["Safe Mode"] = "Modo seguro";
-App::$strings["No"] = "No";
-App::$strings["Yes"] = "Sí";
-App::$strings["Public Forums Only"] = "Solo foros públicos";
-App::$strings["This Website Only"] = "Solo este sitio web";
-App::$strings["%s <!item_type!>"] = "%s <!item_type!>";
-App::$strings["[Hubzilla:Notify] New mail received at %s"] = "[Hubzilla:Aviso] Nuevo mensaje en %s";
-App::$strings["%1\$s, %2\$s sent you a new private message at %3\$s."] = "%1\$s, %2\$s le ha enviado un nuevo mensaje privado en %3\$s.";
-App::$strings["%1\$s sent you %2\$s."] = "%1\$s le ha enviado %2\$s.";
-App::$strings["a private message"] = "un mensaje privado";
-App::$strings["Please visit %s to view and/or reply to your private messages."] = "Por favor visite %s para ver y/o responder a su mensaje privado.";
-App::$strings["%1\$s, %2\$s commented on [zrl=%3\$s]a %4\$s[/zrl]"] = "%1\$s, %2\$s ha comentado [zrl=%3\$s]%4\$s[/zrl]";
-App::$strings["%1\$s, %2\$s commented on [zrl=%3\$s]%4\$s's %5\$s[/zrl]"] = "%1\$s, %2\$s ha comentado [zrl=%3\$s]%5\$s de %4\$s[/zrl] ";
-App::$strings["%1\$s, %2\$s commented on [zrl=%3\$s]your %4\$s[/zrl]"] = "%1\$s, %2\$s ha comentado [zrl=%3\$s]%4\$s creado por usted[/zrl]";
-App::$strings["[Hubzilla:Notify] Comment to conversation #%1\$d by %2\$s"] = "[Hubzilla:Aviso] Nuevo comentario de %2\$s a la conversación #%1\$d";
-App::$strings["%1\$s, %2\$s commented on an item/conversation you have been following."] = "%1\$s, %2\$s ha comentado un elemento/conversación que ha estado siguiendo.";
-App::$strings["Please visit %s to view and/or reply to the conversation."] = "Para ver o comentar la conversación, visite %s";
-App::$strings["[Hubzilla:Notify] %s posted to your profile wall"] = "[Hubzilla:Aviso] %s ha publicado una entrada en su página de inicio del perfil (\"muro\")";
-App::$strings["%1\$s, %2\$s posted to your profile wall at %3\$s"] = "%1\$s, %2\$s ha publicado en su página del perfil en %3\$s";
-App::$strings["%1\$s, %2\$s posted to [zrl=%3\$s]your wall[/zrl]"] = "%1\$s, %2\$s ha publicado en [zrl=%3\$s]su página del perfil[/zrl]";
-App::$strings["[Hubzilla:Notify] %s tagged you"] = "[Hubzilla:Aviso] %s le ha etiquetado";
-App::$strings["%1\$s, %2\$s tagged you at %3\$s"] = "%1\$s, %2\$s le ha etiquetado en %3\$s";
-App::$strings["%1\$s, %2\$s [zrl=%3\$s]tagged you[/zrl]."] = "%1\$s, %2\$s [zrl=%3\$s]le etiquetó[/zrl].";
-App::$strings["[Hubzilla:Notify] %1\$s poked you"] = "[Hubzilla:Aviso] %1\$s le ha dado un toque";
-App::$strings["%1\$s, %2\$s poked you at %3\$s"] = "%1\$s, %2\$s le ha dado un toque en %3\$s";
-App::$strings["%1\$s, %2\$s [zrl=%2\$s]poked you[/zrl]."] = "%1\$s, %2\$s [zrl=%2\$s]le ha dado un toque[/zrl].";
-App::$strings["[Hubzilla:Notify] %s tagged your post"] = "[Hubzilla:Aviso] %s ha etiquetado su publicación";
-App::$strings["%1\$s, %2\$s tagged your post at %3\$s"] = "%1\$s, %2\$s ha etiquetado su publicación en %3\$s";
-App::$strings["%1\$s, %2\$s tagged [zrl=%3\$s]your post[/zrl]"] = "%1\$s, %2\$s ha etiquetado [zrl=%3\$s]su publicación[/zrl]";
-App::$strings["[Hubzilla:Notify] Introduction received"] = "[Hubzilla:Aviso] Ha recibido una solicitud de conexión";
-App::$strings["%1\$s, you've received an new connection request from '%2\$s' at %3\$s"] = "%1\$s, ha recibido una nueva solicitud de conexión de '%2\$s' en %3\$s";
-App::$strings["%1\$s, you've received [zrl=%2\$s]a new connection request[/zrl] from %3\$s."] = "%1\$s, ha recibido [zrl=%2\$s]una nueva solicitud de conexión[/zrl] de %3\$s.";
-App::$strings["You may visit their profile at %s"] = "Puede visitar su perfil en %s";
-App::$strings["Please visit %s to approve or reject the connection request."] = "Por favor, visite %s para permitir o rechazar la solicitad de conexión.";
-App::$strings["[Hubzilla:Notify] Friend suggestion received"] = "[Hubzilla:Aviso] Ha recibido una sugerencia de amistad";
-App::$strings["%1\$s, you've received a friend suggestion from '%2\$s' at %3\$s"] = "%1\$s, ha recibido una sugerencia de conexión de '%2\$s' en %3\$s";
-App::$strings["%1\$s, you've received [zrl=%2\$s]a friend suggestion[/zrl] for %3\$s from %4\$s."] = "%1\$s, ha recibido [zrl=%2\$s]una sugerencia de conexión[/zrl] para %3\$s de %4\$s.";
-App::$strings["Name:"] = "Nombre:";
-App::$strings["Photo:"] = "Foto:";
-App::$strings["Please visit %s to approve or reject the suggestion."] = "Por favor, visite %s para aprobar o rechazar la sugerencia.";
-App::$strings["[Hubzilla:Notify]"] = "[Hubzilla:Aviso]";
-App::$strings["This event has been added to your calendar."] = "Este evento ha sido añadido a su calendario.";
-App::$strings["Not specified"] = "Sin especificar";
-App::$strings["Needs Action"] = "Necesita de una intervención";
-App::$strings["Completed"] = "Completado/a";
-App::$strings["In Process"] = "En proceso";
-App::$strings["Cancelled"] = "Cancelado/a";
-App::$strings["General Features"] = "Funcionalidades básicas";
-App::$strings["Content Expiration"] = "Caducidad del contenido";
-App::$strings["Remove posts/comments and/or private messages at a future time"] = "Eliminar publicaciones/comentarios y/o mensajes privados más adelante";
-App::$strings["Multiple Profiles"] = "Múltiples perfiles";
-App::$strings["Ability to create multiple profiles"] = "Capacidad de crear múltiples perfiles";
-App::$strings["Advanced Profiles"] = "Perfiles avanzados";
-App::$strings["Additional profile sections and selections"] = "Secciones y selecciones de perfil adicionales";
-App::$strings["Profile Import/Export"] = "Importar/Exportar perfil";
-App::$strings["Save and load profile details across sites/channels"] = "Guardar y cargar detalles del perfil a través de sitios/canales";
-App::$strings["Web Pages"] = "Páginas web";
-App::$strings["Provide managed web pages on your channel"] = "Proveer páginas web gestionadas en su canal";
-App::$strings["Hide Rating"] = "Ocultar las valoraciones";
-App::$strings["Hide the rating buttons on your channel and profile pages. Note: People can still rate you somewhere else."] = "Ocultar los botones de valoración en su canal y página de perfil. Tenga en cuenta, sin embargo, que la gente podrá expresar su valoración en otros lugares.";
-App::$strings["Private Notes"] = "Notas privadas";
-App::$strings["Enables a tool to store notes and reminders (note: not encrypted)"] = "Habilita una herramienta para guardar notas y recordatorios (advertencia: las notas no estarán cifradas)";
-App::$strings["Navigation Channel Select"] = "Navegación por el selector de canales";
-App::$strings["Change channels directly from within the navigation dropdown menu"] = "Cambiar de canales directamente desde el menú de navegación desplegable";
-App::$strings["Photo Location"] = "Ubicación de las fotos";
-App::$strings["If location data is available on uploaded photos, link this to a map."] = "Si los datos de ubicación están disponibles en las fotos subidas, enlazar estas a un mapa.";
-App::$strings["Access Controlled Chatrooms"] = "Salas de chat moderadas";
-App::$strings["Provide chatrooms and chat services with access control."] = "Proporcionar salas y servicios de chat moderados.";
-App::$strings["Smart Birthdays"] = "Cumpleaños inteligentes";
-App::$strings["Make birthday events timezone aware in case your friends are scattered across the planet."] = "Enlazar los eventos de cumpleaños con el huso horario en el caso de que sus amigos estén dispersos por el mundo.";
-App::$strings["Expert Mode"] = "Modo de experto";
-App::$strings["Enable Expert Mode to provide advanced configuration options"] = "Habilitar el modo de experto para acceder a opciones avanzadas de configuración";
-App::$strings["Premium Channel"] = "Canal premium";
-App::$strings["Allows you to set restrictions and terms on those that connect with your channel"] = "Le permite configurar restricciones y normas de uso a aquellos que conectan con su canal";
-App::$strings["Post Composition Features"] = "Opciones para la redacción de entradas";
-App::$strings["Large Photos"] = "Fotos de gran tamaño";
-App::$strings["Include large (1024px) photo thumbnails in posts. If not enabled, use small (640px) photo thumbnails"] = "Incluir miniaturas de fotos grandes (1024px) en publicaciones. Si no está habilitado, usar miniaturas pequeñas (640px)";
-App::$strings["Channel Sources"] = "Orígenes de los contenidos del canal";
-App::$strings["Automatically import channel content from other channels or feeds"] = "Importar automáticamente contenido de otros canales o \"feeds\"";
-App::$strings["Even More Encryption"] = "Más cifrado todavía";
-App::$strings["Allow optional encryption of content end-to-end with a shared secret key"] = "Permitir cifrado adicional de contenido \"punto-a-punto\" con una clave secreta compartida.";
-App::$strings["Enable Voting Tools"] = "Permitir entradas con votación";
-App::$strings["Provide a class of post which others can vote on"] = "Proveer una clase de publicación en la que otros puedan votar";
-App::$strings["Delayed Posting"] = "Publicación aplazada";
-App::$strings["Allow posts to be published at a later date"] = "Permitir mensajes que se publicarán en una fecha posterior";
-App::$strings["Suppress Duplicate Posts/Comments"] = "Prevenir entradas o comentarios duplicados";
-App::$strings["Prevent posts with identical content to be published with less than two minutes in between submissions."] = "Prevenir que entradas con contenido idéntico se publiquen con menos de dos minutos de intervalo.";
-App::$strings["Network and Stream Filtering"] = "Filtrado del contenido";
-App::$strings["Search by Date"] = "Buscar por fecha";
-App::$strings["Ability to select posts by date ranges"] = "Capacidad de seleccionar entradas por rango de fechas";
-App::$strings["Privacy Groups"] = "Grupos de canales";
-App::$strings["Enable management and selection of privacy groups"] = "Activar la gestión y selección de grupos de canales";
-App::$strings["Saved Searches"] = "Búsquedas guardadas";
-App::$strings["Save search terms for re-use"] = "Guardar términos de búsqueda para su reutilización";
-App::$strings["Network Personal Tab"] = "Actividad personal";
-App::$strings["Enable tab to display only Network posts that you've interacted on"] = "Habilitar una pestaña en la cual se muestren solo las entradas en las que ha participado.";
-App::$strings["Network New Tab"] = "Contenido nuevo";
-App::$strings["Enable tab to display all new Network activity"] = "Habilitar una pestaña en la que se muestre solo el contenido nuevo";
-App::$strings["Affinity Tool"] = "Herramienta de afinidad";
-App::$strings["Filter stream activity by depth of relationships"] = "Filtrar el contenido según la profundidad de las relaciones";
-App::$strings["Connection Filtering"] = "Filtrado de conexiones";
-App::$strings["Filter incoming posts from connections based on keywords/content"] = "Filtrar publicaciones entrantes de conexiones por palabras clave o contenido";
-App::$strings["Suggest Channels"] = "Sugerir canales";
-App::$strings["Show channel suggestions"] = "Mostrar sugerencias de canales";
-App::$strings["Post/Comment Tools"] = "Gestión de entradas y comentarios";
-App::$strings["Community Tagging"] = "Etiquetas de la comunidad";
-App::$strings["Ability to tag existing posts"] = "Capacidad de etiquetar entradas existentes";
-App::$strings["Post Categories"] = "Categorías de entradas";
-App::$strings["Add categories to your posts"] = "Añadir categorías a sus publicaciones";
-App::$strings["Ability to file posts under folders"] = "Capacidad de archivar entradas en carpetas";
-App::$strings["Dislike Posts"] = "Desagrado de publicaciones";
-App::$strings["Ability to dislike posts/comments"] = "Capacidad de mostrar desacuerdo con el contenido de entradas y comentarios";
-App::$strings["Star Posts"] = "Entradas destacadas";
-App::$strings["Ability to mark special posts with a star indicator"] = "Capacidad de marcar entradas destacadas con un indicador de estrella";
-App::$strings["Tag Cloud"] = "Nube de etiquetas";
-App::$strings["Provide a personal tag cloud on your channel page"] = "Proveer nube de etiquetas personal en su página de canal";
-App::$strings["Channel is blocked on this site."] = "El canal está bloqueado en este sitio.";
-App::$strings["Channel location missing."] = "Falta la dirección del canal.";
-App::$strings["Response from remote channel was incomplete."] = "Respuesta incompleta del canal.";
-App::$strings["Channel was deleted and no longer exists."] = "El canal ha sido eliminado y ya no existe.";
-App::$strings["Protocol disabled."] = "Protocolo deshabilitado.";
-App::$strings["Channel discovery failed."] = "El intento de acceder al canal ha fallado.";
-App::$strings["Cannot connect to yourself."] = "No puede conectarse consigo mismo.";
-App::$strings["A deleted group with this name was revived. Existing item permissions <strong>may</strong> apply to this group and any future members. If this is not what you intended, please create another group with a different name."] = "Un grupo suprimido con este nombre ha sido restablecido. <strong>Es posible</strong> que los permisos existentes sean aplicados a este grupo y sus futuros miembros. Si no quiere esto, por favor cree otro grupo con un nombre diferente.";
-App::$strings["Add new connections to this privacy group"] = "Añadir conexiones nuevas a este grupo de canales";
-App::$strings["All Channels"] = "Todos los canales";
-App::$strings["edit"] = "editar";
-App::$strings["Edit group"] = "Editar grupo";
-App::$strings["Add privacy group"] = "Añadir un grupo de canales";
-App::$strings["Channels not in any privacy group"] = "Sin canales en ningún grupo";
-App::$strings["add"] = "añadir";
-App::$strings["Invalid data packet"] = "Paquete de datos no válido";
-App::$strings["Unable to verify channel signature"] = "No ha sido posible de verificar la firma del canal";
-App::$strings["Unable to verify site signature for %s"] = "No ha sido posible de verificar la firma del sitio para %s";
-App::$strings["invalid target signature"] = "La firma recibida no es válida";
-App::$strings["Logout"] = "Finalizar sesión";
-App::$strings["End this session"] = "Finalizar esta sesión";
-App::$strings["Home"] = "Inicio";
-App::$strings["Your posts and conversations"] = "Sus publicaciones y conversaciones";
-App::$strings["Your profile page"] = "Su página del perfil";
-App::$strings["Manage/Edit profiles"] = "Administrar/editar perfiles";
-App::$strings["Edit your profile"] = "Editar su perfil";
-App::$strings["Your photos"] = "Sus fotos";
-App::$strings["Your files"] = "Sus ficheros";
-App::$strings["Your chatrooms"] = "Sus salas de chat";
-App::$strings["Your bookmarks"] = "Sus marcadores";
-App::$strings["Your webpages"] = "Sus páginas web";
-App::$strings["Sign in"] = "Acceder";
-App::$strings["%s - click to logout"] = "%s - pulsar para finalizar sesión";
-App::$strings["Remote authentication"] = "Acceder desde su servidor";
-App::$strings["Click to authenticate to your home hub"] = "Pulsar para identificarse en su servidor de inicio";
-App::$strings["Home Page"] = "Página de inicio";
-App::$strings["Register"] = "Registrarse";
-App::$strings["Create an account"] = "Crear una cuenta";
-App::$strings["Help and documentation"] = "Ayuda y documentación";
-App::$strings["Apps"] = "Aplicaciones";
-App::$strings["Applications, utilities, links, games"] = "Aplicaciones, utilidades, enlaces, juegos";
-App::$strings["Search site @name, #tag, ?docs, content"] = "Buscar en el sitio por @nombre, #etiqueta, ?ayuda o contenido";
-App::$strings["Channel Directory"] = "Directorio de canales";
-App::$strings["Your grid"] = "Mi red";
-App::$strings["Mark all grid notifications seen"] = "Marcar todas las notificaciones de la red como vistas";
-App::$strings["Channel home"] = "Mi canal";
-App::$strings["Mark all channel notifications seen"] = "Marcar todas las notificaciones del canal como leídas";
-App::$strings["Connections"] = "Conexiones";
-App::$strings["Notices"] = "Avisos";
-App::$strings["Notifications"] = "Notificaciones";
-App::$strings["See all notifications"] = "Ver todas las notificaciones";
-App::$strings["Mark all system notifications seen"] = "Marcar todas las notificaciones de sistema como leídas";
-App::$strings["Private mail"] = "Correo privado";
-App::$strings["See all private messages"] = "Ver todas los mensajes privados";
-App::$strings["Mark all private messages seen"] = "Marcar todos los mensajes privados como leídos";
-App::$strings["Inbox"] = "Bandeja de entrada";
-App::$strings["Outbox"] = "Bandeja de salida";
-App::$strings["New Message"] = "Nuevo mensaje";
-App::$strings["Event Calendar"] = "Calendario de eventos";
-App::$strings["See all events"] = "Ver todos los eventos";
-App::$strings["Mark all events seen"] = "Marcar todos los eventos como leidos";
-App::$strings["Manage Your Channels"] = "Gestionar sus canales";
-App::$strings["Account/Channel Settings"] = "Ajustes de cuenta/canales";
-App::$strings["Admin"] = "Administrador";
-App::$strings["Site Setup and Configuration"] = "Ajustes y configuración del sitio";
-App::$strings["@name, #tag, ?doc, content"] = "@nombre, #etiqueta, ?ayuda, contenido";
-App::$strings["Please wait..."] = "Espere por favor…";
-App::$strings["System"] = "Sistema";
-App::$strings["Create Personal App"] = "Crear una aplicación personal";
-App::$strings["Edit Personal App"] = "Editar una aplicación personal";
-App::$strings["Ignore/Hide"] = "Ignorar/Ocultar";
-App::$strings["Suggestions"] = "Sugerencias";
-App::$strings["See more..."] = "Ver más...";
-App::$strings["You have %1$.0f of %2$.0f allowed connections."] = "Tiene %1$.0f de %2$.0f conexiones permitidas.";
-App::$strings["Add New Connection"] = "Añadir nueva conexión";
-App::$strings["Enter channel address"] = "Dirección del canal";
-App::$strings["Examples: bob@example.com, https://example.com/barbara"] = "Ejemplos: manuel@ejemplo.com, https://ejemplo.com/carmen";
-App::$strings["Notes"] = "Notas";
-App::$strings["Save"] = "Guardar";
-App::$strings["Remove term"] = "Eliminar término";
-App::$strings["Archives"] = "Hemeroteca";
-App::$strings["Me"] = "Yo";
-App::$strings["Family"] = "Familia";
-App::$strings["Acquaintances"] = "Conocidos/as";
-App::$strings["All"] = "Todos/as";
-App::$strings["Refresh"] = "Recargar";
-App::$strings["Account settings"] = "Configuración de la cuenta";
-App::$strings["Channel settings"] = "Configuración del canal";
-App::$strings["Additional features"] = "Funcionalidades";
-App::$strings["Feature/Addon settings"] = "Complementos";
-App::$strings["Display settings"] = "Ajustes de visualización";
-App::$strings["Manage locations"] = "Gestión de ubicaciones (clones) del canal";
-App::$strings["Export channel"] = "Exportar canal";
-App::$strings["Connected apps"] = "Aplicaciones conectadas";
-App::$strings["Connection Default Permissions"] = "Permisos predeterminados de conexión";
-App::$strings["Premium Channel Settings"] = "Configuración del canal premium";
-App::$strings["Private Mail Menu"] = "Menú de correo privado";
-App::$strings["Combined View"] = "Vista combinada";
-App::$strings["Conversations"] = "Conversaciones";
-App::$strings["Received Messages"] = "Mensajes recibidos";
-App::$strings["Sent Messages"] = "Enviar mensajes";
-App::$strings["No messages."] = "Sin mensajes.";
-App::$strings["Delete conversation"] = "Eliminar conversación";
-App::$strings["Events Menu"] = "Menú de eventos";
-App::$strings["Day View"] = "Eventos del día";
-App::$strings["Week View"] = "Eventos de la semana";
-App::$strings["Month View"] = "Eventos del mes";
-App::$strings["Export"] = "Exportar";
-App::$strings["Import"] = "Importar";
-App::$strings["Events Tools"] = "Gestión de eventos";
-App::$strings["Export Calendar"] = "Exportar el calendario";
-App::$strings["Import Calendar"] = "Importar un calendario";
-App::$strings["Overview"] = "Resumen";
-App::$strings["Chat Members"] = "Miembros del chat";
-App::$strings["Bookmarked Chatrooms"] = "Salas de chat preferidas";
-App::$strings["Suggested Chatrooms"] = "Salas de chat sugeridas";
-App::$strings["photo/image"] = "foto/imagen";
-App::$strings["Click to show more"] = "Hacer clic para ver más";
-App::$strings["Rating Tools"] = "Valoraciones";
-App::$strings["Rate Me"] = "Valorar este canal";
-App::$strings["View Ratings"] = "Mostrar las valoraciones";
-App::$strings["Public Hubs"] = "Servidores públicos";
-App::$strings["Forums"] = "Foros";
-App::$strings["Tasks"] = "Tareas";
-App::$strings["Documentation"] = "Documentación";
-App::$strings["Project/Site Information"] = "Información sobre el proyecto o sitio";
-App::$strings["For Members"] = "Para los miembros";
-App::$strings["For Administrators"] = "Para los administradores";
-App::$strings["For Developers"] = "Para los desarrolladores";
-App::$strings["Site"] = "Sitio";
-App::$strings["Accounts"] = "Cuentas";
-App::$strings["Member registrations waiting for confirmation"] = "Inscripciones de nuevos miembros pendientes de aprobación";
-App::$strings["Channels"] = "Canales";
-App::$strings["Security"] = "Seguridad";
-App::$strings["Plugins"] = "Extensiones";
-App::$strings["Themes"] = "Temas";
-App::$strings["Inspect queue"] = "Examinar la cola";
-App::$strings["Profile Fields"] = "Campos del perfil";
-App::$strings["DB updates"] = "Actualizaciones de la base de datos";
-App::$strings["Logs"] = "Informes";
-App::$strings["Plugin Features"] = "Extensiones";
-App::$strings["View Photo"] = "Ver foto";
-App::$strings["Edit Album"] = "Editar álbum";
-App::$strings["Tags"] = "Etiquetas";
-App::$strings["Keywords"] = "Palabras clave";
-App::$strings["have"] = "tener";
-App::$strings["has"] = "tiene";
-App::$strings["want"] = "quiero";
-App::$strings["wants"] = "quiere";
-App::$strings["likes"] = "gusta de";
-App::$strings["dislikes"] = "no gusta de";
-App::$strings["Delete this item?"] = "¿Borrar este elemento?";
-App::$strings["[-] show less"] = "[-] mostrar menos";
-App::$strings["[+] expand"] = "[+] expandir";
-App::$strings["[-] collapse"] = "[-] contraer";
-App::$strings["Password too short"] = "Contraseña demasiado corta";
-App::$strings["Passwords do not match"] = "Las contraseñas no coinciden";
-App::$strings["everybody"] = "cualquiera";
-App::$strings["Secret Passphrase"] = "Contraseña secreta";
-App::$strings["Passphrase hint"] = "Pista de contraseña";
-App::$strings["Notice: Permissions have changed but have not yet been submitted."] = "Aviso: los permisos han cambiado pero aún no han sido enviados.";
-App::$strings["close all"] = "cerrar todo";
-App::$strings["Nothing new here"] = "Nada nuevo por aquí";
-App::$strings["Rate This Channel (this is public)"] = "Valorar este canal (esto es público)";
-App::$strings["Rating"] = "Valoración";
-App::$strings["Describe (optional)"] = "Describir (opcional)";
-App::$strings["Please enter a link URL"] = "Por favor, introduzca una dirección de enlace";
-App::$strings["Unsaved changes. Are you sure you wish to leave this page?"] = "Cambios no guardados. ¿Está seguro de que desea abandonar la página?";
-App::$strings["Location"] = "Ubicación";
-App::$strings["timeago.prefixAgo"] = "timeago.prefixAgo";
-App::$strings["timeago.prefixFromNow"] = "timeago.prefixFromNow";
-App::$strings["ago"] = "antes";
-App::$strings["from now"] = "desde ahora";
-App::$strings["less than a minute"] = "menos de un minuto";
-App::$strings["about a minute"] = "alrededor de un minuto";
-App::$strings["%d minutes"] = "%d minutos";
-App::$strings["about an hour"] = "alrededor de una hora";
-App::$strings["about %d hours"] = "alrededor de %d horas";
-App::$strings["a day"] = "un día";
-App::$strings["%d days"] = "%d días";
-App::$strings["about a month"] = "alrededor de un mes";
-App::$strings["%d months"] = "%d meses";
-App::$strings["about a year"] = "alrededor de un año";
-App::$strings["%d years"] = "%d años";
-App::$strings[" "] = " ";
-App::$strings["timeago.numbers"] = "timeago.numbers";
-App::$strings["January"] = "enero";
-App::$strings["February"] = "febrero";
-App::$strings["March"] = "marzo";
-App::$strings["April"] = "abril";
-App::$strings["__ctx:long__ May"] = "mayo";
-App::$strings["June"] = "junio";
-App::$strings["July"] = "julio";
-App::$strings["August"] = "agosto";
-App::$strings["September"] = "septiembre";
-App::$strings["October"] = "octubre";
-App::$strings["November"] = "noviembre";
-App::$strings["December"] = "diciembre";
-App::$strings["Jan"] = "ene";
-App::$strings["Feb"] = "feb";
-App::$strings["Mar"] = "mar";
-App::$strings["Apr"] = "abr";
-App::$strings["__ctx:short__ May"] = "may";
-App::$strings["Jun"] = "jun";
-App::$strings["Jul"] = "jul";
-App::$strings["Aug"] = "ago";
-App::$strings["Sep"] = "sep";
-App::$strings["Oct"] = "oct";
-App::$strings["Nov"] = "nov";
-App::$strings["Dec"] = "dic";
-App::$strings["Sunday"] = "domingo";
-App::$strings["Monday"] = "lunes";
-App::$strings["Tuesday"] = "martes";
-App::$strings["Wednesday"] = "miércoles";
-App::$strings["Thursday"] = "jueves";
-App::$strings["Friday"] = "viernes";
-App::$strings["Saturday"] = "sábado";
-App::$strings["Sun"] = "dom";
-App::$strings["Mon"] = "lun";
-App::$strings["Tue"] = "mar";
-App::$strings["Wed"] = "mié";
-App::$strings["Thu"] = "jue";
-App::$strings["Fri"] = "vie";
-App::$strings["Sat"] = "sáb";
-App::$strings["__ctx:calendar__ today"] = "hoy";
-App::$strings["__ctx:calendar__ month"] = "mes";
-App::$strings["__ctx:calendar__ week"] = "semana";
-App::$strings["__ctx:calendar__ day"] = "día";
-App::$strings["__ctx:calendar__ All day"] = "Todos los días";
-App::$strings["No recipient provided."] = "No se ha especificado ningún destinatario.";
-App::$strings["[no subject]"] = "[sin asunto]";
-App::$strings["Unable to determine sender."] = "No ha sido posible determinar el remitente. ";
-App::$strings["Stored post could not be verified."] = "No se han podido verificar las publicaciones guardadas.";
-App::$strings["Cannot create a duplicate channel identifier on this system. Import failed."] = "No se ha podido crear un canal con un identificador que ya existe en este sistema. La importación ha fallado.";
-App::$strings["Channel clone failed. Import failed."] = "La clonación del canal no ha salido bien. La importación ha fallado.";
-App::$strings["Cloned channel not found. Import failed."] = "No se ha podido importar el canal porque el canal clonado no se ha encontrado.";
-App::$strings["Embedded content"] = "Contenido incorporado";
-App::$strings["Embedding disabled"] = "Incrustación deshabilitada";
-App::$strings["New Page"] = "Nueva página";
-App::$strings["View"] = "Ver";
-App::$strings["Actions"] = "Acciones";
-App::$strings["Page Link"] = "Vínculo de la página";
-App::$strings["Title"] = "Título";
-App::$strings["Created"] = "Creado";
-App::$strings["Edited"] = "Editado";
-App::$strings["Can view my normal stream and posts"] = "Pueden verse mi actividad y publicaciones normales";
-App::$strings["Can view my default channel profile"] = "Puede verse mi perfil de canal predeterminado.";
-App::$strings["Can view my connections"] = "Pueden verse mis conexiones";
-App::$strings["Can view my file storage and photos"] = "Pueden verse mi repositorio de ficheros y mis fotos";
-App::$strings["Can view my webpages"] = "Pueden verse mis páginas web";
-App::$strings["Can send me their channel stream and posts"] = "Me pueden enviar sus entradas y contenidos del canal";
-App::$strings["Can post on my channel page (\"wall\")"] = "Pueden crearse entradas en mi página de inicio del canal (“muro”)";
-App::$strings["Can comment on or like my posts"] = "Pueden publicarse comentarios en mis publicaciones o marcar mis entradas con 'me gusta'.";
-App::$strings["Can send me private mail messages"] = "Se me pueden enviar mensajes privados";
-App::$strings["Can like/dislike stuff"] = "Puede marcarse contenido como me gusta/no me gusta";
-App::$strings["Profiles and things other than posts/comments"] = "Perfiles y otras cosas aparte de publicaciones/comentarios";
-App::$strings["Can forward to all my channel contacts via post @mentions"] = "Puede enviarse una entrada a todos mis contactos del canal mediante una @mención";
-App::$strings["Advanced - useful for creating group forum channels"] = "Avanzado - útil para crear canales de foros de discusión o grupos";
-App::$strings["Can chat with me (when available)"] = "Se puede charlar conmigo (cuando esté disponible)";
-App::$strings["Can write to my file storage and photos"] = "Puede escribirse en mi repositorio de ficheros y fotos";
-App::$strings["Can edit my webpages"] = "Pueden editarse mis páginas web";
-App::$strings["Can source my public posts in derived channels"] = "Pueden utilizarse mis publicaciones públicas como origen de contenidos en canales derivados";
-App::$strings["Somewhat advanced - very useful in open communities"] = "Algo avanzado - muy útil en comunidades abiertas";
-App::$strings["Can administer my channel resources"] = "Pueden administrarse mis recursos del canal";
-App::$strings["Extremely advanced. Leave this alone unless you know what you are doing"] = "Muy avanzado. Déjelo a no ser que sepa bien lo que está haciendo.";
-App::$strings["Social Networking"] = "Redes sociales";
-App::$strings["Social - Mostly Public"] = "Social - Público en su mayor parte";
-App::$strings["Social - Restricted"] = "Social - Restringido";
-App::$strings["Social - Private"] = "Social - Privado";
-App::$strings["Community Forum"] = "Foro de discusión";
-App::$strings["Forum - Mostly Public"] = "Foro - Público en su mayor parte";
-App::$strings["Forum - Restricted"] = "Foro - Restringido";
-App::$strings["Forum - Private"] = "Foro - Privado";
-App::$strings["Feed Republish"] = "Republicar un \"feed\"";
-App::$strings["Feed - Mostly Public"] = "Feed - Público en su mayor parte";
-App::$strings["Feed - Restricted"] = "Feed - Restringido";
-App::$strings["Special Purpose"] = "Propósito especial";
-App::$strings["Special - Celebrity/Soapbox"] = "Especial - Celebridad / Tribuna improvisada";
-App::$strings["Special - Group Repository"] = "Especial - Repositorio de grupo";
-App::$strings["Custom/Expert Mode"] = "Modo personalizado/experto";
-App::$strings["prev"] = "anterior";
-App::$strings["first"] = "primera";
-App::$strings["last"] = "última";
-App::$strings["next"] = "próxima";
-App::$strings["older"] = "más antiguas";
-App::$strings["newer"] = "más recientes";
-App::$strings["No connections"] = "Sin conexiones";
-App::$strings["View all %s connections"] = "Ver todas las %s conexiones";
-App::$strings["poke"] = "un toque";
-App::$strings["ping"] = "un \"ping\"";
-App::$strings["pinged"] = "ha enviado un \"ping\" a";
-App::$strings["prod"] = "una incitación ";
-App::$strings["prodded"] = "ha incitado a ";
-App::$strings["slap"] = "una bofetada ";
-App::$strings["slapped"] = "ha abofeteado a ";
-App::$strings["finger"] = "un \"finger\" ";
-App::$strings["fingered"] = "envió un \"finger\" a";
-App::$strings["rebuff"] = "un reproche";
-App::$strings["rebuffed"] = "ha hecho un reproche a ";
-App::$strings["happy"] = "feliz ";
-App::$strings["sad"] = "triste ";
-App::$strings["mellow"] = "tranquilo/a";
-App::$strings["tired"] = "cansado/a ";
-App::$strings["perky"] = "vivaz";
-App::$strings["angry"] = "enfadado/a";
-App::$strings["stupefied"] = "asombrado/a";
-App::$strings["puzzled"] = "perplejo/a";
-App::$strings["interested"] = "interesado/a";
-App::$strings["bitter"] = "amargado/a";
-App::$strings["cheerful"] = "alegre";
-App::$strings["alive"] = "animado/a";
-App::$strings["annoyed"] = "molesto/a";
-App::$strings["anxious"] = "ansioso/a";
-App::$strings["cranky"] = "de mal humor";
-App::$strings["disturbed"] = "perturbado/a";
-App::$strings["frustrated"] = "frustrado/a";
-App::$strings["depressed"] = "deprimido/a";
-App::$strings["motivated"] = "motivado/a";
-App::$strings["relaxed"] = "relajado/a";
-App::$strings["surprised"] = "sorprendido/a";
-App::$strings["May"] = "mayo";
-App::$strings["Unknown Attachment"] = "Adjunto no reconocido";
-App::$strings["unknown"] = "desconocido";
-App::$strings["remove category"] = "eliminar categoría";
-App::$strings["remove from file"] = "eliminar del fichero";
-App::$strings["Click to open/close"] = "Pulsar para abrir/cerrar";
-App::$strings["Link to Source"] = "Enlazar con la entrada en su ubicación original";
-App::$strings["default"] = "por defecto";
-App::$strings["Page layout"] = "Plantilla de la página";
-App::$strings["You can create your own with the layouts tool"] = "Puede crear su propia disposición gráfica con la herramienta de plantillas";
-App::$strings["Page content type"] = "Tipo de contenido de la página";
-App::$strings["Select an alternate language"] = "Seleccionar un idioma alternativo";
-App::$strings["activity"] = "la actividad";
-App::$strings["Design Tools"] = "Herramientas de diseño web";
-App::$strings["Blocks"] = "Bloques";
-App::$strings["Menus"] = "Menús";
-App::$strings["Layouts"] = "Plantillas";
-App::$strings["Pages"] = "Páginas";
-App::$strings["Public Timeline"] = "Cronología pública";
-App::$strings["Remote privacy information not available."] = "La información privada remota no está disponible.";
-App::$strings["Visible to:"] = "Visible para:";
App::$strings["Some blurb about what to do when you're new here"] = "Algunas propuestas para el nuevo usuario sobre qué se puede hacer aquí";
App::$strings["network"] = "red";
App::$strings["RSS"] = "RSS";
-App::$strings["Unable to find your hub."] = "No se puede encontrar su servidor.";
-App::$strings["Post successful."] = "Enviado con éxito.";
App::$strings["Theme settings updated."] = "Ajustes del tema actualizados.";
+App::$strings["Item not found."] = "Elemento no encontrado.";
App::$strings["# Accounts"] = "# Cuentas";
App::$strings["# blocked accounts"] = "# cuentas bloqueadas";
App::$strings["# expired accounts"] = "# cuentas caducadas";
@@ -1054,17 +56,23 @@ App::$strings["Registered channels"] = "Canales registrados";
App::$strings["Active plugins"] = "Extensiones activas";
App::$strings["Version"] = "Versión";
App::$strings["Site settings updated."] = "Ajustes del sitio actualizados.";
+App::$strings["Default"] = "Predeterminado";
App::$strings["mobile"] = "móvil";
App::$strings["experimental"] = "experimental";
App::$strings["unsupported"] = "no soportado";
+App::$strings["No"] = "No";
App::$strings["Yes - with approval"] = "Sí - con aprobación";
+App::$strings["Yes"] = "Sí";
App::$strings["My site is not a public server"] = "Mi sitio no es un servidor público";
App::$strings["My site has paid access only"] = "Mi sitio es un servicio de pago";
App::$strings["My site has free access only"] = "Mi sitio es un servicio gratuito";
App::$strings["My site offers free accounts with optional paid upgrades"] = "Mi sitio ofrece cuentas gratuitas con opciones extra de pago";
+App::$strings["Site"] = "Sitio";
+App::$strings["Submit"] = "Enviar";
App::$strings["Registration"] = "Registro";
App::$strings["File upload"] = "Subir fichero";
App::$strings["Policies"] = "Políticas";
+App::$strings["Advanced"] = "Avanzado";
App::$strings["Site name"] = "Nombre del sitio";
App::$strings["Banner/Logo"] = "Banner/Logo";
App::$strings["Administrator Information"] = "Información del Administrador";
@@ -1102,8 +110,10 @@ App::$strings["Force publish"] = "Forzar la publicación";
App::$strings["Check to force all profiles on this site to be listed in the site directory."] = "Intentar forzar todos los perfiles para que sean listados en el directorio de este sitio.";
App::$strings["Import Public Streams"] = "Importar contenido público";
App::$strings["Import and allow access to public content pulled from other sites. Warning: this content is unmoderated."] = "Importar y permitir acceso al contenido público sacado de otros sitios. Advertencia: este contenido no está moderado, por lo que podría encontrar cosas inapropiadas u ofensivas.";
-App::$strings["login on Homepage"] = "Iniciar sesión en la página personal";
+App::$strings["Login on Homepage"] = "Iniciar sesión en la página personal";
App::$strings["Present a login box to visitors on the home page if no other content has been configured."] = "Presentar a los visitantes una casilla de identificación en la página de inicio, si no se ha configurado otro tipo de contenido.";
+App::$strings["Enable context help"] = "Habilitar la ayuda contextual";
+App::$strings["Display contextual help for the current page when the help button is pressed."] = "Ver la ayuda contextual para la página actual cuando se pulse el botón de Ayuda.";
App::$strings["Directory Server URL"] = "URL del servidor de directorio";
App::$strings["Default directory server"] = "Servidor de directorio predeterminado";
App::$strings["Proxy user"] = "Usuario del proxy";
@@ -1130,6 +140,7 @@ App::$strings["for channel"] = "por canal";
App::$strings["on server"] = "en el servidor";
App::$strings["Status"] = "Estado";
App::$strings["Server"] = "Servidor";
+App::$strings["Security"] = "Seguridad";
App::$strings["Block public"] = "Bloquear páginas públicas";
App::$strings["Check to block public access to all otherwise public personal pages on this site unless you are currently authenticated."] = "Habilitar para impedir ver las páginas personales de este sitio a quien no esté actualmente autenticado.";
App::$strings["Allow communications only from these sites"] = "Permitir la comunicación solo desde estos sitios";
@@ -1175,11 +186,13 @@ App::$strings["Users"] = "Usuarios";
App::$strings["select all"] = "seleccionar todo";
App::$strings["User registrations waiting for confirm"] = "Registros de usuario en espera de aprobación";
App::$strings["Request date"] = "Fecha de solicitud";
+App::$strings["Email"] = "Correo electrónico";
App::$strings["No registrations."] = "Sin registros.";
App::$strings["Approve"] = "Aprobar";
App::$strings["Deny"] = "Rechazar";
App::$strings["Block"] = "Bloquear";
App::$strings["Unblock"] = "Desbloquear";
+App::$strings["All Channels"] = "Todos los canales";
App::$strings["Register date"] = "Fecha de registro";
App::$strings["Last login"] = "Último acceso";
App::$strings["Expires"] = "Caduca";
@@ -1204,10 +217,12 @@ App::$strings["Channel '%s' censored"] = "Canal '%s' censurado";
App::$strings["Channel '%s' uncensored"] = "Canal '%s' no censurado";
App::$strings["Channel '%s' code allowed"] = "Código permitido al canal '%s'";
App::$strings["Channel '%s' code disallowed"] = "Código no permitido al canal '%s'";
+App::$strings["Channels"] = "Canales";
App::$strings["Censor"] = "Censurar";
App::$strings["Uncensor"] = "No censurar";
App::$strings["Allow Code"] = "Permitir código";
App::$strings["Disallow Code"] = "No permitir código";
+App::$strings["Channel"] = "Canal";
App::$strings["UID"] = "UID";
App::$strings["Address"] = "Dirección";
App::$strings["Selected channels will be deleted!\\n\\nEverything that was posted in these channels on this site will be permanently deleted!\\n\\nAre you sure?"] = "Los canales seleccionados se eliminarán!\\n\\nTodo lo publicado por estos canales en este sitio se borrarán definitivamente!\\n\\n¿Está seguro de querer hacerlo?";
@@ -1216,7 +231,9 @@ App::$strings["Plugin %s disabled."] = "Extensión %s desactivada.";
App::$strings["Plugin %s enabled."] = "Extensión %s activada.";
App::$strings["Disable"] = "Desactivar";
App::$strings["Enable"] = "Activar";
+App::$strings["Plugins"] = "Extensiones";
App::$strings["Toggle"] = "Cambiar";
+App::$strings["Settings"] = "Ajustes";
App::$strings["Author: "] = "Autor:";
App::$strings["Maintainer: "] = "Mantenedor:";
App::$strings["Minimum project version: "] = "Versión mínima del proyecto:";
@@ -1226,9 +243,11 @@ App::$strings["Requires: "] = "Se requiere:";
App::$strings["Disabled - version incompatibility"] = "Deshabilitado - versiones incompatibles";
App::$strings["No themes found."] = "No se han encontrado temas.";
App::$strings["Screenshot"] = "Instantánea de pantalla";
+App::$strings["Themes"] = "Temas";
App::$strings["[Experimental]"] = "[Experimental]";
App::$strings["[Unsupported]"] = "[No soportado]";
App::$strings["Log settings updated."] = "Actualizado el informe de configuraciones.";
+App::$strings["Logs"] = "Informes";
App::$strings["Clear"] = "Vaciar";
App::$strings["Debugging"] = "Depuración";
App::$strings["Log file"] = "Fichero de informe";
@@ -1242,8 +261,10 @@ App::$strings["Field Name"] = "Nombre del campo";
App::$strings["Label on profile pages"] = "Etiqueta a mostrar en la página del perfil";
App::$strings["Help text"] = "Texto de ayuda";
App::$strings["Additional info (optional)"] = "Información adicional (opcional)";
+App::$strings["Save"] = "Guardar";
App::$strings["Field definition not found"] = "Definición del campo no encontrada";
App::$strings["Edit Profile Field"] = "Modificar el campo del perfil";
+App::$strings["Profile Fields"] = "Campos del perfil";
App::$strings["Basic Profile Fields"] = "Campos básicos del perfil";
App::$strings["Advanced Profile Fields"] = "Campos avanzados del perfil";
App::$strings["(In addition to basic fields)"] = "(Además de los campos básicos)";
@@ -1254,13 +275,13 @@ App::$strings["Authorize application connection"] = "Autorizar una conexión de
App::$strings["Return to your app and insert this Securty Code:"] = "Volver a su aplicación e introducir este código de seguridad:";
App::$strings["Please login to continue."] = "Por favor inicie sesión para continuar.";
App::$strings["Do you want to authorize this application to access your posts and contacts, and/or create new posts for you?"] = "¿Desea autorizar a esta aplicación a acceder a sus publicaciones y contactos, y/o crear nuevas publicaciones por usted?";
-App::$strings["OpenID protocol error. No ID returned."] = "Error del protocolo OpenID. Ningún ID recibido como respuesta.";
App::$strings["App installed."] = "Aplicación instalada.";
App::$strings["Malformed app."] = "Aplicación con errores";
App::$strings["Embed code"] = "Código incorporado";
App::$strings["Edit App"] = "Modificar la aplicación";
App::$strings["Create App"] = "Crear una aplicación";
App::$strings["Name of app"] = "Nombre de la aplicación";
+App::$strings["Required"] = "Obligatorio";
App::$strings["Location (URL) of app"] = "Dirección (URL) de la aplicación";
App::$strings["Description"] = "Descripción";
App::$strings["Photo icon URL"] = "Dirección del icono";
@@ -1268,130 +289,50 @@ App::$strings["80 x 80 pixels - optional"] = "80 x 80 pixels - opcional";
App::$strings["Version ID"] = "Versión";
App::$strings["Price of app"] = "Precio de la aplicación";
App::$strings["Location (URL) to purchase app"] = "Dirección (URL) donde adquirir la aplicación";
+App::$strings["Apps"] = "Aplicaciones";
+App::$strings["Item not available."] = "Elemento no disponible";
App::$strings["Invalid item."] = "Elemento no válido.";
App::$strings["Channel not found."] = "Canal no encontrado.";
-App::$strings["Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."] = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";
-App::$strings["Item not available."] = "Elemento no disponible";
-App::$strings["This setting requires special processing and editing has been blocked."] = "Este ajuste necesita de un proceso especial y la edición ha sido bloqueada.";
-App::$strings["Configuration Editor"] = "Editor de configuración";
-App::$strings["Warning: Changing some settings could render your channel inoperable. Please leave this page unless you are comfortable with and knowledgeable about how to correctly use this feature."] = "Atención: El cambio de algunos ajustes puede volver inutilizable su canal. Por favor, abandone la página excepto que esté seguro y sepa cómo usar correctamente esta característica.";
-App::$strings["Layout updated."] = "Plantilla actualizada.";
-App::$strings["Edit System Page Description"] = "Editor del Sistema de Descripción de Páginas";
-App::$strings["Layout not found."] = "Plantilla no encontrada";
-App::$strings["Module Name:"] = "Nombre del módulo:";
-App::$strings["Layout Help"] = "Ayuda para el diseño de plantillas de página";
-App::$strings["Item not found"] = "Elemento no encontrado";
-App::$strings["Item is not editable"] = "El elemento no es editable";
-App::$strings["Delete item?"] = "¿Borrar elemento?";
-App::$strings["Insert YouTube video"] = "Insertar vídeo de YouTube";
-App::$strings["Insert Vorbis [.ogg] video"] = "Insertar vídeo Vorbis [.ogg]";
-App::$strings["Insert Vorbis [.ogg] audio"] = "Insertar audio Vorbis [.ogg]";
-App::$strings["Edit post"] = "Editar la entrada";
-App::$strings["Page owner information could not be retrieved."] = "La información del propietario de la página no pudo ser recuperada.";
-App::$strings["Album not found."] = "Álbum no encontrado.";
-App::$strings["Delete Album"] = "Borrar álbum";
-App::$strings["Multiple storage folders exist with this album name, but within different directories. Please remove the desired folder or folders using the Files manager"] = "Hay varias carpetas con este nombre de álbum, pero dentro de diferentes directorios. Por favor, elimine la carpeta o carpetas que desee utilizando el administrador de ficheros";
-App::$strings["Delete Photo"] = "Borrar foto";
-App::$strings["Public access denied."] = "Acceso público denegado.";
-App::$strings["No photos selected"] = "No hay fotos seleccionadas";
-App::$strings["Access to this item is restricted."] = "El acceso a este elemento está restringido.";
-App::$strings["%1$.2f MB of %2$.2f MB photo storage used."] = "%1$.2f MB de %2$.2f MB de almacenamiento de fotos utilizado.";
-App::$strings["%1$.2f MB photo storage used."] = "%1$.2f MB de almacenamiento de fotos utilizado.";
-App::$strings["Upload Photos"] = "Subir fotos";
-App::$strings["Enter an album name"] = "Introducir un nombre de álbum";
-App::$strings["or select an existing album (doubleclick)"] = "o seleccionar uno existente (doble click)";
-App::$strings["Create a status post for this upload"] = "Crear un mensaje de estado para esta subida";
-App::$strings["Caption (optional):"] = "Título (opcional):";
-App::$strings["Description (optional):"] = "Descripción (opcional):";
-App::$strings["Album name could not be decoded"] = "El nombre del álbum no ha podido ser descifrado";
-App::$strings["Contact Photos"] = "Fotos de contacto";
-App::$strings["Show Newest First"] = "Mostrar lo más reciente primero";
-App::$strings["Show Oldest First"] = "Mostrar lo más antiguo primero";
-App::$strings["Permission denied. Access to this item may be restricted."] = "Permiso denegado. El acceso a este elemento puede estar restringido.";
-App::$strings["Photo not available"] = "Foto no disponible";
-App::$strings["Use as profile photo"] = "Usar como foto del perfil";
-App::$strings["Use as cover photo"] = "Usar como imagen de portada del perfil";
-App::$strings["Private Photo"] = "Foto privada";
-App::$strings["Previous"] = "Anterior";
-App::$strings["View Full Size"] = "Ver tamaño completo";
-App::$strings["Next"] = "Siguiente";
-App::$strings["Remove"] = "Eliminar";
-App::$strings["Edit photo"] = "Editar foto";
-App::$strings["Rotate CW (right)"] = "Girar CW (a la derecha)";
-App::$strings["Rotate CCW (left)"] = "Girar CCW (a la izquierda)";
-App::$strings["Enter a new album name"] = "Introducir un nuevo nombre de álbum";
-App::$strings["or select an existing one (doubleclick)"] = "o seleccionar uno (doble click) existente";
-App::$strings["Caption"] = "Título";
-App::$strings["Add a Tag"] = "Añadir una etiqueta";
-App::$strings["Example: @bob, @Barbara_Jensen, @jim@example.com"] = "Ejemplos: @eva, @Carmen_Osuna, @jaime@ejemplo.com";
-App::$strings["Flag as adult in album view"] = "Marcar como \"solo para adultos\" en el álbum";
-App::$strings["In This Photo:"] = "En esta foto:";
-App::$strings["Map"] = "Mapa";
-App::$strings["View Album"] = "Ver álbum";
-App::$strings["Recent Photos"] = "Fotos recientes";
+App::$strings["Block Name"] = "Nombre del bloque";
+App::$strings["Blocks"] = "Bloques";
+App::$strings["Block Title"] = "Título del bloque";
+App::$strings["Created"] = "Creado";
+App::$strings["Edited"] = "Editado";
+App::$strings["Share"] = "Compartir";
+App::$strings["View"] = "Ver";
App::$strings["Bookmark added"] = "Marcador añadido";
App::$strings["My Bookmarks"] = "Mis marcadores";
App::$strings["My Connections Bookmarks"] = "Marcadores de mis conexiones";
-App::$strings["Menu not found."] = "Menú no encontrado";
-App::$strings["Unable to create element."] = "Imposible crear el elemento.";
-App::$strings["Unable to update menu element."] = "No es posible actualizar el elemento del menú.";
-App::$strings["Unable to add menu element."] = "No es posible añadir el elemento al menú";
-App::$strings["Not found."] = "No encontrado.";
-App::$strings["Menu Item Permissions"] = "Permisos del elemento del menú";
-App::$strings["(click to open/close)"] = "(pulsar para abrir o cerrar)";
-App::$strings["Link Name"] = "Nombre del enlace";
-App::$strings["Link or Submenu Target"] = "Destino del enlace o submenú";
-App::$strings["Enter URL of the link or select a menu name to create a submenu"] = "Introducir la dirección del enlace o seleccionar el nombre de un submenú";
-App::$strings["Use magic-auth if available"] = "Usar la autenticación mágica si está disponible";
-App::$strings["Open link in new window"] = "Abrir el enlace en una nueva ventana";
-App::$strings["Order in list"] = "Orden en la lista";
-App::$strings["Higher numbers will sink to bottom of listing"] = "Los números más altos irán al final de la lista";
-App::$strings["Submit and finish"] = "Enviar y terminar";
-App::$strings["Submit and continue"] = "Enviar y continuar";
-App::$strings["Menu:"] = "Menú:";
-App::$strings["Link Target"] = "Destino del enlace";
-App::$strings["Edit menu"] = "Editar menú";
-App::$strings["Edit element"] = "Editar el elemento";
-App::$strings["Drop element"] = "Eliminar el elemento";
-App::$strings["New element"] = "Nuevo elemento";
-App::$strings["Edit this menu container"] = "Modificar el contenedor del menú";
-App::$strings["Add menu element"] = "Añadir un elemento al menú";
-App::$strings["Delete this menu item"] = "Eliminar este elemento del menú";
-App::$strings["Edit this menu item"] = "Modificar este elemento del menú";
-App::$strings["Menu item not found."] = "Este elemento del menú no se ha encontrado";
-App::$strings["Menu item deleted."] = "Este elemento del menú ha sido borrado";
-App::$strings["Menu item could not be deleted."] = "Este elemento del menú no puede ser borrado.";
-App::$strings["Edit Menu Element"] = "Editar elemento del menú";
-App::$strings["Link text"] = "Texto del enlace";
-App::$strings["sent you a private message"] = "le ha enviado un mensaje privado";
-App::$strings["added your channel"] = "añadió este canal a sus conexiones";
-App::$strings["posted an event"] = "publicó un evento";
+App::$strings["everybody"] = "cualquiera";
App::$strings["Permissions denied."] = "Permisos denegados.";
App::$strings["l, F j"] = "l j F";
+App::$strings["Link to Source"] = "Enlazar con la entrada en su ubicación original";
App::$strings["Edit Event"] = "Editar el evento";
App::$strings["Create Event"] = "Crear un evento";
+App::$strings["Previous"] = "Anterior";
+App::$strings["Next"] = "Siguiente";
+App::$strings["Export"] = "Exportar";
+App::$strings["Import"] = "Importar";
App::$strings["Today"] = "Hoy";
App::$strings["You must be logged in to see this page."] = "Debe haber iniciado sesión para poder ver esta página.";
App::$strings["Posts and comments"] = "Publicaciones y comentarios";
App::$strings["Only posts"] = "Solo publicaciones";
App::$strings["Insufficient permissions. Request redirected to profile page."] = "Permisos insuficientes. Petición redirigida a la página del perfil.";
App::$strings["Public"] = "Público";
-App::$strings["Poke somebody"] = "Dar un toque a alguien";
-App::$strings["Poke/Prod"] = "Toque/Incitación";
-App::$strings["Poke, prod or do other things to somebody"] = "Dar un toque, incitar o hacer otras cosas a alguien";
-App::$strings["Recipient"] = "Destinatario";
-App::$strings["Choose what you wish to do to recipient"] = "Elegir qué desea enviar al destinatario";
-App::$strings["Make this post private"] = "Convertir en privado este envío";
App::$strings["Room not found"] = "Sala no encontrada";
App::$strings["Leave Room"] = "Abandonar la sala";
App::$strings["Delete Room"] = "Eliminar esta sala";
App::$strings["I am away right now"] = "Estoy ausente momentáneamente";
App::$strings["I am online"] = "Estoy conectado/a";
App::$strings["Bookmark this room"] = "Añadir esta sala a Marcadores";
+App::$strings["Please enter a link URL:"] = "Por favor, introduzca la dirección del enlace:";
+App::$strings["Encrypt text"] = "Cifrar texto";
+App::$strings["Insert web link"] = "Insertar enlace web";
App::$strings["Feature disabled."] = "Funcionalidad deshabilitada.";
App::$strings["New Chatroom"] = "Nueva sala de chat";
App::$strings["Chatroom name"] = "Nombre de la sala de chat";
App::$strings["Expiration of chats (minutes)"] = "Caducidad de los mensajes en los chats (en minutos)";
+App::$strings["Permissions"] = "Permisos";
App::$strings["%1\$s's Chatrooms"] = "Salas de chat de %1\$s";
App::$strings["No chatrooms available"] = "No hay salas de chat disponibles";
App::$strings["Create New"] = "Crear";
@@ -1399,7 +340,6 @@ App::$strings["Expiration"] = "Caducidad";
App::$strings["min"] = "min";
App::$strings["Away"] = "Ausente";
App::$strings["Online"] = "Conectado/a";
-App::$strings["Fetching URL returns error: %1\$s"] = "Al intentar obtener la dirección, retorna el error: %1\$s";
App::$strings["No channel."] = "Ningún canal.";
App::$strings["Common connections"] = "Conexiones comunes";
App::$strings["No connections in common."] = "Ninguna conexión en común.";
@@ -1412,11 +352,12 @@ App::$strings["Potential connections will then see the following text before pro
App::$strings["By continuing, I certify that I have complied with any instructions provided on this page."] = "Al continuar, certifico que he cumplido con todas las instrucciones proporcionadas en esta página.";
App::$strings["(No specific instructions have been provided by the channel owner.)"] = "(No ha sido proporcionada ninguna instrucción específica por el propietario del canal.)";
App::$strings["Restricted or Premium Channel"] = "Canal premium o restringido";
-App::$strings["Set your current mood and tell your friends"] = "Describir su estado de ánimo para comunicárselo a sus amigos";
App::$strings["Blocked"] = "Bloqueadas";
App::$strings["Ignored"] = "Ignoradas";
App::$strings["Hidden"] = "Ocultas";
App::$strings["Archived"] = "Archivadas";
+App::$strings["New"] = "Nuevas";
+App::$strings["All"] = "Todos/as";
App::$strings["New Connections"] = "Nuevas conexiones";
App::$strings["Show pending (new) connections"] = "Mostrar conexiones (nuevas) pendientes";
App::$strings["All Connections"] = "Todas las conexiones";
@@ -1436,23 +377,11 @@ App::$strings["Approve connection"] = "Aprobar esta conexión";
App::$strings["Ignore connection"] = "Ignorar esta conexión";
App::$strings["Ignore"] = "Ignorar";
App::$strings["Recent activity"] = "Actividad reciente";
+App::$strings["Connections"] = "Conexiones";
+App::$strings["Search"] = "Buscar";
App::$strings["Search your connections"] = "Buscar sus conexiones";
App::$strings["Connections search"] = "Buscar conexiones";
-App::$strings["Image uploaded but image cropping failed."] = "Imagen actualizada, pero el recorte de la imagen ha fallado. ";
-App::$strings["Image resize failed."] = "El ajuste del tamaño de la imagen ha fallado.";
-App::$strings["Shift-reload the page or clear browser cache if the new photo does not display immediately."] = "Recargue la página o limpie el caché del navegador si la nueva foto no se muestra inmediatamente.";
-App::$strings["Image upload failed."] = "La carga de la imagen ha fallado.";
-App::$strings["Unable to process image."] = "No ha sido posible procesar la imagen.";
-App::$strings["Photo not available."] = "Foto no disponible.";
-App::$strings["Upload File:"] = "Subir fichero:";
-App::$strings["Select a profile:"] = "Seleccionar un perfil:";
-App::$strings["Upload Profile Photo"] = "Subir foto de perfil";
-App::$strings["or"] = "o";
-App::$strings["skip this step"] = "Omitir este paso";
-App::$strings["select a photo from your photo albums"] = "Seleccione una foto de sus álbumes de fotos";
-App::$strings["Crop Image"] = "Recortar imagen";
-App::$strings["Please adjust the image cropping for optimum viewing."] = "Por favor ajuste el recorte de la imagen para una visión óptima.";
-App::$strings["Done Editing"] = "Edición completada";
+App::$strings["Find"] = "Encontrar";
App::$strings["Could not access contact record."] = "No se ha podido acceder al registro de contacto.";
App::$strings["Could not locate selected profile."] = "No se ha podido localizar el perfil seleccionado.";
App::$strings["Connection updated."] = "Conexión actualizada.";
@@ -1462,6 +391,7 @@ App::$strings["Could not access address book record."] = "No se pudo acceder al
App::$strings["Refresh failed - channel is currently unavailable."] = "Recarga fallida - no se puede encontrar el canal en este momento.";
App::$strings["Unable to set address book parameters."] = "No ha sido posible establecer los parámetros de la libreta de direcciones.";
App::$strings["Connection has been removed."] = "La conexión ha sido eliminada.";
+App::$strings["View Profile"] = "Ver el perfil";
App::$strings["View %s's profile"] = "Ver el perfil de %s";
App::$strings["Refresh Permissions"] = "Recargar los permisos";
App::$strings["Fetch updated permissions"] = "Obtener los permisos actualizados";
@@ -1481,18 +411,25 @@ App::$strings["Hide"] = "Ocultar";
App::$strings["Hide or Unhide this connection from your other connections"] = "Ocultar o mostrar esta conexión a sus otras conexiones";
App::$strings["This connection is hidden!"] = "¡Esta conexión está oculta!";
App::$strings["Delete this connection"] = "Eliminar esta conexión";
+App::$strings["Me"] = "Yo";
+App::$strings["Family"] = "Familia";
+App::$strings["Friends"] = "Amigos/as";
+App::$strings["Acquaintances"] = "Conocidos/as";
App::$strings["Approve this connection"] = "Aprobar esta conexión";
App::$strings["Accept connection to allow communication"] = "Aceptar la conexión para permitir la comunicación";
App::$strings["Set Affinity"] = "Ajustar la afinidad";
App::$strings["Set Profile"] = "Ajustar el perfil";
App::$strings["Set Affinity & Profile"] = "Ajustar la afinidad y el perfil";
App::$strings["none"] = "-";
+App::$strings["Connection Default Permissions"] = "Permisos predeterminados de conexión";
+App::$strings["Connection: %s"] = "Conexión: %s";
App::$strings["Apply these permissions automatically"] = "Aplicar estos permisos automaticamente";
App::$strings["Connection requests will be approved without your interaction"] = "Las solicitudes de conexión serán aprobadas sin su intervención";
App::$strings["This connection's primary address is"] = "La dirección primaria de esta conexión es";
App::$strings["Available locations:"] = "Ubicaciones disponibles:";
App::$strings["The permissions indicated on this page will be applied to all new connections."] = "Los permisos indicados en esta página serán aplicados en todas las nuevas conexiones.";
App::$strings["Slide to adjust your degree of friendship"] = "Deslizar para ajustar el grado de amistad";
+App::$strings["Rating"] = "Valoración";
App::$strings["Slide to adjust your rating"] = "Deslizar para ajustar su valoración";
App::$strings["Optionally explain your rating"] = "Opcionalmente, puede explicar su valoración";
App::$strings["Custom Filter"] = "Filtro personalizado";
@@ -1509,6 +446,404 @@ App::$strings["Individual Permissions"] = "Permisos individuales";
App::$strings["Some permissions may be inherited from your channel's <a href=\"settings\"><strong>privacy settings</strong></a>, which have higher priority than individual settings. You can <strong>not</strong> change those settings here."] = "Algunos permisos pueden ser heredados de los <a href=\"settings\"><strong>ajustes de privacidad</strong></a> de sus canales, los cuales tienen una prioridad más alta que los ajustes individuales. <strong>No</strong> puede cambiar estos ajustes aquí.";
App::$strings["Some permissions may be inherited from your channel's <a href=\"settings\"><strong>privacy settings</strong></a>, which have higher priority than individual settings. You can change those settings here but they wont have any impact unless the inherited setting changes."] = "Algunos permisos pueden ser heredados de los <a href=\"settings\"><strong>ajustes de privacidad</strong></a> de sus canales, los cuales tienen una prioridad más alta que los ajustes individuales. Puede cambiar estos ajustes aquí, pero no tendrán ningún consecuencia hasta que cambie los ajustes heredados.";
App::$strings["Last update:"] = "Última actualización:";
+App::$strings["Image uploaded but image cropping failed."] = "Imagen actualizada, pero el recorte de la imagen ha fallado. ";
+App::$strings["Cover Photos"] = "Imágenes de portada del perfil";
+App::$strings["Image resize failed."] = "El ajuste del tamaño de la imagen ha fallado.";
+App::$strings["Unable to process image"] = "No ha sido posible procesar la imagen";
+App::$strings["Image upload failed."] = "La carga de la imagen ha fallado.";
+App::$strings["Unable to process image."] = "No ha sido posible procesar la imagen.";
+App::$strings["female"] = "mujer";
+App::$strings["%1\$s updated her %2\$s"] = "%1\$s ha actualizado su %2\$s";
+App::$strings["male"] = "hombre";
+App::$strings["%1\$s updated his %2\$s"] = "%1\$s ha actualizado su %2\$s";
+App::$strings["%1\$s updated their %2\$s"] = "%1\$s ha actualizado su %2\$s";
+App::$strings["cover photo"] = "Imagen de portada del perfil";
+App::$strings["Photo not available."] = "Foto no disponible.";
+App::$strings["Upload File:"] = "Subir fichero:";
+App::$strings["Select a profile:"] = "Seleccionar un perfil:";
+App::$strings["Upload Cover Photo"] = "Subir imagen de portada del perfil";
+App::$strings["or"] = "o";
+App::$strings["skip this step"] = "Omitir este paso";
+App::$strings["select a photo from your photo albums"] = "Seleccione una foto de sus álbumes de fotos";
+App::$strings["Crop Image"] = "Recortar imagen";
+App::$strings["Please adjust the image cropping for optimum viewing."] = "Por favor ajuste el recorte de la imagen para una visión óptima.";
+App::$strings["Done Editing"] = "Edición completada";
+App::$strings["\$Projectname channel"] = "Canal \$Projectname";
+App::$strings["Public access denied."] = "Acceso público denegado.";
+App::$strings["%d rating"] = array(
+ 0 => "%d valoración",
+ 1 => "%d valoraciones",
+);
+App::$strings["Gender: "] = "Género:";
+App::$strings["Status: "] = "Estado:";
+App::$strings["Homepage: "] = "Página personal:";
+App::$strings["Age:"] = "Edad:";
+App::$strings["Location:"] = "Ubicación:";
+App::$strings["Description:"] = "Descripción:";
+App::$strings["Hometown:"] = "Lugar de nacimiento:";
+App::$strings["About:"] = "Sobre mí:";
+App::$strings["Connect"] = "Conectar";
+App::$strings["Public Forum:"] = "Foro público:";
+App::$strings["Keywords: "] = "Palabras clave:";
+App::$strings["Don't suggest"] = "No sugerir:";
+App::$strings["Common connections:"] = "Conexiones comunes:";
+App::$strings["Global Directory"] = "Directorio global:";
+App::$strings["Local Directory"] = "Directorio local:";
+App::$strings["Finding:"] = "Encontrar:";
+App::$strings["Channel Suggestions"] = "Sugerencias de canales";
+App::$strings["next page"] = "siguiente página";
+App::$strings["previous page"] = "página anterior";
+App::$strings["Sort options"] = "Ordenar opciones";
+App::$strings["Alphabetic"] = "Alfabético";
+App::$strings["Reverse Alphabetic"] = "Alfabético inverso";
+App::$strings["Newest to Oldest"] = "De más nuevo a más antiguo";
+App::$strings["Oldest to Newest"] = "De más antiguo a más nuevo";
+App::$strings["No entries (some entries may be hidden)."] = "Sin entradas (algunas entradas pueden estar ocultas).";
+App::$strings["This site is not a directory server"] = "Este sitio no es un servidor de directorio";
+App::$strings["This directory server requires an access token"] = "El servidor de este directorio necesita un \"token\" de acceso";
+App::$strings["Permission denied"] = "Permiso denegado";
+App::$strings["Invalid message"] = "Mensaje no válido";
+App::$strings["no results"] = "sin resultados";
+App::$strings["Delivery report for %1\$s"] = "Informe de entrega para %1\$s";
+App::$strings["channel sync processed"] = "se ha realizado la sincronización del canal";
+App::$strings["queued"] = "encolado";
+App::$strings["posted"] = "enviado";
+App::$strings["accepted for delivery"] = "aceptado para el envío";
+App::$strings["updated"] = "actualizado";
+App::$strings["update ignored"] = "actualización ignorada";
+App::$strings["permission denied"] = "permiso denegado";
+App::$strings["recipient not found"] = "destinatario no encontrado";
+App::$strings["mail recalled"] = "mensaje de correo revocado";
+App::$strings["duplicate mail received"] = "se ha recibido mensaje duplicado";
+App::$strings["mail delivered"] = "correo enviado";
+App::$strings["Item not found"] = "Elemento no encontrado";
+App::$strings["Delete block?"] = "¿Borrar bloque?";
+App::$strings["Bold"] = "Negrita";
+App::$strings["Italic"] = "Itálico ";
+App::$strings["Underline"] = "Subrayar";
+App::$strings["Quote"] = "Citar";
+App::$strings["Code"] = "Código";
+App::$strings["Upload photo"] = "Subir foto";
+App::$strings["Attach file"] = "Adjuntar fichero";
+App::$strings["Insert YouTube video"] = "Insertar vídeo de YouTube";
+App::$strings["Insert Vorbis [.ogg] video"] = "Insertar vídeo Vorbis [.ogg]";
+App::$strings["Insert Vorbis [.ogg] audio"] = "Insertar audio Vorbis [.ogg]";
+App::$strings["Set your location"] = "Establecer su ubicación";
+App::$strings["Clear browser location"] = "Eliminar los datos de localización geográfica del navegador";
+App::$strings["Please wait"] = "Espere por favor";
+App::$strings["Permission settings"] = "Configuración de permisos";
+App::$strings["Public post"] = "Entrada pública";
+App::$strings["Title (optional)"] = "Título (opcional)";
+App::$strings["Categories (optional, comma-separated list)"] = "Categorías (opcional, lista separada por comas)";
+App::$strings["Example: bob@example.com, mary@example.com"] = "Ejemplo: roberto@ejemplo.com, maría@ejemplo.com";
+App::$strings["Preview"] = "Previsualizar";
+App::$strings["Set expiration date"] = "Configurar fecha de caducidad";
+App::$strings["Edit Block"] = "Modificar este bloque";
+App::$strings["Delete layout?"] = "¿Borrar la plantilla?";
+App::$strings["Layout Description (Optional)"] = "Descripción de la plantilla (opcional)";
+App::$strings["Layout Name"] = "Nombre de la plantilla";
+App::$strings["Edit Layout"] = "Modificar la plantilla";
+App::$strings["Item is not editable"] = "El elemento no es editable";
+App::$strings["Expires YYYY-MM-DD HH:MM"] = "Caduca YYYY-MM-DD HH:MM";
+App::$strings["Delete item?"] = "¿Borrar elemento?";
+App::$strings["Toggle voting"] = "Cambiar votación";
+App::$strings["OK"] = "OK";
+App::$strings["Cancel"] = "Cancelar";
+App::$strings["Edit post"] = "Editar la entrada";
+App::$strings["Delete webpage?"] = "¿Eliminar la página web?";
+App::$strings["Page link title"] = "Título del enlace de la página";
+App::$strings["Edit Webpage"] = "Editar la página web";
+App::$strings["Calendar entries imported."] = "Entradas de calendario importadas.";
+App::$strings["No calendar entries found."] = "No se han encontrado entradas de calendario.";
+App::$strings["Event can not end before it has started."] = "Un evento no puede terminar antes de que haya comenzado.";
+App::$strings["Unable to generate preview."] = "No se puede crear la vista previa.";
+App::$strings["Event title and start time are required."] = "Se requieren el título del evento y su hora de inicio.";
+App::$strings["Event not found."] = "Evento no encontrado.";
+App::$strings["event"] = "evento";
+App::$strings["Edit event title"] = "Editar el título del evento";
+App::$strings["Event title"] = "Título del evento";
+App::$strings["Categories (comma-separated list)"] = "Categorías (lista separada por comas)";
+App::$strings["Edit Category"] = "Editar la categoría";
+App::$strings["Category"] = "Categoría";
+App::$strings["Edit start date and time"] = "Modificar la fecha y hora de comienzo";
+App::$strings["Start date and time"] = "Fecha y hora de comienzo";
+App::$strings["Finish date and time are not known or not relevant"] = "La fecha y hora de terminación no se conocen o no son relevantes";
+App::$strings["Edit finish date and time"] = "Modificar la fecha y hora de terminación";
+App::$strings["Finish date and time"] = "Fecha y hora de terminación";
+App::$strings["Adjust for viewer timezone"] = "Ajustar para obtener el visor de los husos horarios";
+App::$strings["Important for events that happen in a particular place. Not practical for global holidays."] = "Importante para los eventos que suceden en un lugar determinado. No es práctico para los globales.";
+App::$strings["Edit Description"] = "Editar la descripción";
+App::$strings["Edit Location"] = "Modificar la dirección";
+App::$strings["Location"] = "Ubicación";
+App::$strings["Share this event"] = "Compartir este evento";
+App::$strings["Advanced Options"] = "Opciones avanzadas";
+App::$strings["Edit event"] = "Editar evento";
+App::$strings["Delete event"] = "Borrar evento";
+App::$strings["calendar"] = "calendario";
+App::$strings["Event removed"] = "Evento borrado";
+App::$strings["Failed to remove event"] = "Error al eliminar el evento";
+App::$strings["Photos"] = "Fotos";
+App::$strings["Share content from Firefox to \$Projectname"] = "Compartir contenido desde Firefox a \$Projectname";
+App::$strings["Activate the Firefox \$Projectname provider"] = "Servicio de compartición de Firefox: activar el proveedor \$Projectname ";
+App::$strings["Save to Folder:"] = "Guardar en carpeta:";
+App::$strings["- select -"] = "- seleccionar -";
+App::$strings["Permission Denied."] = "Permiso denegado";
+App::$strings["File not found."] = "Fichero no encontrado.";
+App::$strings["Edit file permissions"] = "Modificar los permisos del fichero";
+App::$strings["Set/edit permissions"] = "Establecer/editar los permisos";
+App::$strings["Include all files and sub folders"] = "Incluir todos los ficheros y subcarpetas";
+App::$strings["Return to file list"] = "Volver a la lista de ficheros";
+App::$strings["Copy/paste this code to attach file to a post"] = "Copiar/pegar este código para adjuntar el fichero al envío";
+App::$strings["Copy/paste this URL to link file from a web page"] = "Copiar/pegar esta dirección para enlazar el fichero desde una página web";
+App::$strings["Share this file"] = "Compartir este fichero";
+App::$strings["Show URL to this file"] = "Mostrar la dirección de este fichero";
+App::$strings["Notify your contacts about this file"] = "Avisar a sus contactos sobre este fichero";
+App::$strings["Channel added."] = "Canal añadido.";
+App::$strings["Contact not found."] = "Contacto no encontrado";
+App::$strings["Friend suggestion sent."] = "Enviar sugerencia a un amigo.";
+App::$strings["Suggest Friends"] = "Sugerir amigos";
+App::$strings["Suggest a friend for %s"] = "Sugerir un amigo a %s";
+App::$strings["Privacy group created."] = "El grupo de canales ha sido creado.";
+App::$strings["Could not create privacy group."] = "No se puede crear el grupo de canales";
+App::$strings["Privacy group not found."] = "Grupo de canales no encontrado.";
+App::$strings["Privacy group updated."] = "Grupo de canales actualizado.";
+App::$strings["Create a group of channels."] = "Crear un grupo de canales.";
+App::$strings["Privacy group name: "] = "Nombre del grupo de canales:";
+App::$strings["Members are visible to other channels"] = "Los miembros son visibles para otros canales";
+App::$strings["Privacy group removed."] = "Grupo de canales eliminado.";
+App::$strings["Unable to remove privacy group."] = "Imposible eliminar el grupo de canales.";
+App::$strings["Privacy group editor"] = "Editor de grupos de canales";
+App::$strings["Members"] = "Miembros";
+App::$strings["All Connected Channels"] = "Todos los canales conectados";
+App::$strings["Click on a channel to add or remove."] = "Haga clic en un canal para agregarlo o quitarlo.";
+App::$strings["Documentation Search"] = "Búsqueda de Documentación";
+App::$strings["Help:"] = "Ayuda:";
+App::$strings["Help"] = "Ayuda";
+App::$strings["\$Projectname Documentation"] = "Documentación de \$Projectname";
+App::$strings["\$Projectname"] = "\$Projectname";
+App::$strings["Welcome to %s"] = "Bienvenido a %s";
+App::$strings["First Name"] = "Nombre";
+App::$strings["Last Name"] = "Apellido";
+App::$strings["Nickname"] = "Sobrenombre o Alias";
+App::$strings["Full Name"] = "Nombre completo";
+App::$strings["Profile Photo"] = "Foto del perfil";
+App::$strings["Profile Photo 16px"] = "Foto del perfil 16px";
+App::$strings["Profile Photo 32px"] = "Foto del perfil 32px";
+App::$strings["Profile Photo 48px"] = "Foto del perfil 48px";
+App::$strings["Profile Photo 64px"] = "Foto del perfil 64px";
+App::$strings["Profile Photo 80px"] = "Foto del perfil 80px";
+App::$strings["Profile Photo 128px"] = "Foto del perfil 128px";
+App::$strings["Timezone"] = "Huso horario";
+App::$strings["Homepage URL"] = "Dirección de la página personal";
+App::$strings["Language"] = "Idioma";
+App::$strings["Birth Year"] = "Año de nacimiento";
+App::$strings["Birth Month"] = "Mes de nacimiento";
+App::$strings["Birth Day"] = "Día de nacimiento";
+App::$strings["Birthdate"] = "Fecha de nacimiento";
+App::$strings["Gender"] = "Género";
+App::$strings["Male"] = "Hombre";
+App::$strings["Female"] = "Mujer";
+App::$strings["webpage"] = "página web";
+App::$strings["block"] = "bloque";
+App::$strings["layout"] = "plantilla";
+App::$strings["menu"] = "menú";
+App::$strings["%s element installed"] = "%s elemento instalado";
+App::$strings["%s element installation failed"] = "Elemento con instalación fallida: %s";
+App::$strings["Your service plan only allows %d channels."] = "Su paquete de servicios solo permite %d canales.";
+App::$strings["Nothing to import."] = "No hay nada para importar.";
+App::$strings["Unable to download data from old server"] = "No se han podido descargar datos de su antiguo servidor";
+App::$strings["Imported file is empty."] = "El fichero importado está vacío.";
+App::$strings["Warning: Database versions differ by %1\$d updates."] = "Atención: Las versiones de la base de datos difieren en %1\$d actualizaciones.";
+App::$strings["Cloned channel not found. Import failed."] = "No se ha podido importar el canal porque el canal clonado no se ha encontrado.";
+App::$strings["No channel. Import failed."] = "No hay canal. La importación ha fallado";
+App::$strings["Import completed."] = "Importación completada.";
+App::$strings["You must be logged in to use this feature."] = "Debe estar registrado para poder usar esta funcionalidad.";
+App::$strings["Import Channel"] = "Importar canal";
+App::$strings["Use this form to import an existing channel from a different server/hub. You may retrieve the channel identity from the old server/hub via the network or provide an export file."] = "Emplee este formulario para importar un canal desde un servidor/hub diferente. Puede recuperar el canal desde el antiguo servidor/hub a través de la red o proporcionando un fichero de exportación.";
+App::$strings["File to Upload"] = "Fichero para subir";
+App::$strings["Or provide the old server/hub details"] = "O proporcione los detalles de su antiguo servidor/hub";
+App::$strings["Your old identity address (xyz@example.com)"] = "Su identidad en el antiguo servidor (canal@ejemplo.com)";
+App::$strings["Your old login email address"] = "Su antigua dirección de correo electrónico";
+App::$strings["Your old login password"] = "Su antigua contraseña";
+App::$strings["For either option, please choose whether to make this hub your new primary address, or whether your old location should continue this role. You will be able to post from either location, but only one can be marked as the primary location for files, photos, and media."] = "Para cualquiera de las opciones, elija si hacer de este servidor su nueva dirección primaria, o si su antigua dirección debe continuar con este papel. Usted podrá publicar desde cualquier ubicación, pero sólo una puede estar marcada como la ubicación principal para los ficheros, fotos y otras imágenes o vídeos.";
+App::$strings["Make this hub my primary location"] = "Convertir este servidor en mi ubicación primaria";
+App::$strings["Import existing posts if possible (experimental - limited by available memory"] = "Importar el contenido publicado si es posible (experimental - limitado por la memoria disponible";
+App::$strings["This process may take several minutes to complete. Please submit the form only once and leave this page open until finished."] = "Este proceso puede tardar varios minutos en completarse. Por favor envíe el formulario una sola vez y mantenga esta página abierta hasta que termine.";
+App::$strings["Import completed"] = "Importación completada";
+App::$strings["Import Items"] = "Importar elementos";
+App::$strings["Use this form to import existing posts and content from an export file."] = "Utilice este formulario para importar entradas existentes y contenido desde un archivo de exportación.";
+App::$strings["Total invitation limit exceeded."] = "Se ha superado el límite máximo de invitaciones.";
+App::$strings["%s : Not a valid email address."] = "%s : No es una dirección de correo electrónico válida. ";
+App::$strings["Please join us on \$Projectname"] = "Únase a nosotros en \$Projectname";
+App::$strings["Invitation limit exceeded. Please contact your site administrator."] = "Excedido el límite de invitaciones. Por favor, contacte con el Administrador de su sitio.";
+App::$strings["%s : Message delivery failed."] = "%s : Falló el envío del mensaje.";
+App::$strings["%d message sent."] = array(
+ 0 => "%d mensajes enviados.",
+ 1 => "%d mensajes enviados.",
+);
+App::$strings["You have no more invitations available"] = "No tiene más invitaciones disponibles";
+App::$strings["Send invitations"] = "Enviar invitaciones";
+App::$strings["Enter email addresses, one per line:"] = "Introduzca las direcciones de correo electrónico, una por línea:";
+App::$strings["Your message:"] = "Su mensaje:";
+App::$strings["Please join my community on \$Projectname."] = "Por favor, únase a mi comunidad en \$Projectname.";
+App::$strings["You will need to supply this invitation code:"] = "Tendrá que suministrar este código de invitación:";
+App::$strings["1. Register at any \$Projectname location (they are all inter-connected)"] = "1. Regístrese en cualquier sitio de \$Projectname (están todos interconectados)";
+App::$strings["2. Enter my \$Projectname network address into the site searchbar."] = "2. Introduzca mi dirección \$Projectname en la caja de búsqueda del sitio.";
+App::$strings["or visit"] = "o visitar";
+App::$strings["3. Click [Connect]"] = "3. Pulse [conectar]";
+App::$strings["Unable to locate original post."] = "No ha sido posible encontrar la entrada original.";
+App::$strings["Empty post discarded."] = "La entrada vacía ha sido desechada.";
+App::$strings["Executable content type not permitted to this channel."] = "Contenido de tipo ejecutable no permitido en este canal.";
+App::$strings["Duplicate post suppressed."] = "Se ha suprimido la entrada duplicada.";
+App::$strings["System error. Post not saved."] = "Error del sistema. La entrada no se ha podido salvar.";
+App::$strings["Unable to obtain post information from database."] = "No ha sido posible obtener información de la entrada en la base de datos.";
+App::$strings["You have reached your limit of %1$.0f top level posts."] = "Ha alcanzado su límite de %1$.0f entradas en la página principal.";
+App::$strings["You have reached your limit of %1$.0f webpages."] = "Ha alcanzado su límite de %1$.0f páginas web.";
+App::$strings["Layouts"] = "Plantillas";
+App::$strings["Comanche page description language help"] = "Página de ayuda del lenguaje de descripción de páginas (PDL) Comanche";
+App::$strings["Layout Description"] = "Descripción de la plantilla";
+App::$strings["Download PDL file"] = "Descargar el fichero PDL";
+App::$strings["Like/Dislike"] = "Me gusta/No me gusta";
+App::$strings["This action is restricted to members."] = "Esta acción está restringida solo para miembros.";
+App::$strings["Please <a href=\"rmagic\">login with your \$Projectname ID</a> or <a href=\"register\">register as a new \$Projectname member</a> to continue."] = "Por favor, <a href=\"rmagic\">identifíquese con su \$Projectname ID</a> o <a href=\"register\">rregístrese como un nuevo \$Projectname member</a> para continuar.";
+App::$strings["Invalid request."] = "Solicitud incorrecta.";
+App::$strings["channel"] = "el canal";
+App::$strings["thing"] = "elemento";
+App::$strings["Channel unavailable."] = "Canal no disponible.";
+App::$strings["Previous action reversed."] = "Acción anterior revocada.";
+App::$strings["photo"] = "foto";
+App::$strings["status"] = "el mensaje de estado";
+App::$strings["%1\$s likes %2\$s's %3\$s"] = "A %1\$s le gusta %3\$s de %2\$s";
+App::$strings["%1\$s doesn't like %2\$s's %3\$s"] = "A %1\$s no le gusta %3\$s de %2\$s";
+App::$strings["%1\$s agrees with %2\$s's %3\$s"] = "%3\$s de %2\$s: %1\$s está de acuerdo";
+App::$strings["%1\$s doesn't agree with %2\$s's %3\$s"] = "%3\$s de %2\$s: %1\$s no está de acuerdo";
+App::$strings["%1\$s abstains from a decision on %2\$s's %3\$s"] = "%3\$s de %2\$s: %1\$s se abstiene";
+App::$strings["%1\$s is attending %2\$s's %3\$s"] = "%3\$s de %2\$s: %1\$s participa";
+App::$strings["%1\$s is not attending %2\$s's %3\$s"] = "%3\$s de %2\$s: %1\$s no participa";
+App::$strings["%1\$s may attend %2\$s's %3\$s"] = "%3\$s de %2\$s: %1\$s quizá participe";
+App::$strings["Action completed."] = "Acción completada.";
+App::$strings["Thank you."] = "Gracias.";
+App::$strings["Remote privacy information not available."] = "La información privada remota no está disponible.";
+App::$strings["Visible to:"] = "Visible para:";
+App::$strings["Location not found."] = "Dirección no encontrada.";
+App::$strings["Location lookup failed."] = "Ha fallado la búsqueda de la dirección.";
+App::$strings["Please select another location to become primary before removing the primary location."] = "Por favor, seleccione una copia de su canal (un clon) para convertirlo en primario antes de eliminar su canal principal.";
+App::$strings["Syncing locations"] = "Sincronización de ubicaciones";
+App::$strings["No locations found."] = "No encontrada ninguna dirección.";
+App::$strings["Manage Channel Locations"] = "Gestionar las direcciones del canal";
+App::$strings["Primary"] = "Primario";
+App::$strings["Drop"] = "Eliminar";
+App::$strings["Sync Now"] = "Sincronizar ahora";
+App::$strings["Please wait several minutes between consecutive operations."] = "Por favor, espere algunos minutos entre operaciones consecutivas.";
+App::$strings["When possible, drop a location by logging into that website/hub and removing your channel."] = "Cuando sea posible, elimine una ubicación iniciando sesión en el sitio web o \"hub\" y borrando su canal.";
+App::$strings["Use this form to drop the location if the hub is no longer operating."] = "Utilice este formulario para eliminar la dirección si el \"hub\" no está funcionando desde hace tiempo.";
+App::$strings["No valid account found."] = "No se ha encontrado una cuenta válida.";
+App::$strings["Password reset request issued. Check your email."] = "Se ha recibido una solicitud de restablecimiento de contraseña. Consulte su correo electrónico.";
+App::$strings["Site Member (%s)"] = "Usuario del sitio (%s)";
+App::$strings["Password reset requested at %s"] = "Se ha solicitado restablecer la contraseña en %s";
+App::$strings["Request could not be verified. (You may have previously submitted it.) Password reset failed."] = "La solicitud no ha podido ser verificada. (Puede que la haya enviado con anterioridad) El restablecimiento de la contraseña ha fallado.";
+App::$strings["Password Reset"] = "Restablecer la contraseña";
+App::$strings["Your password has been reset as requested."] = "Su contraseña ha sido restablecida según lo solicitó.";
+App::$strings["Your new password is"] = "Su nueva contraseña es";
+App::$strings["Save or copy your new password - and then"] = "Guarde o copie su nueva contraseña - y después";
+App::$strings["click here to login"] = "pulse aquí para conectarse";
+App::$strings["Your password may be changed from the <em>Settings</em> page after successful login."] = "Puede cambiar la contraseña en la página <em>Ajustes</em> una vez iniciada la sesión.";
+App::$strings["Your password has changed at %s"] = "Su contraseña en %s ha sido cambiada";
+App::$strings["Forgot your Password?"] = "¿Ha olvidado su contraseña?";
+App::$strings["Enter your email address and submit to have your password reset. Then check your email for further instructions."] = "Introduzca y envíe su dirección de correo electrónico para el restablecimiento de su contraseña. Luego revise su correo para obtener más instrucciones.";
+App::$strings["Email Address"] = "Dirección de correo electrónico";
+App::$strings["Reset"] = "Reiniciar";
+App::$strings["Hub not found."] = "Servidor no encontrado";
+App::$strings["Unable to lookup recipient."] = "Imposible asociar a un destinatario.";
+App::$strings["Unable to communicate with requested channel."] = "Imposible comunicar con el canal solicitado.";
+App::$strings["Cannot verify requested channel."] = "No se puede verificar el canal solicitado.";
+App::$strings["Selected channel has private message restrictions. Send failed."] = "El canal seleccionado tiene restricciones sobre los mensajes privados. El envío falló.";
+App::$strings["Messages"] = "Mensajes";
+App::$strings["Message recalled."] = "Mensaje revocado.";
+App::$strings["Conversation removed."] = "Conversación eliminada.";
+App::$strings["Requested channel is not in this network"] = "El canal solicitado no existe en esta red";
+App::$strings["Send Private Message"] = "Enviar un mensaje privado";
+App::$strings["To:"] = "Para:";
+App::$strings["Subject:"] = "Asunto:";
+App::$strings["Send"] = "Enviar";
+App::$strings["Delete message"] = "Borrar mensaje";
+App::$strings["Delivery report"] = "Informe de transmisión";
+App::$strings["Recall message"] = "Revocar el mensaje";
+App::$strings["Message has been recalled."] = "El mensaje ha sido revocado.";
+App::$strings["Delete Conversation"] = "Eliminar conversación";
+App::$strings["No secure communications available. You <strong>may</strong> be able to respond from the sender's profile page."] = "Comunicación segura no disponible. Pero <strong>puede</strong> responder desde la página del perfil del remitente.";
+App::$strings["Send Reply"] = "Responder";
+App::$strings["Your message for %s (%s):"] = "Su mensaje para %s (%s):";
+App::$strings["You have created %1$.0f of %2$.0f allowed channels."] = "Ha creado %1$.0f de %2$.0f canales permitidos.";
+App::$strings["Create a new channel"] = "Crear un nuevo canal";
+App::$strings["Channel Manager"] = "Administración de canales";
+App::$strings["Current Channel"] = "Canal actual";
+App::$strings["Switch to one of your channels by selecting it."] = "Cambiar a uno de sus canales seleccionándolo.";
+App::$strings["Default Channel"] = "Canal principal";
+App::$strings["Make Default"] = "Convertir en predeterminado";
+App::$strings["%d new messages"] = "%d mensajes nuevos";
+App::$strings["%d new introductions"] = "%d nuevas isolicitudes de conexión";
+App::$strings["Delegated Channel"] = "Canal delegado";
+App::$strings["Profile Match"] = "Perfil compatible";
+App::$strings["No keywords to match. Please add keywords to your default profile."] = "No hay palabras clave en el perfil principal para poder encontrar perfiles compatibles. Por favor, añada palabras clave a su perfil principal.";
+App::$strings["is interested in:"] = "está interesado en:";
+App::$strings["No matches"] = "No se han encontrado perfiles compatibles";
+App::$strings["Unable to update menu."] = "No se puede actualizar el menú.";
+App::$strings["Unable to create menu."] = "No se puede crear el menú.";
+App::$strings["Menu Name"] = "Nombre del menú";
+App::$strings["Unique name (not visible on webpage) - required"] = "Nombre único (no será visible en la página web) - requerido";
+App::$strings["Menu Title"] = "Título del menú";
+App::$strings["Visible on webpage - leave empty for no title"] = "Visible en la página web - no ponga nada si no desea un título";
+App::$strings["Allow Bookmarks"] = "Permitir marcadores";
+App::$strings["Menu may be used to store saved bookmarks"] = "El menú se puede usar para guardar marcadores";
+App::$strings["Submit and proceed"] = "Enviar y proceder";
+App::$strings["Menus"] = "Menús";
+App::$strings["Bookmarks allowed"] = "Marcadores permitidos";
+App::$strings["Delete this menu"] = "Borrar este menú";
+App::$strings["Edit menu contents"] = "Editar los contenidos del menú";
+App::$strings["Edit this menu"] = "Modificar este menú";
+App::$strings["Menu could not be deleted."] = "El menú no puede ser eliminado.";
+App::$strings["Menu not found."] = "Menú no encontrado";
+App::$strings["Edit Menu"] = "Modificar el menú";
+App::$strings["Add or remove entries to this menu"] = "Añadir o quitar entradas en este menú";
+App::$strings["Menu name"] = "Nombre del menú";
+App::$strings["Must be unique, only seen by you"] = "Debe ser único, solo será visible para usted";
+App::$strings["Menu title"] = "Título del menú";
+App::$strings["Menu title as seen by others"] = "El título del menú tal como será visto por los demás";
+App::$strings["Allow bookmarks"] = "Permitir marcadores";
+App::$strings["Not found."] = "No encontrado.";
+App::$strings["Unable to create element."] = "Imposible crear el elemento.";
+App::$strings["Unable to update menu element."] = "No es posible actualizar el elemento del menú.";
+App::$strings["Unable to add menu element."] = "No es posible añadir el elemento al menú";
+App::$strings["Menu Item Permissions"] = "Permisos del elemento del menú";
+App::$strings["(click to open/close)"] = "(pulsar para abrir o cerrar)";
+App::$strings["Link Name"] = "Nombre del enlace";
+App::$strings["Link or Submenu Target"] = "Destino del enlace o submenú";
+App::$strings["Enter URL of the link or select a menu name to create a submenu"] = "Introducir la dirección del enlace o seleccionar el nombre de un submenú";
+App::$strings["Use magic-auth if available"] = "Usar la autenticación mágica si está disponible";
+App::$strings["Open link in new window"] = "Abrir el enlace en una nueva ventana";
+App::$strings["Order in list"] = "Orden en la lista";
+App::$strings["Higher numbers will sink to bottom of listing"] = "Los números más altos irán al final de la lista";
+App::$strings["Submit and finish"] = "Enviar y terminar";
+App::$strings["Submit and continue"] = "Enviar y continuar";
+App::$strings["Menu:"] = "Menú:";
+App::$strings["Link Target"] = "Destino del enlace";
+App::$strings["Edit menu"] = "Editar menú";
+App::$strings["Edit element"] = "Editar el elemento";
+App::$strings["Drop element"] = "Eliminar el elemento";
+App::$strings["New element"] = "Nuevo elemento";
+App::$strings["Edit this menu container"] = "Modificar el contenedor del menú";
+App::$strings["Add menu element"] = "Añadir un elemento al menú";
+App::$strings["Delete this menu item"] = "Eliminar este elemento del menú";
+App::$strings["Edit this menu item"] = "Modificar este elemento del menú";
+App::$strings["Menu item not found."] = "Este elemento del menú no se ha encontrado";
+App::$strings["Menu item deleted."] = "Este elemento del menú ha sido borrado";
+App::$strings["Menu item could not be deleted."] = "Este elemento del menú no puede ser borrado.";
+App::$strings["Edit Menu Element"] = "Editar elemento del menú";
+App::$strings["Link text"] = "Texto del enlace";
+App::$strings["__ctx:mood__ %1\$s is %2\$s"] = "%1\$s está %2\$s";
+App::$strings["Mood"] = "Estado de ánimo";
+App::$strings["Set your current mood and tell your friends"] = "Describir su estado de ánimo para comunicárselo a sus amigos";
App::$strings["No such group"] = "No se encuentra el grupo";
App::$strings["No such channel"] = "No se encuentra el canal";
App::$strings["forum"] = "foro";
@@ -1516,8 +851,115 @@ App::$strings["Search Results For:"] = "Buscar resultados para:";
App::$strings["Privacy group is empty"] = "El grupo de canales está vacío";
App::$strings["Privacy group: "] = "Grupo de canales: ";
App::$strings["Invalid connection."] = "Conexión no válida.";
-App::$strings["Cover Photos"] = "Imágenes de portada del perfil";
-App::$strings["Upload Cover Photo"] = "Subir imagen de portada del perfil";
+App::$strings["Name or caption"] = "Nombre o descripción";
+App::$strings["Examples: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \"Aviation Group\""] = "Ejemplos: \"Juan García\", \"Luisa y sus caballos\", \"Fútbol\", \"Grupo de aviación\"";
+App::$strings["Choose a short nickname"] = "Elija un alias corto";
+App::$strings["Your nickname will be used to create an easy to remember channel address e.g. nickname%s"] = "Su alias se usará para crear una dirección de canal fácil de recordar, p. ej.: alias%s";
+App::$strings["Channel role and privacy"] = "Clase de canal y privacidad";
+App::$strings["Select a channel role with your privacy requirements."] = "Seleccione un tipo de canal con sus requisitos de privacidad";
+App::$strings["Read more about roles"] = "Leer más sobre los roles";
+App::$strings["Create Channel"] = "Crear un canal";
+App::$strings["A channel is your identity on this network. It can represent a person, a blog, or a forum to name a few. Channels can make connections with other channels to share information with highly detailed permissions."] = "Un canal es su identidad en esta red. Puede representar a una persona, un blog o un foro, por nombrar unos pocos ejemplos. Los canales se pueden conectar con otros canales para compartir información con una gama de permisos extremadamente detallada.";
+App::$strings["or <a href=\"import\">import an existing channel</a> from another location."] = "O <a href=\"import\">importar un canal existente</a> desde otro lugar.";
+App::$strings["Invalid request identifier."] = "Petición inválida del identificador.";
+App::$strings["Discard"] = "Descartar";
+App::$strings["No more system notifications."] = "No hay más notificaciones del sistema";
+App::$strings["System Notifications"] = "Notificaciones del sistema";
+App::$strings["Mark all system notifications seen"] = "Marcar todas las notificaciones de sistema como leídas";
+App::$strings["Unable to find your hub."] = "No se puede encontrar su servidor.";
+App::$strings["Post successful."] = "Enviado con éxito.";
+App::$strings["OpenID protocol error. No ID returned."] = "Error del protocolo OpenID. Ningún ID recibido como respuesta.";
+App::$strings["Login failed."] = "El acceso ha fallado.";
+App::$strings["Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."] = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";
+App::$strings["This setting requires special processing and editing has been blocked."] = "Este ajuste necesita de un proceso especial y la edición ha sido bloqueada.";
+App::$strings["Configuration Editor"] = "Editor de configuración";
+App::$strings["Warning: Changing some settings could render your channel inoperable. Please leave this page unless you are comfortable with and knowledgeable about how to correctly use this feature."] = "Atención: El cambio de algunos ajustes puede volver inutilizable su canal. Por favor, abandone la página excepto que esté seguro y sepa cómo usar correctamente esta característica.";
+App::$strings["Layout updated."] = "Plantilla actualizada.";
+App::$strings["Edit System Page Description"] = "Editor del Sistema de Descripción de Páginas";
+App::$strings["Layout not found."] = "Plantilla no encontrada";
+App::$strings["Module Name:"] = "Nombre del módulo:";
+App::$strings["Layout Help"] = "Ayuda para el diseño de plantillas de página";
+App::$strings["Page owner information could not be retrieved."] = "La información del propietario de la página no pudo ser recuperada.";
+App::$strings["Profile Photos"] = "Fotos del perfil";
+App::$strings["Album not found."] = "Álbum no encontrado.";
+App::$strings["Delete Album"] = "Borrar álbum";
+App::$strings["Multiple storage folders exist with this album name, but within different directories. Please remove the desired folder or folders using the Files manager"] = "Hay varias carpetas con este nombre de álbum, pero dentro de diferentes directorios. Por favor, elimine la carpeta o carpetas que desee utilizando el administrador de ficheros";
+App::$strings["Delete Photo"] = "Borrar foto";
+App::$strings["No photos selected"] = "No hay fotos seleccionadas";
+App::$strings["Access to this item is restricted."] = "El acceso a este elemento está restringido.";
+App::$strings["%1$.2f MB of %2$.2f MB photo storage used."] = "%1$.2f MB de %2$.2f MB de almacenamiento de fotos utilizado.";
+App::$strings["%1$.2f MB photo storage used."] = "%1$.2f MB de almacenamiento de fotos utilizado.";
+App::$strings["Upload Photos"] = "Subir fotos";
+App::$strings["Enter an album name"] = "Introducir un nombre de álbum";
+App::$strings["or select an existing album (doubleclick)"] = "o seleccionar uno existente (doble click)";
+App::$strings["Create a status post for this upload"] = "Crear un mensaje de estado para esta subida";
+App::$strings["Caption (optional):"] = "Título (opcional):";
+App::$strings["Description (optional):"] = "Descripción (opcional):";
+App::$strings["Album name could not be decoded"] = "El nombre del álbum no ha podido ser descifrado";
+App::$strings["Contact Photos"] = "Fotos de contacto";
+App::$strings["Show Newest First"] = "Mostrar lo más reciente primero";
+App::$strings["Show Oldest First"] = "Mostrar lo más antiguo primero";
+App::$strings["View Photo"] = "Ver foto";
+App::$strings["Edit Album"] = "Editar álbum";
+App::$strings["Permission denied. Access to this item may be restricted."] = "Permiso denegado. El acceso a este elemento puede estar restringido.";
+App::$strings["Photo not available"] = "Foto no disponible";
+App::$strings["Use as profile photo"] = "Usar como foto del perfil";
+App::$strings["Use as cover photo"] = "Usar como imagen de portada del perfil";
+App::$strings["Private Photo"] = "Foto privada";
+App::$strings["View Full Size"] = "Ver tamaño completo";
+App::$strings["Remove"] = "Eliminar";
+App::$strings["Edit photo"] = "Editar foto";
+App::$strings["Rotate CW (right)"] = "Girar CW (a la derecha)";
+App::$strings["Rotate CCW (left)"] = "Girar CCW (a la izquierda)";
+App::$strings["Enter a new album name"] = "Introducir un nuevo nombre de álbum";
+App::$strings["or select an existing one (doubleclick)"] = "o seleccionar uno (doble click) existente";
+App::$strings["Caption"] = "Título";
+App::$strings["Add a Tag"] = "Añadir una etiqueta";
+App::$strings["Example: @bob, @Barbara_Jensen, @jim@example.com"] = "Ejemplos: @eva, @Carmen_Osuna, @jaime@ejemplo.com";
+App::$strings["Flag as adult in album view"] = "Marcar como \"solo para adultos\" en el álbum";
+App::$strings["I like this (toggle)"] = "Me gusta (cambiar)";
+App::$strings["I don't like this (toggle)"] = "No me gusta esto (cambiar)";
+App::$strings["This is you"] = "Este es usted";
+App::$strings["Comment"] = "Comentar";
+App::$strings["__ctx:title__ Likes"] = "Me gusta";
+App::$strings["__ctx:title__ Dislikes"] = "No me gusta";
+App::$strings["__ctx:title__ Agree"] = "De acuerdo";
+App::$strings["__ctx:title__ Disagree"] = "En desacuerdo";
+App::$strings["__ctx:title__ Abstain"] = "Abstención";
+App::$strings["__ctx:title__ Attending"] = "Participaré";
+App::$strings["__ctx:title__ Not attending"] = "No participaré";
+App::$strings["__ctx:title__ Might attend"] = "Quizá participe";
+App::$strings["View all"] = "Ver todo";
+App::$strings["__ctx:noun__ Like"] = array(
+ 0 => "Me gusta",
+ 1 => "Me gusta",
+);
+App::$strings["__ctx:noun__ Dislike"] = array(
+ 0 => "No me gusta",
+ 1 => "No me gusta",
+);
+App::$strings["In This Photo:"] = "En esta foto:";
+App::$strings["Map"] = "Mapa";
+App::$strings["__ctx:noun__ Likes"] = "Me gusta";
+App::$strings["__ctx:noun__ Dislikes"] = "No me gusta";
+App::$strings["Close"] = "Cerrar";
+App::$strings["View Album"] = "Ver álbum";
+App::$strings["Recent Photos"] = "Fotos recientes";
+App::$strings["sent you a private message"] = "le ha enviado un mensaje privado";
+App::$strings["added your channel"] = "añadió este canal a sus conexiones";
+App::$strings["g A l F d"] = "g A l d F";
+App::$strings["[today]"] = "[hoy]";
+App::$strings["posted an event"] = "publicó un evento";
+App::$strings["Poke"] = "Toques y otras cosas";
+App::$strings["Poke somebody"] = "Dar un toque a alguien";
+App::$strings["Poke/Prod"] = "Toque/Incitación";
+App::$strings["Poke, prod or do other things to somebody"] = "Dar un toque, incitar o hacer otras cosas a alguien";
+App::$strings["Recipient"] = "Destinatario";
+App::$strings["Choose what you wish to do to recipient"] = "Elegir qué desea enviar al destinatario";
+App::$strings["Make this post private"] = "Convertir en privado este envío";
+App::$strings["Fetching URL returns error: %1\$s"] = "Al intentar obtener la dirección, retorna el error: %1\$s";
+App::$strings["Shift-reload the page or clear browser cache if the new photo does not display immediately."] = "Recargue la página o limpie el caché del navegador si la nueva foto no se muestra inmediatamente.";
+App::$strings["Upload Profile Photo"] = "Subir foto de perfil";
App::$strings["Profile not found."] = "Perfil no encontrado.";
App::$strings["Profile deleted."] = "Perfil eliminado.";
App::$strings["Profile-"] = "Perfil-";
@@ -1532,7 +974,6 @@ App::$strings["Dislikes"] = "No me gusta";
App::$strings["Work/Employment"] = "Trabajo:";
App::$strings["Religion"] = "Religión";
App::$strings["Political Views"] = "Ideas políticas";
-App::$strings["Gender"] = "Género";
App::$strings["Sexual Preference"] = "Preferencia sexual";
App::$strings["Homepage"] = "Página personal";
App::$strings["Interests"] = "Intereses";
@@ -1540,12 +981,16 @@ App::$strings["Profile updated."] = "Perfil actualizado.";
App::$strings["Hide your connections list from viewers of this profile"] = "Ocultar la lista de conexiones a los visitantes del perfil";
App::$strings["Edit Profile Details"] = "Modificar los detalles de este perfil";
App::$strings["View this profile"] = "Ver este perfil";
+App::$strings["Edit visibility"] = "Editar visibilidad";
App::$strings["Change cover photo"] = "Cambiar la imagen de portada del perfil";
+App::$strings["Change profile photo"] = "Cambiar la foto del perfil";
App::$strings["Create a new profile using these settings"] = "Crear un nuevo perfil usando estos ajustes";
App::$strings["Clone this profile"] = "Clonar este perfil";
App::$strings["Delete this profile"] = "Eliminar este perfil";
App::$strings["Add profile things"] = "Añadir cosas al perfil";
+App::$strings["Personal"] = "Personales";
App::$strings["Relation"] = "Relación";
+App::$strings["Miscellaneous"] = "Varios";
App::$strings["Import profile from file"] = "Importar perfil desde un fichero";
App::$strings["Export profile to file"] = "Exportar perfil a un fichero";
App::$strings["Your gender"] = "Género";
@@ -1564,7 +1009,6 @@ App::$strings["Who (if applicable)"] = "Quién (si es pertinente)";
App::$strings["Examples: cathy123, Cathy Williams, cathy@example.com"] = "Por ejemplo: ana123, María González, sara@ejemplo.com";
App::$strings["Since (date)"] = "Desde (fecha)";
App::$strings["Tell us about yourself"] = "Háblenos de usted";
-App::$strings["Homepage URL"] = "Dirección de la página personal";
App::$strings["Hometown"] = "Lugar de nacimiento";
App::$strings["Political views"] = "Ideas políticas";
App::$strings["Religious views"] = "Creencias religiosas";
@@ -1579,119 +1023,32 @@ App::$strings["Love/Romance"] = "Vida sentimental o amorosa";
App::$strings["School/Education"] = "Estudios";
App::$strings["Contact information and social networks"] = "Información de contacto y redes sociales";
App::$strings["My other channels"] = "Mis otros canales";
-App::$strings["\$Projectname channel"] = "Canal \$Projectname";
+App::$strings["Profile Image"] = "Imagen del perfil";
+App::$strings["Edit Profiles"] = "Editar perfiles";
App::$strings["Invalid profile identifier."] = "Identificador del perfil no válido";
App::$strings["Profile Visibility Editor"] = "Editor de visibilidad del perfil";
+App::$strings["Profile"] = "Perfil";
App::$strings["Click on a contact to add or remove."] = "Pulsar en un contacto para añadirlo o eliminarlo.";
App::$strings["Visible To"] = "Visible para";
-App::$strings["%d rating"] = array(
- 0 => "%d valoración",
- 1 => "%d valoraciones",
-);
-App::$strings["Gender: "] = "Género:";
-App::$strings["Status: "] = "Estado:";
-App::$strings["Homepage: "] = "Página personal:";
-App::$strings["Description:"] = "Descripción:";
-App::$strings["Public Forum:"] = "Foro público:";
-App::$strings["Keywords: "] = "Palabras clave:";
-App::$strings["Don't suggest"] = "No sugerir:";
-App::$strings["Common connections:"] = "Conexiones comunes:";
-App::$strings["Global Directory"] = "Directorio global:";
-App::$strings["Local Directory"] = "Directorio local:";
-App::$strings["Finding:"] = "Encontrar:";
-App::$strings["next page"] = "siguiente página";
-App::$strings["previous page"] = "página anterior";
-App::$strings["Sort options"] = "Ordenar opciones";
-App::$strings["Alphabetic"] = "Alfabético";
-App::$strings["Reverse Alphabetic"] = "Alfabético inverso";
-App::$strings["Newest to Oldest"] = "De más nuevo a más antiguo";
-App::$strings["Oldest to Newest"] = "De más antiguo a más nuevo";
-App::$strings["No entries (some entries may be hidden)."] = "Sin entradas (algunas entradas pueden estar ocultas).";
-App::$strings["This site is not a directory server"] = "Este sitio no es un servidor de directorio";
-App::$strings["This directory server requires an access token"] = "El servidor de este directorio necesita un \"token\" de acceso";
+App::$strings["Public Hubs"] = "Servidores públicos";
App::$strings["The listed hubs allow public registration for the \$Projectname network. All hubs in the network are interlinked so membership on any of them conveys membership in the network as a whole. Some hubs may require subscription or provide tiered service plans. The hub itself <strong>may</strong> provide additional details."] = "Los sitios listados permiten el registro público en la red \$Projectname. Todos los sitios de la red están vinculados entre sí, por lo que sus miembros, en ninguno de ellos, indican la pertenencia a la red en su conjunto. Algunos sitios pueden requerir suscripción o proporcionar planes de servicio por niveles. Los mismos hubs <strong>pueden</strong> proporcionar detalles adicionales.";
App::$strings["Hub URL"] = "Dirección del hub";
App::$strings["Access Type"] = "Tipo de acceso";
App::$strings["Registration Policy"] = "Normas de registro";
+App::$strings["Ratings"] = "Valoraciones";
App::$strings["Rate"] = "Valorar";
-App::$strings["Invalid message"] = "Mensaje no válido";
-App::$strings["no results"] = "sin resultados";
-App::$strings["Delivery report for %1\$s"] = "Informe de entrega para %1\$s";
-App::$strings["channel sync processed"] = "se ha realizado la sincronización del canal";
-App::$strings["queued"] = "encolado";
-App::$strings["posted"] = "enviado";
-App::$strings["accepted for delivery"] = "aceptado para el envío";
-App::$strings["updated"] = "actualizado";
-App::$strings["update ignored"] = "actualización ignorada";
-App::$strings["permission denied"] = "permiso denegado";
-App::$strings["recipient not found"] = "destinatario no encontrado";
-App::$strings["mail recalled"] = "mensaje de correo revocado";
-App::$strings["duplicate mail received"] = "se ha recibido mensaje duplicado";
-App::$strings["mail delivered"] = "correo enviado";
-App::$strings["Delete block?"] = "¿Borrar bloque?";
-App::$strings["Edit Block"] = "Modificar este bloque";
-App::$strings["You have created %1$.0f of %2$.0f allowed channels."] = "Ha creado %1$.0f de %2$.0f canales permitidos.";
-App::$strings["Name or caption"] = "Nombre o descripción";
-App::$strings["Examples: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \"Aviation Group\""] = "Ejemplos: \"Juan García\", \"Luisa y sus caballos\", \"Fútbol\", \"Grupo de aviación\"";
-App::$strings["Choose a short nickname"] = "Elija un alias corto";
-App::$strings["Your nickname will be used to create an easy to remember channel address e.g. nickname%s"] = "Su alias se usará para crear una dirección de canal fácil de recordar, p. ej.: alias%s";
-App::$strings["Channel role and privacy"] = "Clase de canal y privacidad";
-App::$strings["Select a channel role with your privacy requirements."] = "Seleccione un tipo de canal con sus requisitos de privacidad";
-App::$strings["Read more about roles"] = "Leer más sobre los roles";
-App::$strings["Create Channel"] = "Crear un canal";
-App::$strings["A channel is your identity on this network. It can represent a person, a blog, or a forum to name a few. Channels can make connections with other channels to share information with highly detailed permissions."] = "Un canal es su identidad en esta red. Puede representar a una persona, un blog o un foro, por nombrar unos pocos ejemplos. Los canales se pueden conectar con otros canales para compartir información con una gama de permisos extremadamente detallada.";
-App::$strings["or <a href=\"import\">import an existing channel</a> from another location."] = "O <a href=\"import\">importar un canal existente</a> desde otro lugar.";
-App::$strings["Delete layout?"] = "¿Borrar la plantilla?";
-App::$strings["Layout Description (Optional)"] = "Descripción de la plantilla (opcional)";
-App::$strings["Layout Name"] = "Nombre de la plantilla";
-App::$strings["Edit Layout"] = "Modificar la plantilla";
App::$strings["Website:"] = "Sitio web:";
App::$strings["Remote Channel [%s] (not yet known on this site)"] = "Canal remoto [%s] (aún no es conocido en este sitio)";
App::$strings["Rating (this information is public)"] = "Valoración (esta información es pública)";
App::$strings["Optionally explain your rating (this information is public)"] = "Opcionalmente puede explicar su valoración (esta información es pública)";
-App::$strings["Page Title"] = "Título de página";
-App::$strings["Delete webpage?"] = "¿Eliminar la página web?";
-App::$strings["Page link title"] = "Título del enlace de la página";
-App::$strings["Edit Webpage"] = "Editar la página web";
-App::$strings["Block Name"] = "Nombre del bloque";
-App::$strings["Block Title"] = "Título del bloque";
App::$strings["No ratings"] = "Ninguna valoración";
App::$strings["Rating: "] = "Valoración:";
App::$strings["Website: "] = "Sitio web:";
App::$strings["Description: "] = "Descripción:";
-App::$strings["Calendar entries imported."] = "Entradas de calendario importadas.";
-App::$strings["No calendar entries found."] = "No se han encontrado entradas de calendario.";
-App::$strings["Event can not end before it has started."] = "Un evento no puede terminar antes de que haya comenzado.";
-App::$strings["Unable to generate preview."] = "No se puede crear la vista previa.";
-App::$strings["Event title and start time are required."] = "Se requieren el título del evento y su hora de inicio.";
-App::$strings["Event not found."] = "Evento no encontrado.";
-App::$strings["Edit event title"] = "Editar el título del evento";
-App::$strings["Event title"] = "Título del evento";
-App::$strings["Categories (comma-separated list)"] = "Categorías (lista separada por comas)";
-App::$strings["Edit Category"] = "Editar la categoría";
-App::$strings["Category"] = "Categoría";
-App::$strings["Edit start date and time"] = "Modificar la fecha y hora de comienzo";
-App::$strings["Start date and time"] = "Fecha y hora de comienzo";
-App::$strings["Finish date and time are not known or not relevant"] = "La fecha y hora de terminación no se conocen o no son relevantes";
-App::$strings["Edit finish date and time"] = "Modificar la fecha y hora de terminación";
-App::$strings["Finish date and time"] = "Fecha y hora de terminación";
-App::$strings["Adjust for viewer timezone"] = "Ajustar para obtener el visor de los husos horarios";
-App::$strings["Important for events that happen in a particular place. Not practical for global holidays."] = "Importante para los eventos que suceden en un lugar determinado. No es práctico para los globales.";
-App::$strings["Edit Description"] = "Editar la descripción";
-App::$strings["Edit Location"] = "Modificar la dirección";
-App::$strings["Share this event"] = "Compartir este evento";
-App::$strings["Advanced Options"] = "Opciones avanzadas";
-App::$strings["Edit event"] = "Editar evento";
-App::$strings["Delete event"] = "Borrar evento";
-App::$strings["calendar"] = "calendario";
-App::$strings["Event removed"] = "Evento borrado";
-App::$strings["Failed to remove event"] = "Error al eliminar el evento";
App::$strings["Select a bookmark folder"] = "Seleccionar una carpeta de marcadores";
App::$strings["Save Bookmark"] = "Guardar marcador";
App::$strings["URL of bookmark"] = "Dirección del marcador";
App::$strings["Or enter new bookmark folder name"] = "O introduzca un nuevo nombre para la carpeta de marcadores";
-App::$strings["Share content from Firefox to \$Projectname"] = "Compartir contenido desde Firefox a \$Projectname";
-App::$strings["Activate the Firefox \$Projectname provider"] = "Servicio de compartición de Firefox: activar el proveedor \$Projectname ";
App::$strings["Maximum daily site registrations exceeded. Please try again tomorrow."] = "Se ha superado el límite máximo de inscripciones diarias de este sitio. Por favor, pruebe de nuevo mañana.";
App::$strings["Please indicate acceptance of the Terms of Service. Registration failed."] = "Por favor, confirme que acepta los Términos del servicio. El registro ha fallado.";
App::$strings["Passwords do not match."] = "Las contraseñas no coinciden.";
@@ -1712,24 +1069,9 @@ App::$strings["Please enter your invitation code"] = "Por favor, introduzca el c
App::$strings["no"] = "no";
App::$strings["yes"] = "sí";
App::$strings["Membership on this site is by invitation only."] = "Para registrarse en este sitio es necesaria una invitación.";
+App::$strings["Register"] = "Registrarse";
App::$strings["Proceed to create your first channel"] = "Crear su primer canal";
App::$strings["Please login."] = "Por favor, inicie sesión.";
-App::$strings["- select -"] = "- seleccionar -";
-App::$strings["Invalid request identifier."] = "Petición inválida del identificador.";
-App::$strings["Discard"] = "Descartar";
-App::$strings["No more system notifications."] = "No hay más notificaciones del sistema";
-App::$strings["System Notifications"] = "Notificaciones del sistema";
-App::$strings["Permission Denied."] = "Permiso denegado";
-App::$strings["File not found."] = "Fichero no encontrado.";
-App::$strings["Edit file permissions"] = "Modificar los permisos del fichero";
-App::$strings["Set/edit permissions"] = "Establecer/editar los permisos";
-App::$strings["Include all files and sub folders"] = "Incluir todos los ficheros y subcarpetas";
-App::$strings["Return to file list"] = "Volver a la lista de ficheros";
-App::$strings["Copy/paste this code to attach file to a post"] = "Copiar/pegar este código para adjuntar el fichero al envío";
-App::$strings["Copy/paste this URL to link file from a web page"] = "Copiar/pegar esta dirección para enlazar el fichero desde una página web";
-App::$strings["Share this file"] = "Compartir este fichero";
-App::$strings["Show URL to this file"] = "Mostrar la dirección de este fichero";
-App::$strings["Notify your contacts about this file"] = "Avisar a sus contactos sobre este fichero";
App::$strings["Account removals are not allowed within 48 hours of changing the account password."] = "La eliminación de cuentas no está permitida hasta después de que hayan transcurrido 48 horas desde el último cambio de contraseña.";
App::$strings["Remove This Account"] = "Eliminar esta cuenta";
App::$strings["WARNING: "] = "ATENCIÓN:";
@@ -1739,45 +1081,24 @@ App::$strings["Please enter your password for verification:"] = "Por favor, intr
App::$strings["Remove this account, all its channels and all its channel clones from the network"] = "Remover esta cuenta, todos sus canales y clones de la red";
App::$strings["By default only the instances of the channels located on this hub will be removed from the network"] = "Por defecto, solo las instancias de los canales ubicados en este servidor serán eliminados de la red";
App::$strings["Remove Account"] = "Eliminar cuenta";
-App::$strings["Channel added."] = "Canal añadido.";
App::$strings["Channel removals are not allowed within 48 hours of changing the account password."] = "La eliminación de canales no está permitida hasta pasadas 48 horas desde el último cambio de contraseña.";
App::$strings["Remove This Channel"] = "Eliminar este canal";
App::$strings["This channel will be completely removed from the network. "] = "Este canal va a ser completamente eliminado de la red.";
App::$strings["Remove this channel and all its clones from the network"] = "Eliminar este canal y todos sus clones de la red";
App::$strings["By default only the instance of the channel located on this hub will be removed from the network"] = "Por defecto, solo la instancia del canal alojado en este servidor será eliminado de la red";
App::$strings["Remove Channel"] = "Eliminar el canal";
-App::$strings["Contact not found."] = "Contacto no encontrado";
-App::$strings["Friend suggestion sent."] = "Enviar sugerencia a un amigo.";
-App::$strings["Suggest Friends"] = "Sugerir amigos";
-App::$strings["Suggest a friend for %s"] = "Sugerir un amigo a %s";
App::$strings["We encountered a problem while logging in with the OpenID you provided. Please check the correct spelling of the ID."] = "Encontramos un problema durante el inicio de sesión con la OpenID que proporcionó. Por favor, compruebe que la ID está correctamente escrita.";
App::$strings["The error message was:"] = "El mensaje de error fue:";
App::$strings["Authentication failed."] = "Falló la autenticación.";
App::$strings["Remote Authentication"] = "Acceso desde su servidor";
App::$strings["Enter your channel address (e.g. channel@example.com)"] = "Introduzca la dirección del canal (p.ej. canal@ejemplo.com)";
App::$strings["Authenticate"] = "Acceder";
-App::$strings["Documentation Search"] = "Búsqueda de Documentación";
-App::$strings["Help:"] = "Ayuda:";
-App::$strings["\$Projectname Documentation"] = "Documentación de \$Projectname";
-App::$strings["Privacy group created."] = "El grupo de canales ha sido creado.";
-App::$strings["Could not create privacy group."] = "No se puede crear el grupo de canales";
-App::$strings["Privacy group updated."] = "Grupo de canales actualizado.";
-App::$strings["Create a group of channels."] = "Crear un grupo de canales.";
-App::$strings["Privacy group name: "] = "Nombre del grupo de canales:";
-App::$strings["Members are visible to other channels"] = "Los miembros son visibles para otros canales";
-App::$strings["Privacy group removed."] = "Grupo de canales eliminado.";
-App::$strings["Unable to remove privacy group."] = "Imposible eliminar el grupo de canales.";
-App::$strings["Privacy group editor"] = "Editor de grupos de canales";
-App::$strings["Members"] = "Miembros";
-App::$strings["All Connected Channels"] = "Todos los canales conectados";
-App::$strings["Click on a channel to add or remove."] = "Haga clic en un canal para agregarlo o quitarlo.";
App::$strings["Items tagged with: %s"] = "elementos etiquetados con: %s";
App::$strings["Search results for: %s"] = "Resultados de la búsqueda para: %s";
-App::$strings["\$Projectname"] = "\$Projectname";
-App::$strings["Welcome to %s"] = "Bienvenido a %s";
App::$strings["No service class restrictions found."] = "No se han encontrado restricciones sobre esta clase de servicio.";
App::$strings["Name is required"] = "El nombre es obligatorio";
App::$strings["Key and Secret are required"] = "\"Key\" y \"Secret\" son obligatorios";
+App::$strings["Update"] = "Actualizar";
App::$strings["Not valid email."] = "Correo electrónico no válido.";
App::$strings["Protected email address. Cannot change to that email."] = "Dirección de correo electrónico protegida. No se puede cambiar a ella.";
App::$strings["System failure storing new email. Please try again."] = "Fallo de sistema al guardar el nuevo correo electrónico. Por favor, inténtelo de nuevo.";
@@ -1849,6 +1170,7 @@ App::$strings["Allow us to suggest you as a potential friend to new members?"] =
App::$strings["Your channel address is"] = "Su dirección de canal es";
App::$strings["Channel Settings"] = "Ajustes del canal";
App::$strings["Basic Settings"] = "Configuración básica";
+App::$strings["Full Name:"] = "Nombre completo:";
App::$strings["Your Timezone:"] = "Su huso horario:";
App::$strings["Default Post Location:"] = "Localización geográfica predeterminada para sus publicaciones:";
App::$strings["Geographical location to display on your posts"] = "Localización geográfica que debe mostrarse en sus publicaciones";
@@ -1917,21 +1239,6 @@ App::$strings["Personal menu to display in your channel pages"] = "Menú persona
App::$strings["Remove this channel."] = "Eliminar este canal.";
App::$strings["Firefox Share \$Projectname provider"] = "Servicio de compartición de Firefox: proveedor \$Projectname";
App::$strings["Start calendar week on monday"] = "Comenzar el calendario semanal por el lunes";
-App::$strings["First Name"] = "Nombre";
-App::$strings["Last Name"] = "Apellido";
-App::$strings["Nickname"] = "Sobrenombre o Alias";
-App::$strings["Full Name"] = "Nombre completo";
-App::$strings["Profile Photo 16px"] = "Foto del perfil 16px";
-App::$strings["Profile Photo 32px"] = "Foto del perfil 32px";
-App::$strings["Profile Photo 48px"] = "Foto del perfil 48px";
-App::$strings["Profile Photo 64px"] = "Foto del perfil 64px";
-App::$strings["Profile Photo 80px"] = "Foto del perfil 80px";
-App::$strings["Profile Photo 128px"] = "Foto del perfil 128px";
-App::$strings["Timezone"] = "Huso horario";
-App::$strings["Birth Year"] = "Año de nacimiento";
-App::$strings["Birth Month"] = "Mes de nacimiento";
-App::$strings["Birth Day"] = "Día de nacimiento";
-App::$strings["Birthdate"] = "Fecha de nacimiento";
App::$strings["\$Projectname Server - Setup"] = "Servidor \$Projectname - Instalación";
App::$strings["Could not connect to database."] = "No se ha podido conectar a la base de datos.";
App::$strings["Could not connect to specified site URL. Possible SSL certificate or DNS issue."] = "No se puede conectar con la dirección del sitio indicada. Podría tratarse de un problema de SSL o DNS.";
@@ -2018,52 +1325,10 @@ App::$strings["The database configuration file \".htconfig.php\" could not be wr
App::$strings["Errors encountered creating database tables."] = "Se han encontrado errores al crear las tablas de la base de datos.";
App::$strings["<h1>What next</h1>"] = "<h1>Siguiente paso</h1>";
App::$strings["IMPORTANT: You will need to [manually] setup a scheduled task for the poller."] = "IMPORTANTE: Debe crear [manualmente] una tarea programada para el \"poller\".";
-App::$strings["%s element installed"] = "%s elemento instalado";
-App::$strings["%s element installation failed"] = "Elemento con instalación fallida: %s";
-App::$strings["Your service plan only allows %d channels."] = "Su paquete de servicios solo permite %d canales.";
-App::$strings["Nothing to import."] = "No hay nada para importar.";
-App::$strings["Unable to download data from old server"] = "No se han podido descargar datos de su antiguo servidor";
-App::$strings["Imported file is empty."] = "El fichero importado está vacío.";
-App::$strings["Warning: Database versions differ by %1\$d updates."] = "Atención: Las versiones de la base de datos difieren en %1\$d actualizaciones.";
-App::$strings["No channel. Import failed."] = "No hay canal. La importación ha fallado";
-App::$strings["You must be logged in to use this feature."] = "Debe estar registrado para poder usar esta funcionalidad.";
-App::$strings["Import Channel"] = "Importar canal";
-App::$strings["Use this form to import an existing channel from a different server/hub. You may retrieve the channel identity from the old server/hub via the network or provide an export file."] = "Emplee este formulario para importar un canal desde un servidor/hub diferente. Puede recuperar el canal desde el antiguo servidor/hub a través de la red o proporcionando un fichero de exportación.";
-App::$strings["File to Upload"] = "Fichero para subir";
-App::$strings["Or provide the old server/hub details"] = "O proporcione los detalles de su antiguo servidor/hub";
-App::$strings["Your old identity address (xyz@example.com)"] = "Su identidad en el antiguo servidor (canal@ejemplo.com)";
-App::$strings["Your old login email address"] = "Su antigua dirección de correo electrónico";
-App::$strings["Your old login password"] = "Su antigua contraseña";
-App::$strings["For either option, please choose whether to make this hub your new primary address, or whether your old location should continue this role. You will be able to post from either location, but only one can be marked as the primary location for files, photos, and media."] = "Para cualquiera de las opciones, elija si hacer de este servidor su nueva dirección primaria, o si su antigua dirección debe continuar con este papel. Usted podrá publicar desde cualquier ubicación, pero sólo una puede estar marcada como la ubicación principal para los ficheros, fotos y otras imágenes o vídeos.";
-App::$strings["Make this hub my primary location"] = "Convertir este servidor en mi ubicación primaria";
-App::$strings["Import existing posts if possible (experimental - limited by available memory"] = "Importar el contenido publicado si es posible (experimental - limitado por la memoria disponible";
-App::$strings["This process may take several minutes to complete. Please submit the form only once and leave this page open until finished."] = "Este proceso puede tardar varios minutos en completarse. Por favor envíe el formulario una sola vez y mantenga esta página abierta hasta que termine.";
-App::$strings["Import completed"] = "Importación completada";
-App::$strings["Import Items"] = "Importar elementos";
-App::$strings["Use this form to import existing posts and content from an export file."] = "Utilice este formulario para importar entradas existentes y contenido desde un archivo de exportación.";
App::$strings["Files: shared with me"] = "Ficheros: compartidos conmigo";
App::$strings["NEW"] = "NUEVO";
App::$strings["Remove all files"] = "Eliminar todos los ficheros";
App::$strings["Remove this file"] = "Eliminar este fichero";
-App::$strings["Total invitation limit exceeded."] = "Se ha superado el límite máximo de invitaciones.";
-App::$strings["%s : Not a valid email address."] = "%s : No es una dirección de correo electrónico válida. ";
-App::$strings["Please join us on \$Projectname"] = "Únase a nosotros en \$Projectname";
-App::$strings["Invitation limit exceeded. Please contact your site administrator."] = "Excedido el límite de invitaciones. Por favor, contacte con el Administrador de su sitio.";
-App::$strings["%s : Message delivery failed."] = "%s : Falló el envío del mensaje.";
-App::$strings["%d message sent."] = array(
- 0 => "%d mensajes enviados.",
- 1 => "%d mensajes enviados.",
-);
-App::$strings["You have no more invitations available"] = "No tiene más invitaciones disponibles";
-App::$strings["Send invitations"] = "Enviar invitaciones";
-App::$strings["Enter email addresses, one per line:"] = "Introduzca las direcciones de correo electrónico, una por línea:";
-App::$strings["Your message:"] = "Su mensaje:";
-App::$strings["Please join my community on \$Projectname."] = "Por favor, únase a mi comunidad en \$Projectname.";
-App::$strings["You will need to supply this invitation code:"] = "Tendrá que suministrar este código de invitación:";
-App::$strings["1. Register at any \$Projectname location (they are all inter-connected)"] = "1. Regístrese en cualquier sitio de \$Projectname (están todos interconectados)";
-App::$strings["2. Enter my \$Projectname network address into the site searchbar."] = "2. Introduzca mi dirección \$Projectname en la caja de búsqueda del sitio.";
-App::$strings["or visit"] = "o visitar";
-App::$strings["3. Click [Connect]"] = "3. Pulse [conectar]";
App::$strings["Version %s"] = "Versión %s";
App::$strings["Installed plugins/addons/apps:"] = "Extensiones, complementos o aplicaciones instaladas:";
App::$strings["No installed plugins/addons/apps"] = "No hay instalada ninguna extensión, complemento o aplicación";
@@ -2077,48 +1342,11 @@ App::$strings["Bug reports and issues: please visit"] = "Informes de errores e i
App::$strings["\$projectname issues"] = "Problemas en \$projectname";
App::$strings["Suggestions, praise, etc. - please email \"redmatrix\" at librelist - dot com"] = "Sugerencias, elogios, etc - por favor, un correo electrónico a \"redmatrix\" en librelist - punto com";
App::$strings["Site Administrators"] = "Administradores del sitio";
-App::$strings["Unable to locate original post."] = "No ha sido posible encontrar la entrada original.";
-App::$strings["Empty post discarded."] = "La entrada vacía ha sido desechada.";
-App::$strings["Executable content type not permitted to this channel."] = "Contenido de tipo ejecutable no permitido en este canal.";
-App::$strings["Duplicate post suppressed."] = "Se ha suprimido la entrada duplicada.";
-App::$strings["System error. Post not saved."] = "Error del sistema. La entrada no se ha podido salvar.";
-App::$strings["Unable to obtain post information from database."] = "No ha sido posible obtener información de la entrada en la base de datos.";
-App::$strings["You have reached your limit of %1$.0f top level posts."] = "Ha alcanzado su límite de %1$.0f entradas en la página principal.";
-App::$strings["You have reached your limit of %1$.0f webpages."] = "Ha alcanzado su límite de %1$.0f páginas web.";
-App::$strings["Comanche page description language help"] = "Página de ayuda del lenguaje de descripción de páginas (PDL) Comanche";
-App::$strings["Layout Description"] = "Descripción de la plantilla";
-App::$strings["Download PDL file"] = "Descargar el fichero PDL";
-App::$strings["Like/Dislike"] = "Me gusta/No me gusta";
-App::$strings["This action is restricted to members."] = "Esta acción está restringida solo para miembros.";
-App::$strings["Please <a href=\"rmagic\">login with your \$Projectname ID</a> or <a href=\"register\">register as a new \$Projectname member</a> to continue."] = "Por favor, <a href=\"rmagic\">identifíquese con su \$Projectname ID</a> o <a href=\"register\">rregístrese como un nuevo \$Projectname member</a> para continuar.";
-App::$strings["Invalid request."] = "Solicitud incorrecta.";
-App::$strings["thing"] = "elemento";
-App::$strings["Channel unavailable."] = "Canal no disponible.";
-App::$strings["Previous action reversed."] = "Acción anterior revocada.";
-App::$strings["%1\$s agrees with %2\$s's %3\$s"] = "%3\$s de %2\$s: %1\$s está de acuerdo";
-App::$strings["%1\$s doesn't agree with %2\$s's %3\$s"] = "%3\$s de %2\$s: %1\$s no está de acuerdo";
-App::$strings["%1\$s abstains from a decision on %2\$s's %3\$s"] = "%3\$s de %2\$s: %1\$s se abstiene";
-App::$strings["%1\$s is attending %2\$s's %3\$s"] = "%3\$s de %2\$s: %1\$s participa";
-App::$strings["%1\$s is not attending %2\$s's %3\$s"] = "%3\$s de %2\$s: %1\$s no participa";
-App::$strings["%1\$s may attend %2\$s's %3\$s"] = "%3\$s de %2\$s: %1\$s quizá participe";
-App::$strings["Action completed."] = "Acción completada.";
-App::$strings["Thank you."] = "Gracias.";
-App::$strings["Location not found."] = "Dirección no encontrada.";
-App::$strings["Location lookup failed."] = "Ha fallado la búsqueda de la dirección.";
-App::$strings["Please select another location to become primary before removing the primary location."] = "Por favor, seleccione una copia de su canal (un clon) para convertirlo en primario antes de eliminar su canal principal.";
-App::$strings["Syncing locations"] = "Sincronización de ubicaciones";
-App::$strings["No locations found."] = "No encontrada ninguna dirección.";
-App::$strings["Manage Channel Locations"] = "Gestionar las direcciones del canal";
-App::$strings["Primary"] = "Primario";
-App::$strings["Drop"] = "Eliminar";
-App::$strings["Sync Now"] = "Sincronizar ahora";
-App::$strings["Please wait several minutes between consecutive operations."] = "Por favor, espere algunos minutos entre operaciones consecutivas.";
-App::$strings["When possible, drop a location by logging into that website/hub and removing your channel."] = "Cuando sea posible, elimine una ubicación iniciando sesión en el sitio web o \"hub\" y borrando su canal.";
-App::$strings["Use this form to drop the location if the hub is no longer operating."] = "Utilice este formulario para eliminar la dirección si el \"hub\" no está funcionando desde hace tiempo.";
App::$strings["Failed to create source. No channel selected."] = "Imposible crear el origen de los contenidos. Ningún canal ha sido seleccionado.";
App::$strings["Source created."] = "Fuente creada.";
App::$strings["Source updated."] = "Fuente actualizada.";
App::$strings["*"] = "*";
+App::$strings["Channel Sources"] = "Orígenes de los contenidos del canal";
App::$strings["Manage remote sources of content for your channel."] = "Gestionar contenido de origen remoto para su canal.";
App::$strings["New Source"] = "Nueva fuente";
App::$strings["Import all or selected content from the following channel into this channel and distribute it according to your channel settings."] = "Importar todo el contenido o una selección de los siguientes canales en este canal y distribuirlo de acuerdo con sus ajustes.";
@@ -2130,83 +1358,16 @@ App::$strings["Edit Source"] = "Editar fuente";
App::$strings["Delete Source"] = "Eliminar fuente";
App::$strings["Source removed"] = "Fuente eliminada";
App::$strings["Unable to remove source."] = "Imposible eliminar la fuente.";
-App::$strings["No valid account found."] = "No se ha encontrado una cuenta válida.";
-App::$strings["Password reset request issued. Check your email."] = "Se ha recibido una solicitud de restablecimiento de contraseña. Consulte su correo electrónico.";
-App::$strings["Site Member (%s)"] = "Usuario del sitio (%s)";
-App::$strings["Password reset requested at %s"] = "Se ha solicitado restablecer la contraseña en %s";
-App::$strings["Request could not be verified. (You may have previously submitted it.) Password reset failed."] = "La solicitud no ha podido ser verificada. (Puede que la haya enviado con anterioridad) El restablecimiento de la contraseña ha fallado.";
-App::$strings["Password Reset"] = "Restablecer la contraseña";
-App::$strings["Your password has been reset as requested."] = "Su contraseña ha sido restablecida según lo solicitó.";
-App::$strings["Your new password is"] = "Su nueva contraseña es";
-App::$strings["Save or copy your new password - and then"] = "Guarde o copie su nueva contraseña - y después";
-App::$strings["click here to login"] = "pulse aquí para conectarse";
-App::$strings["Your password may be changed from the <em>Settings</em> page after successful login."] = "Puede cambiar la contraseña en la página <em>Ajustes</em> una vez iniciada la sesión.";
-App::$strings["Your password has changed at %s"] = "Su contraseña en %s ha sido cambiada";
-App::$strings["Forgot your Password?"] = "¿Ha olvidado su contraseña?";
-App::$strings["Enter your email address and submit to have your password reset. Then check your email for further instructions."] = "Introduzca y envíe su dirección de correo electrónico para el restablecimiento de su contraseña. Luego revise su correo para obtener más instrucciones.";
-App::$strings["Email Address"] = "Dirección de correo electrónico";
-App::$strings["Reset"] = "Reiniciar";
-App::$strings["Hub not found."] = "Servidor no encontrado";
App::$strings["%1\$s is following %2\$s's %3\$s"] = "%1\$s está siguiendo %3\$s de %2\$s";
App::$strings["%1\$s stopped following %2\$s's %3\$s"] = "%1\$s ha dejado de seguir %3\$s de %2\$s";
-App::$strings["Unable to lookup recipient."] = "Imposible asociar a un destinatario.";
-App::$strings["Unable to communicate with requested channel."] = "Imposible comunicar con el canal solicitado.";
-App::$strings["Cannot verify requested channel."] = "No se puede verificar el canal solicitado.";
-App::$strings["Selected channel has private message restrictions. Send failed."] = "El canal seleccionado tiene restricciones sobre los mensajes privados. El envío falló.";
-App::$strings["Messages"] = "Mensajes";
-App::$strings["Message recalled."] = "Mensaje revocado.";
-App::$strings["Conversation removed."] = "Conversación eliminada.";
-App::$strings["Requested channel is not in this network"] = "El canal solicitado no existe en esta red";
-App::$strings["Send Private Message"] = "Enviar un mensaje privado";
-App::$strings["To:"] = "Para:";
-App::$strings["Subject:"] = "Asunto:";
-App::$strings["Send"] = "Enviar";
-App::$strings["Delete message"] = "Borrar mensaje";
-App::$strings["Delivery report"] = "Informe de transmisión";
-App::$strings["Recall message"] = "Revocar el mensaje";
-App::$strings["Message has been recalled."] = "El mensaje ha sido revocado.";
-App::$strings["Delete Conversation"] = "Eliminar conversación";
-App::$strings["No secure communications available. You <strong>may</strong> be able to respond from the sender's profile page."] = "Comunicación segura no disponible. Pero <strong>puede</strong> responder desde la página del perfil del remitente.";
-App::$strings["Send Reply"] = "Responder";
-App::$strings["Your message for %s (%s):"] = "Su mensaje para %s (%s):";
App::$strings["No suggestions available. If this is a new site, please try again in 24 hours."] = "No hay sugerencias disponibles. Si es un sitio nuevo, espere 24 horas y pruebe de nuevo.";
-App::$strings["Create a new channel"] = "Crear un nuevo canal";
-App::$strings["Current Channel"] = "Canal actual";
-App::$strings["Switch to one of your channels by selecting it."] = "Cambiar a uno de sus canales seleccionándolo.";
-App::$strings["Default Channel"] = "Canal principal";
-App::$strings["Make Default"] = "Convertir en predeterminado";
-App::$strings["%d new messages"] = "%d mensajes nuevos";
-App::$strings["%d new introductions"] = "%d nuevas isolicitudes de conexión";
-App::$strings["Delegated Channel"] = "Canal delegado";
+App::$strings["Ignore/Hide"] = "Ignorar/Ocultar";
+App::$strings["post"] = "la entrada";
+App::$strings["comment"] = "el comentario";
App::$strings["%1\$s tagged %2\$s's %3\$s with %4\$s"] = "%1\$s ha etiquetado %3\$s de %2\$s con %4\$s";
-App::$strings["Profile Match"] = "Perfil compatible";
-App::$strings["No keywords to match. Please add keywords to your default profile."] = "No hay palabras clave en el perfil principal para poder encontrar perfiles compatibles. Por favor, añada palabras clave a su perfil principal.";
-App::$strings["is interested in:"] = "está interesado en:";
-App::$strings["No matches"] = "No se han encontrado perfiles compatibles";
App::$strings["Tag removed"] = "Etiqueta eliminada.";
App::$strings["Remove Item Tag"] = "Eliminar etiqueta del elemento.";
App::$strings["Select a tag to remove: "] = "Seleccionar una etiqueta para eliminar:";
-App::$strings["Unable to update menu."] = "No se puede actualizar el menú.";
-App::$strings["Unable to create menu."] = "No se puede crear el menú.";
-App::$strings["Menu Name"] = "Nombre del menú";
-App::$strings["Unique name (not visible on webpage) - required"] = "Nombre único (no será visible en la página web) - requerido";
-App::$strings["Menu Title"] = "Título del menú";
-App::$strings["Visible on webpage - leave empty for no title"] = "Visible en la página web - no ponga nada si no desea un título";
-App::$strings["Allow Bookmarks"] = "Permitir marcadores";
-App::$strings["Menu may be used to store saved bookmarks"] = "El menú se puede usar para guardar marcadores";
-App::$strings["Submit and proceed"] = "Enviar y proceder";
-App::$strings["Bookmarks allowed"] = "Marcadores permitidos";
-App::$strings["Delete this menu"] = "Borrar este menú";
-App::$strings["Edit menu contents"] = "Editar los contenidos del menú";
-App::$strings["Edit this menu"] = "Modificar este menú";
-App::$strings["Menu could not be deleted."] = "El menú no puede ser eliminado.";
-App::$strings["Edit Menu"] = "Modificar el menú";
-App::$strings["Add or remove entries to this menu"] = "Añadir o quitar entradas en este menú";
-App::$strings["Menu name"] = "Nombre del menú";
-App::$strings["Must be unique, only seen by you"] = "Debe ser único, solo será visible para usted";
-App::$strings["Menu title"] = "Título del menú";
-App::$strings["Menu title as seen by others"] = "El título del menú tal como será visto por los demás";
-App::$strings["Allow bookmarks"] = "Permitir marcadores";
App::$strings["Thing updated"] = "Elemento actualizado.";
App::$strings["Object store: failed"] = "Guardar objeto: ha fallado";
App::$strings["Thing added"] = "Elemento añadido";
@@ -2234,8 +1395,849 @@ App::$strings["No connections."] = "Sin conexiones.";
App::$strings["Visit %s's profile [%s]"] = "Visitar el perfil de %s [%s]";
App::$strings["View Connections"] = "Ver conexiones";
App::$strings["Source of Item"] = "Origen del elemento";
+App::$strings["Webpages"] = "Páginas web";
+App::$strings["Actions"] = "Acciones";
+App::$strings["Page Link"] = "Vínculo de la página";
+App::$strings["Page Title"] = "Título de página";
App::$strings["Xchan Lookup"] = "Búsqueda de canales";
App::$strings["Lookup xchan beginning with (or webbie): "] = "Buscar un canal (o un \"webbie\") que comience por:";
+App::$strings["No username found in import file."] = "No se ha encontrado el nombre de usuario en el fichero importado.";
+App::$strings["Unable to create a unique channel address. Import failed."] = "No se ha podido crear una dirección de canal única. Ha fallado la importación.";
+App::$strings["Cannot locate DNS info for database server '%s'"] = "No se ha podido localizar información de DNS para el servidor de base de datos “%s”";
+App::$strings["Unable to obtain identity information from database"] = "No ha sido posible obtener información sobre la identidad desde la base de datos";
+App::$strings["Empty name"] = "Nombre vacío";
+App::$strings["Name too long"] = "Nombre demasiado largo";
+App::$strings["No account identifier"] = "Ningún identificador de la cuenta";
+App::$strings["Nickname is required."] = "Se requiere un sobrenombre (alias).";
+App::$strings["Reserved nickname. Please choose another."] = "Sobrenombre en uso. Por favor, elija otro.";
+App::$strings["Nickname has unsupported characters or is already being used on this site."] = "El alias contiene caracteres no admitidos o está ya en uso por otros miembros de este sitio.";
+App::$strings["Unable to retrieve created identity"] = "No ha sido posible recuperar la identidad creada";
+App::$strings["Default Profile"] = "Perfil principal";
+App::$strings["Requested channel is not available."] = "El canal solicitado no está disponible.";
+App::$strings["Create New Profile"] = "Crear un nuevo perfil";
+App::$strings["Edit Profile"] = "Editar el perfil";
+App::$strings["Visible to everybody"] = "Visible para todos";
+App::$strings["Gender:"] = "Género:";
+App::$strings["Status:"] = "Estado:";
+App::$strings["Homepage:"] = "Página personal:";
+App::$strings["Online Now"] = "Ahora en línea";
+App::$strings["F d"] = "d F";
+App::$strings["Birthday Reminders"] = "Recordatorios de cumpleaños";
+App::$strings["Birthdays this week:"] = "Cumpleaños de esta semana:";
+App::$strings["[No description]"] = "[Sin descripción]";
+App::$strings["Event Reminders"] = "Recordatorios de eventos";
+App::$strings["Events this week:"] = "Eventos de esta semana:";
+App::$strings["Like this channel"] = "Me gusta este canal";
+App::$strings["j F, Y"] = "j F Y";
+App::$strings["j F"] = "j F";
+App::$strings["Birthday:"] = "Cumpleaños:";
+App::$strings["for %1\$d %2\$s"] = "por %1\$d %2\$s";
+App::$strings["Sexual Preference:"] = "Orientación sexual:";
+App::$strings["Tags:"] = "Etiquetas:";
+App::$strings["Political Views:"] = "Posición política:";
+App::$strings["Religion:"] = "Religión:";
+App::$strings["Hobbies/Interests:"] = "Aficciones o intereses:";
+App::$strings["Likes:"] = "Me gusta:";
+App::$strings["Dislikes:"] = "No me gusta:";
+App::$strings["Contact information and Social Networks:"] = "Información de contacto y redes sociales:";
+App::$strings["My other channels:"] = "Mis otros canales:";
+App::$strings["Musical interests:"] = "Preferencias musicales:";
+App::$strings["Books, literature:"] = "Libros, literatura:";
+App::$strings["Television:"] = "Televisión:";
+App::$strings["Film/dance/culture/entertainment:"] = "Cine, danza, cultura, entretenimiento:";
+App::$strings["Love/Romance:"] = "Vida sentimental o amorosa:";
+App::$strings["Work/employment:"] = "Trabajo:";
+App::$strings["School/education:"] = "Estudios:";
+App::$strings["Like this thing"] = "Me gusta esto";
+App::$strings["created a new post"] = "ha creado una nueva entrada";
+App::$strings["commented on %s's post"] = "ha comentado la entrada de %s";
+App::$strings["Private Message"] = "Mensaje Privado";
+App::$strings["Select"] = "Seleccionar";
+App::$strings["Save to Folder"] = "Guardar en carpeta";
+App::$strings["I will attend"] = "Participaré";
+App::$strings["I will not attend"] = "No participaré";
+App::$strings["I might attend"] = "Quizá participe";
+App::$strings["I agree"] = "Estoy de acuerdo";
+App::$strings["I disagree"] = "No estoy de acuerdo";
+App::$strings["I abstain"] = "Me abstengo";
+App::$strings["Add Star"] = "Destacar añadiendo una estrella";
+App::$strings["Remove Star"] = "Eliminar estrella";
+App::$strings["Toggle Star Status"] = "Activar o desactivar el estado de entrada preferida";
+App::$strings["starred"] = "preferidas";
+App::$strings["Message signature validated"] = "Firma de mensaje validada";
+App::$strings["Message signature incorrect"] = "Firma de mensaje incorrecta";
+App::$strings["Add Tag"] = "Añadir etiqueta";
+App::$strings["like"] = "me gusta";
+App::$strings["dislike"] = "no me gusta";
+App::$strings["Share This"] = "Compartir esto";
+App::$strings["share"] = "compartir";
+App::$strings["Delivery Report"] = "Informe de transmisión";
+App::$strings["%d comment"] = array(
+ 0 => "%d comentario",
+ 1 => "%d comentarios",
+);
+App::$strings["View %s's profile - %s"] = "Ver el perfil de %s - %s";
+App::$strings["to"] = "a";
+App::$strings["via"] = "mediante";
+App::$strings["Wall-to-Wall"] = "De página del perfil a página del perfil (de \"muro\" a \"muro\")";
+App::$strings["via Wall-To-Wall:"] = "Mediante el procedimiento página del perfil a página del perfil (de \"muro\" a \"muro\")";
+App::$strings["from %s"] = "desde %s";
+App::$strings["last edited: %s"] = "último cambio: %s";
+App::$strings["Expires: %s"] = "Caduca: %s";
+App::$strings["Save Bookmarks"] = "Guardar en Marcadores";
+App::$strings["Add to Calendar"] = "Añadir al calendario";
+App::$strings["Mark all seen"] = "Marcar todo como visto";
+App::$strings["[+] show all"] = "[+] mostrar todo:";
+App::$strings["Image"] = "Imagen";
+App::$strings["Insert Link"] = "Insertar enlace";
+App::$strings["Video"] = "Vídeo";
+App::$strings["Not a valid email address"] = "Dirección de correo no válida";
+App::$strings["Your email domain is not among those allowed on this site"] = "Su dirección de correo no pertenece a ninguno de los dominios permitidos en este sitio.";
+App::$strings["Your email address is already registered at this site."] = "Su dirección de correo está ya registrada en este sitio.";
+App::$strings["An invitation is required."] = "Es obligatorio que le inviten.";
+App::$strings["Invitation could not be verified."] = "No se ha podido verificar su invitación.";
+App::$strings["Please enter the required information."] = "Por favor introduzca la información requerida.";
+App::$strings["Failed to store account information."] = "La información de la cuenta no se ha podido guardar.";
+App::$strings["Registration confirmation for %s"] = "Confirmación de registro para %s";
+App::$strings["Registration request at %s"] = "Solicitud de registro en %s";
+App::$strings["Administrator"] = "Administrador";
+App::$strings["your registration password"] = "su contraseña de registro";
+App::$strings["Registration details for %s"] = "Detalles del registro de %s";
+App::$strings["Account approved."] = "Cuenta aprobada.";
+App::$strings["Registration revoked for %s"] = "Registro revocado para %s";
+App::$strings["Account verified. Please login."] = "Cuenta verificada. Por favor, inicie sesión.";
+App::$strings["Click here to upgrade."] = "Pulse aquí para actualizar";
+App::$strings["This action exceeds the limits set by your subscription plan."] = "Esta acción supera los límites establecidos por su plan de suscripción ";
+App::$strings["This action is not available under your subscription plan."] = "Esta acción no está disponible en su plan de suscripción.";
+App::$strings["Currently Male"] = "Actualmente hombre";
+App::$strings["Currently Female"] = "Actualmente mujer";
+App::$strings["Mostly Male"] = "Generalmente hombre";
+App::$strings["Mostly Female"] = "Generalmente mujer";
+App::$strings["Transgender"] = "Transgénero";
+App::$strings["Intersex"] = "Intersexual";
+App::$strings["Transsexual"] = "Transexual";
+App::$strings["Hermaphrodite"] = "Hermafrodita";
+App::$strings["Neuter"] = "Neutral";
+App::$strings["Non-specific"] = "No especificado";
+App::$strings["Other"] = "Otro";
+App::$strings["Undecided"] = "Indeciso/a";
+App::$strings["Males"] = "Hombres";
+App::$strings["Females"] = "Mujeres";
+App::$strings["Gay"] = "Homosexual";
+App::$strings["Lesbian"] = "Lesbiana";
+App::$strings["No Preference"] = "Sin preferencias";
+App::$strings["Bisexual"] = "Bisexual";
+App::$strings["Autosexual"] = "Autosexual";
+App::$strings["Abstinent"] = "Casto/a";
+App::$strings["Virgin"] = "Virgen";
+App::$strings["Deviant"] = "Fuera de lo común";
+App::$strings["Fetish"] = "Fetichista";
+App::$strings["Oodles"] = "Orgías";
+App::$strings["Nonsexual"] = "Asexual";
+App::$strings["Single"] = "Soltero/a";
+App::$strings["Lonely"] = "Solo/a";
+App::$strings["Available"] = "Disponible";
+App::$strings["Unavailable"] = "No disponible";
+App::$strings["Has crush"] = "Enamorado/a";
+App::$strings["Infatuated"] = "Apasionado/a";
+App::$strings["Dating"] = "Saliendo con alguien";
+App::$strings["Unfaithful"] = "Infiel";
+App::$strings["Sex Addict"] = "Con adicción al sexo";
+App::$strings["Friends/Benefits"] = "Amigos con algo extra";
+App::$strings["Casual"] = "Casual";
+App::$strings["Engaged"] = "Prometido/a";
+App::$strings["Married"] = "Casado/a";
+App::$strings["Imaginarily married"] = "Casado/a en sueños";
+App::$strings["Partners"] = "Pareja";
+App::$strings["Cohabiting"] = "Cohabitando";
+App::$strings["Common law"] = "Matrimonio tradicional";
+App::$strings["Happy"] = "Felíz";
+App::$strings["Not looking"] = "No estoy buscando";
+App::$strings["Swinger"] = "Libertino";
+App::$strings["Betrayed"] = "Engañado/a";
+App::$strings["Separated"] = "Separado/a";
+App::$strings["Unstable"] = "Inestable";
+App::$strings["Divorced"] = "Divorciado/a";
+App::$strings["Imaginarily divorced"] = "Divorciado/a en sueños";
+App::$strings["Widowed"] = "Viudo/a";
+App::$strings["Uncertain"] = "Indeterminado";
+App::$strings["It's complicated"] = "Es complicado";
+App::$strings["Don't care"] = "No me importa";
+App::$strings["Ask me"] = "Pregúnteme";
+App::$strings["Visible to your default audience"] = "Visible para su público predeterminado.";
+App::$strings["Show"] = "Mostrar";
+App::$strings["Don't show"] = "No mostrar";
+App::$strings["Other networks and post services"] = "Otras redes y servicios de publicación";
+App::$strings[" and "] = " y ";
+App::$strings["public profile"] = "el perfil público";
+App::$strings["%1\$s changed %2\$s to &ldquo;%3\$s&rdquo;"] = "%1\$s ha cambiado %2\$s a &ldquo;%3\$s&rdquo;";
+App::$strings["Visit %1\$s's %2\$s"] = "Visitar %2\$s de %1\$s";
+App::$strings["%1\$s has an updated %2\$s, changing %3\$s."] = "%1\$s ha actualizado %2\$s, cambiando %3\$s.";
+App::$strings["Public Timeline"] = "Cronología pública";
+App::$strings["Site Admin"] = "Administrador del sitio";
+App::$strings["Bookmarks"] = "Marcadores";
+App::$strings["Address Book"] = "Libreta de direcciones";
+App::$strings["Login"] = "Iniciar sesión";
+App::$strings["Grid"] = "Red";
+App::$strings["Channel Home"] = "Mi canal";
+App::$strings["Events"] = "Eventos";
+App::$strings["Directory"] = "Directorio";
+App::$strings["Mail"] = "Correo";
+App::$strings["Chat"] = "Chat";
+App::$strings["Probe"] = "Probar";
+App::$strings["Suggest"] = "Sugerir";
+App::$strings["Random Channel"] = "Canal aleatorio";
+App::$strings["Invite"] = "Invitar";
+App::$strings["Features"] = "Funcionalidades";
+App::$strings["Post"] = "Publicación";
+App::$strings["Install"] = "Instalar";
+App::$strings["Purchase"] = "Comprar";
+App::$strings["view full size"] = "Ver en el tamaño original";
+App::$strings["\$Projectname Notification"] = "Notificación de \$Projectname";
+App::$strings["\$projectname"] = "\$projectname";
+App::$strings["Thank You,"] = "Gracias,";
+App::$strings["%s Administrator"] = "%s Administrador";
+App::$strings["No Subject"] = "Sin asunto";
+App::$strings["Attachments:"] = "Ficheros adjuntos:";
+App::$strings["l F d, Y \\@ g:i A"] = "l d de F, Y \\@ G:i";
+App::$strings["\$Projectname event notification:"] = "Notificación de eventos de \$Projectname:";
+App::$strings["Starts:"] = "Comienza:";
+App::$strings["Finishes:"] = "Finaliza:";
+App::$strings["Image/photo"] = "Imagen/foto";
+App::$strings["Encrypted content"] = "Contenido cifrado";
+App::$strings["Install %s element: "] = "Instalar el elemento %s:";
+App::$strings["This post contains an installable %s element, however you lack permissions to install it on this site."] = "Esta entrada contiene el elemento instalable %s, sin embargo le faltan permisos para instalarlo en este sitio.";
+App::$strings["%1\$s wrote the following %2\$s %3\$s"] = "%1\$s escribió %2\$s siguiente %3\$s";
+App::$strings["Different viewers will see this text differently"] = "Visitantes diferentes verán este texto de forma distinta";
+App::$strings["$1 spoiler"] = "$1 spoiler";
+App::$strings["$1 wrote:"] = "$1 escribió:";
+App::$strings["%1\$s is now connected with %2\$s"] = "%1\$s ahora está conectado/a con %2\$s";
+App::$strings["%1\$s poked %2\$s"] = "%1\$s ha dado un toque a %2\$s";
+App::$strings["poked"] = "ha dado un toque a";
+App::$strings["View %s's profile @ %s"] = "Ver el perfil @ %s de %s";
+App::$strings["Categories:"] = "Categorías:";
+App::$strings["Filed under:"] = "Archivado bajo:";
+App::$strings["View in context"] = "Mostrar en su contexto";
+App::$strings["remove"] = "eliminar";
+App::$strings["Loading..."] = "Cargando...";
+App::$strings["Delete Selected Items"] = "Eliminar elementos seleccionados";
+App::$strings["View Source"] = "Ver la fuente original de la publicación";
+App::$strings["Follow Thread"] = "Seguir este hilo";
+App::$strings["Unfollow Thread"] = "Dejar de seguir este hilo";
+App::$strings["Activity/Posts"] = "Actividad y publicaciones";
+App::$strings["Edit Connection"] = "Editar conexión";
+App::$strings["Message"] = "Mensaje";
+App::$strings["%s likes this."] = "A %s le gusta esto.";
+App::$strings["%s doesn't like this."] = "A %s no le gusta esto.";
+App::$strings["<span %1\$s>%2\$d people</span> like this."] = array(
+ 0 => "a <span %1\$s>%2\$d personas</span> le gusta esto.",
+ 1 => "A <span %1\$s>%2\$d personas</span> les gusta esto.",
+);
+App::$strings["<span %1\$s>%2\$d people</span> don't like this."] = array(
+ 0 => "a <span %1\$s>%2\$d personas</span> no les gusta esto.",
+ 1 => "A <span %1\$s>%2\$d personas</span> no les gusta esto.",
+);
+App::$strings["and"] = "y";
+App::$strings[", and %d other people"] = array(
+ 0 => ", y %d persona más",
+ 1 => ", y %d personas más",
+);
+App::$strings["%s like this."] = "A %s le gusta esto.";
+App::$strings["%s don't like this."] = "A %s no le gusta esto.";
+App::$strings["Visible to <strong>everybody</strong>"] = "Visible para <strong>cualquiera</strong>";
+App::$strings["Please enter a video link/URL:"] = "Por favor, introduzca un enlace de vídeo:";
+App::$strings["Please enter an audio link/URL:"] = "Por favor, introduzca un enlace de audio:";
+App::$strings["Tag term:"] = "Término de la etiqueta:";
+App::$strings["Where are you right now?"] = "¿Donde está ahora?";
+App::$strings["Page link name"] = "Nombre del enlace de la página";
+App::$strings["Post as"] = "Publicar como";
+App::$strings["upload photo"] = "subir foto";
+App::$strings["attach file"] = "adjuntar fichero";
+App::$strings["web link"] = "enlace web";
+App::$strings["Insert video link"] = "Insertar enlace de vídeo";
+App::$strings["video link"] = "enlace de vídeo";
+App::$strings["Insert audio link"] = "Insertar enlace de audio";
+App::$strings["audio link"] = "enlace de audio";
+App::$strings["set location"] = "establecer ubicación";
+App::$strings["clear location"] = "borrar los datos de ubicación";
+App::$strings["permissions"] = "permisos";
+App::$strings["Set publish date"] = "Establecer la fecha de publicación";
+App::$strings["Discover"] = "Descubrir";
+App::$strings["Imported public streams"] = "Contenidos públicos importados";
+App::$strings["Commented Order"] = "Comentarios recientes";
+App::$strings["Sort by Comment Date"] = "Ordenar por fecha de comentario";
+App::$strings["Posted Order"] = "Publicaciones recientes";
+App::$strings["Sort by Post Date"] = "Ordenar por fecha de publicación";
+App::$strings["Posts that mention or involve you"] = "Publicaciones que le mencionan o involucran";
+App::$strings["Activity Stream - by date"] = "Contenido - por fecha";
+App::$strings["Starred"] = "Preferidas";
+App::$strings["Favourite Posts"] = "Publicaciones favoritas";
+App::$strings["Spam"] = "Correo basura";
+App::$strings["Posts flagged as SPAM"] = "Publicaciones marcadas como basura";
+App::$strings["Status Messages and Posts"] = "Mensajes de estado y publicaciones";
+App::$strings["About"] = "Mi perfil";
+App::$strings["Profile Details"] = "Detalles del perfil";
+App::$strings["Photo Albums"] = "Álbumes de fotos";
+App::$strings["Files and Storage"] = "Ficheros y repositorio";
+App::$strings["Chatrooms"] = "Salas de chat";
+App::$strings["Saved Bookmarks"] = "Marcadores guardados";
+App::$strings["Manage Webpages"] = "Administrar páginas web";
+App::$strings["__ctx:noun__ Attending"] = array(
+ 0 => "Participaré",
+ 1 => "Participaré",
+);
+App::$strings["__ctx:noun__ Not Attending"] = array(
+ 0 => "No participaré",
+ 1 => "No participaré",
+);
+App::$strings["__ctx:noun__ Undecided"] = array(
+ 0 => "Indeciso/a",
+ 1 => "Indecisos/as",
+);
+App::$strings["__ctx:noun__ Agree"] = array(
+ 0 => "De acuerdo",
+ 1 => "De acuerdo",
+);
+App::$strings["__ctx:noun__ Disagree"] = array(
+ 0 => "En desacuerdo",
+ 1 => "En desacuerdo",
+);
+App::$strings["__ctx:noun__ Abstain"] = array(
+ 0 => "se abstiene",
+ 1 => "Se abstienen",
+);
+App::$strings["%1\$s's bookmarks"] = "Marcadores de %1\$s";
+App::$strings["Missing room name"] = "Sala de chat sin nombre";
+App::$strings["Duplicate room name"] = "Nombre de sala duplicado.";
+App::$strings["Invalid room specifier."] = "Especificador de sala no válido.";
+App::$strings["Room not found."] = "Sala no encontrada.";
+App::$strings["Room is full"] = "La sala está llena.";
+App::$strings["New window"] = "Nueva ventana";
+App::$strings["Open the selected location in a different window or browser tab"] = "Abrir la dirección seleccionada en una ventana o pestaña aparte";
+App::$strings["User '%s' deleted"] = "El usuario '%s' ha sido eliminado";
+App::$strings["Logged out."] = "Desconectado/a.";
+App::$strings["Failed authentication"] = "Autenticación fallida.";
+App::$strings["The form security token was not correct. This probably happened because the form has been opened for too long (>3 hours) before submitting it."] = "El \"token\" de seguridad del formulario no es correcto. Esto ha ocurrido probablemente porque el formulario ha estado abierto demasiado tiempo (>3 horas) antes de ser enviado";
+App::$strings["Frequently"] = "Frecuentemente";
+App::$strings["Hourly"] = "Cada hora";
+App::$strings["Twice daily"] = "Dos veces al día";
+App::$strings["Daily"] = "Diariamente";
+App::$strings["Weekly"] = "Semanalmente";
+App::$strings["Monthly"] = "Mensualmente";
+App::$strings["Friendica"] = "Friendica";
+App::$strings["OStatus"] = "OStatus";
+App::$strings["GNU-Social"] = "GNU Social";
+App::$strings["RSS/Atom"] = "RSS/Atom";
+App::$strings["Diaspora"] = "Diaspora";
+App::$strings["Facebook"] = "Facebook";
+App::$strings["Zot"] = "Zot";
+App::$strings["LinkedIn"] = "LinkedIn";
+App::$strings["XMPP/IM"] = "XMPP/IM";
+App::$strings["MySpace"] = "MySpace";
+App::$strings["%d invitation available"] = array(
+ 0 => "%d invitación pendiente",
+ 1 => "%d invitaciones disponibles",
+);
+App::$strings["Find Channels"] = "Encontrar canales";
+App::$strings["Enter name or interest"] = "Introducir nombre o interés";
+App::$strings["Connect/Follow"] = "Conectar/Seguir";
+App::$strings["Examples: Robert Morgenstein, Fishing"] = "Ejemplos: José Fernández, Pesca";
+App::$strings["Random Profile"] = "Perfil aleatorio";
+App::$strings["Invite Friends"] = "Invitar a amigos";
+App::$strings["Advanced example: name=fred and country=iceland"] = "Ejemplo avanzado: nombre=juan y país=españa";
+App::$strings["Saved Folders"] = "Carpetas guardadas";
+App::$strings["Everything"] = "Todo";
+App::$strings["Categories"] = "Categorías";
+App::$strings["%d connection in common"] = array(
+ 0 => "%d conexión en común",
+ 1 => "%d conexiones en común",
+);
+App::$strings["show more"] = "mostrar más";
+App::$strings["Item was not found."] = "Elemento no encontrado.";
+App::$strings["No source file."] = "Ningún fichero de origen";
+App::$strings["Cannot locate file to replace"] = "No se puede localizar el fichero que va a ser sustituido.";
+App::$strings["Cannot locate file to revise/update"] = "No se puede localizar el fichero para revisar/actualizar";
+App::$strings["File exceeds size limit of %d"] = "El fichero supera el limite de tamaño de %d";
+App::$strings["You have reached your limit of %1$.0f Mbytes attachment storage."] = "Ha alcanzado su límite de %1$.0f Mbytes de almacenamiento de adjuntos.";
+App::$strings["File upload failed. Possible system limit or action terminated."] = "Error de carga, posiblemente por limite del sistema o porque la acción ha finalizado.";
+App::$strings["Stored file could not be verified. Upload failed."] = "El fichero almacenado no ha podido ser verificado. El envío ha fallado.";
+App::$strings["Path not available."] = "Ruta no disponible.";
+App::$strings["Empty pathname"] = "Ruta vacía";
+App::$strings["duplicate filename or path"] = "Nombre duplicado de ruta o fichero";
+App::$strings["Path not found."] = "Ruta no encontrada";
+App::$strings["mkdir failed."] = "mkdir ha fallado.";
+App::$strings["database storage failed."] = "el almacenamiento en la base de datos ha fallado.";
+App::$strings["Empty path"] = "Ruta vacía";
+App::$strings["Birthday"] = "Cumpleaños";
+App::$strings["Age: "] = "Edad:";
+App::$strings["YYYY-MM-DD or MM-DD"] = "AAAA-MM-DD o MM-DD";
+App::$strings["never"] = "nunca";
+App::$strings["less than a second ago"] = "hace un instante";
+App::$strings["__ctx:e.g. 22 hours ago, 1 minute ago__ %1\$d %2\$s ago"] = "hace %1\$d %2\$s";
+App::$strings["__ctx:relative_date__ year"] = array(
+ 0 => "año",
+ 1 => "años",
+);
+App::$strings["__ctx:relative_date__ month"] = array(
+ 0 => "mes",
+ 1 => "meses",
+);
+App::$strings["__ctx:relative_date__ week"] = array(
+ 0 => "semana",
+ 1 => "semanas",
+);
+App::$strings["__ctx:relative_date__ day"] = array(
+ 0 => "día",
+ 1 => "días",
+);
+App::$strings["__ctx:relative_date__ hour"] = array(
+ 0 => "hora",
+ 1 => "horas",
+);
+App::$strings["__ctx:relative_date__ minute"] = array(
+ 0 => "minuto",
+ 1 => "minutos",
+);
+App::$strings["__ctx:relative_date__ second"] = array(
+ 0 => "segundo",
+ 1 => "segundos",
+);
+App::$strings["%1\$s's birthday"] = "Cumpleaños de %1\$s";
+App::$strings["Happy Birthday %1\$s"] = "Feliz cumpleaños %1\$s";
+App::$strings["Directory Options"] = "Opciones del directorio";
+App::$strings["Safe Mode"] = "Modo seguro";
+App::$strings["Public Forums Only"] = "Solo foros públicos";
+App::$strings["This Website Only"] = "Solo este sitio web";
+App::$strings["%s <!item_type!>"] = "%s <!item_type!>";
+App::$strings["[Hubzilla:Notify] New mail received at %s"] = "[Hubzilla:Aviso] Nuevo mensaje en %s";
+App::$strings["%1\$s, %2\$s sent you a new private message at %3\$s."] = "%1\$s, %2\$s le ha enviado un nuevo mensaje privado en %3\$s.";
+App::$strings["%1\$s sent you %2\$s."] = "%1\$s le ha enviado %2\$s.";
+App::$strings["a private message"] = "un mensaje privado";
+App::$strings["Please visit %s to view and/or reply to your private messages."] = "Por favor visite %s para ver y/o responder a su mensaje privado.";
+App::$strings["%1\$s, %2\$s commented on [zrl=%3\$s]a %4\$s[/zrl]"] = "%1\$s, %2\$s ha comentado [zrl=%3\$s]%4\$s[/zrl]";
+App::$strings["%1\$s, %2\$s commented on [zrl=%3\$s]%4\$s's %5\$s[/zrl]"] = "%1\$s, %2\$s ha comentado [zrl=%3\$s]%5\$s de %4\$s[/zrl] ";
+App::$strings["%1\$s, %2\$s commented on [zrl=%3\$s]your %4\$s[/zrl]"] = "%1\$s, %2\$s ha comentado [zrl=%3\$s]%4\$s creado por usted[/zrl]";
+App::$strings["[Hubzilla:Notify] Comment to conversation #%1\$d by %2\$s"] = "[Hubzilla:Aviso] Nuevo comentario de %2\$s a la conversación #%1\$d";
+App::$strings["%1\$s, %2\$s commented on an item/conversation you have been following."] = "%1\$s, %2\$s ha comentado un elemento/conversación que ha estado siguiendo.";
+App::$strings["Please visit %s to view and/or reply to the conversation."] = "Para ver o comentar la conversación, visite %s";
+App::$strings["[Hubzilla:Notify] %s posted to your profile wall"] = "[Hubzilla:Aviso] %s ha publicado una entrada en su página de inicio del perfil (\"muro\")";
+App::$strings["%1\$s, %2\$s posted to your profile wall at %3\$s"] = "%1\$s, %2\$s ha publicado en su página del perfil en %3\$s";
+App::$strings["%1\$s, %2\$s posted to [zrl=%3\$s]your wall[/zrl]"] = "%1\$s, %2\$s ha publicado en [zrl=%3\$s]su página del perfil[/zrl]";
+App::$strings["[Hubzilla:Notify] %s tagged you"] = "[Hubzilla:Aviso] %s le ha etiquetado";
+App::$strings["%1\$s, %2\$s tagged you at %3\$s"] = "%1\$s, %2\$s le ha etiquetado en %3\$s";
+App::$strings["%1\$s, %2\$s [zrl=%3\$s]tagged you[/zrl]."] = "%1\$s, %2\$s [zrl=%3\$s]le etiquetó[/zrl].";
+App::$strings["[Hubzilla:Notify] %1\$s poked you"] = "[Hubzilla:Aviso] %1\$s le ha dado un toque";
+App::$strings["%1\$s, %2\$s poked you at %3\$s"] = "%1\$s, %2\$s le ha dado un toque en %3\$s";
+App::$strings["%1\$s, %2\$s [zrl=%2\$s]poked you[/zrl]."] = "%1\$s, %2\$s [zrl=%2\$s]le ha dado un toque[/zrl].";
+App::$strings["[Hubzilla:Notify] %s tagged your post"] = "[Hubzilla:Aviso] %s ha etiquetado su publicación";
+App::$strings["%1\$s, %2\$s tagged your post at %3\$s"] = "%1\$s, %2\$s ha etiquetado su publicación en %3\$s";
+App::$strings["%1\$s, %2\$s tagged [zrl=%3\$s]your post[/zrl]"] = "%1\$s, %2\$s ha etiquetado [zrl=%3\$s]su publicación[/zrl]";
+App::$strings["[Hubzilla:Notify] Introduction received"] = "[Hubzilla:Aviso] Ha recibido una solicitud de conexión";
+App::$strings["%1\$s, you've received an new connection request from '%2\$s' at %3\$s"] = "%1\$s, ha recibido una nueva solicitud de conexión de '%2\$s' en %3\$s";
+App::$strings["%1\$s, you've received [zrl=%2\$s]a new connection request[/zrl] from %3\$s."] = "%1\$s, ha recibido [zrl=%2\$s]una nueva solicitud de conexión[/zrl] de %3\$s.";
+App::$strings["You may visit their profile at %s"] = "Puede visitar su perfil en %s";
+App::$strings["Please visit %s to approve or reject the connection request."] = "Por favor, visite %s para permitir o rechazar la solicitad de conexión.";
+App::$strings["[Hubzilla:Notify] Friend suggestion received"] = "[Hubzilla:Aviso] Ha recibido una sugerencia de amistad";
+App::$strings["%1\$s, you've received a friend suggestion from '%2\$s' at %3\$s"] = "%1\$s, ha recibido una sugerencia de conexión de '%2\$s' en %3\$s";
+App::$strings["%1\$s, you've received [zrl=%2\$s]a friend suggestion[/zrl] for %3\$s from %4\$s."] = "%1\$s, ha recibido [zrl=%2\$s]una sugerencia de conexión[/zrl] para %3\$s de %4\$s.";
+App::$strings["Name:"] = "Nombre:";
+App::$strings["Photo:"] = "Foto:";
+App::$strings["Please visit %s to approve or reject the suggestion."] = "Por favor, visite %s para aprobar o rechazar la sugerencia.";
+App::$strings["[Hubzilla:Notify]"] = "[Hubzilla:Aviso]";
+App::$strings["This event has been added to your calendar."] = "Este evento ha sido añadido a su calendario.";
+App::$strings["Not specified"] = "Sin especificar";
+App::$strings["Needs Action"] = "Necesita de una intervención";
+App::$strings["Completed"] = "Completado/a";
+App::$strings["In Process"] = "En proceso";
+App::$strings["Cancelled"] = "Cancelado/a";
+App::$strings["General Features"] = "Funcionalidades básicas";
+App::$strings["Content Expiration"] = "Caducidad del contenido";
+App::$strings["Remove posts/comments and/or private messages at a future time"] = "Eliminar publicaciones/comentarios y/o mensajes privados más adelante";
+App::$strings["Multiple Profiles"] = "Múltiples perfiles";
+App::$strings["Ability to create multiple profiles"] = "Capacidad de crear múltiples perfiles";
+App::$strings["Advanced Profiles"] = "Perfiles avanzados";
+App::$strings["Additional profile sections and selections"] = "Secciones y selecciones de perfil adicionales";
+App::$strings["Profile Import/Export"] = "Importar/Exportar perfil";
+App::$strings["Save and load profile details across sites/channels"] = "Guardar y cargar detalles del perfil a través de sitios/canales";
+App::$strings["Web Pages"] = "Páginas web";
+App::$strings["Provide managed web pages on your channel"] = "Proveer páginas web gestionadas en su canal";
+App::$strings["Hide Rating"] = "Ocultar las valoraciones";
+App::$strings["Hide the rating buttons on your channel and profile pages. Note: People can still rate you somewhere else."] = "Ocultar los botones de valoración en su canal y página de perfil. Tenga en cuenta, sin embargo, que la gente podrá expresar su valoración en otros lugares.";
+App::$strings["Private Notes"] = "Notas privadas";
+App::$strings["Enables a tool to store notes and reminders (note: not encrypted)"] = "Habilita una herramienta para guardar notas y recordatorios (advertencia: las notas no estarán cifradas)";
+App::$strings["Navigation Channel Select"] = "Navegación por el selector de canales";
+App::$strings["Change channels directly from within the navigation dropdown menu"] = "Cambiar de canales directamente desde el menú de navegación desplegable";
+App::$strings["Photo Location"] = "Ubicación de las fotos";
+App::$strings["If location data is available on uploaded photos, link this to a map."] = "Si los datos de ubicación están disponibles en las fotos subidas, enlazar estas a un mapa.";
+App::$strings["Access Controlled Chatrooms"] = "Salas de chat moderadas";
+App::$strings["Provide chatrooms and chat services with access control."] = "Proporcionar salas y servicios de chat moderados.";
+App::$strings["Smart Birthdays"] = "Cumpleaños inteligentes";
+App::$strings["Make birthday events timezone aware in case your friends are scattered across the planet."] = "Enlazar los eventos de cumpleaños con el huso horario en el caso de que sus amigos estén dispersos por el mundo.";
+App::$strings["Expert Mode"] = "Modo de experto";
+App::$strings["Enable Expert Mode to provide advanced configuration options"] = "Habilitar el modo de experto para acceder a opciones avanzadas de configuración";
+App::$strings["Premium Channel"] = "Canal premium";
+App::$strings["Allows you to set restrictions and terms on those that connect with your channel"] = "Le permite configurar restricciones y normas de uso a aquellos que conectan con su canal";
+App::$strings["Post Composition Features"] = "Opciones para la redacción de entradas";
+App::$strings["Large Photos"] = "Fotos de gran tamaño";
+App::$strings["Include large (1024px) photo thumbnails in posts. If not enabled, use small (640px) photo thumbnails"] = "Incluir miniaturas de fotos grandes (1024px) en publicaciones. Si no está habilitado, usar miniaturas pequeñas (640px)";
+App::$strings["Automatically import channel content from other channels or feeds"] = "Importar automáticamente contenido de otros canales o \"feeds\"";
+App::$strings["Even More Encryption"] = "Más cifrado todavía";
+App::$strings["Allow optional encryption of content end-to-end with a shared secret key"] = "Permitir cifrado adicional de contenido \"punto-a-punto\" con una clave secreta compartida.";
+App::$strings["Enable Voting Tools"] = "Permitir entradas con votación";
+App::$strings["Provide a class of post which others can vote on"] = "Proveer una clase de publicación en la que otros puedan votar";
+App::$strings["Delayed Posting"] = "Publicación aplazada";
+App::$strings["Allow posts to be published at a later date"] = "Permitir mensajes que se publicarán en una fecha posterior";
+App::$strings["Suppress Duplicate Posts/Comments"] = "Prevenir entradas o comentarios duplicados";
+App::$strings["Prevent posts with identical content to be published with less than two minutes in between submissions."] = "Prevenir que entradas con contenido idéntico se publiquen con menos de dos minutos de intervalo.";
+App::$strings["Network and Stream Filtering"] = "Filtrado del contenido";
+App::$strings["Search by Date"] = "Buscar por fecha";
+App::$strings["Ability to select posts by date ranges"] = "Capacidad de seleccionar entradas por rango de fechas";
+App::$strings["Privacy Groups"] = "Grupos de canales";
+App::$strings["Enable management and selection of privacy groups"] = "Activar la gestión y selección de grupos de canales";
+App::$strings["Saved Searches"] = "Búsquedas guardadas";
+App::$strings["Save search terms for re-use"] = "Guardar términos de búsqueda para su reutilización";
+App::$strings["Network Personal Tab"] = "Actividad personal";
+App::$strings["Enable tab to display only Network posts that you've interacted on"] = "Habilitar una pestaña en la cual se muestren solo las entradas en las que ha participado.";
+App::$strings["Network New Tab"] = "Contenido nuevo";
+App::$strings["Enable tab to display all new Network activity"] = "Habilitar una pestaña en la que se muestre solo el contenido nuevo";
+App::$strings["Affinity Tool"] = "Herramienta de afinidad";
+App::$strings["Filter stream activity by depth of relationships"] = "Filtrar el contenido según la profundidad de las relaciones";
+App::$strings["Connection Filtering"] = "Filtrado de conexiones";
+App::$strings["Filter incoming posts from connections based on keywords/content"] = "Filtrar publicaciones entrantes de conexiones por palabras clave o contenido";
+App::$strings["Suggest Channels"] = "Sugerir canales";
+App::$strings["Show channel suggestions"] = "Mostrar sugerencias de canales";
+App::$strings["Post/Comment Tools"] = "Gestión de entradas y comentarios";
+App::$strings["Community Tagging"] = "Etiquetas de la comunidad";
+App::$strings["Ability to tag existing posts"] = "Capacidad de etiquetar entradas existentes";
+App::$strings["Post Categories"] = "Categorías de entradas";
+App::$strings["Add categories to your posts"] = "Añadir categorías a sus publicaciones";
+App::$strings["Ability to file posts under folders"] = "Capacidad de archivar entradas en carpetas";
+App::$strings["Dislike Posts"] = "Desagrado de publicaciones";
+App::$strings["Ability to dislike posts/comments"] = "Capacidad de mostrar desacuerdo con el contenido de entradas y comentarios";
+App::$strings["Star Posts"] = "Entradas destacadas";
+App::$strings["Ability to mark special posts with a star indicator"] = "Capacidad de marcar entradas destacadas con un indicador de estrella";
+App::$strings["Tag Cloud"] = "Nube de etiquetas";
+App::$strings["Provide a personal tag cloud on your channel page"] = "Proveer nube de etiquetas personal en su página de canal";
+App::$strings["Channel is blocked on this site."] = "El canal está bloqueado en este sitio.";
+App::$strings["Channel location missing."] = "Falta la dirección del canal.";
+App::$strings["Response from remote channel was incomplete."] = "Respuesta incompleta del canal.";
+App::$strings["Channel was deleted and no longer exists."] = "El canal ha sido eliminado y ya no existe.";
+App::$strings["Protocol disabled."] = "Protocolo deshabilitado.";
+App::$strings["Channel discovery failed."] = "El intento de acceder al canal ha fallado.";
+App::$strings["Cannot connect to yourself."] = "No puede conectarse consigo mismo.";
+App::$strings["A deleted group with this name was revived. Existing item permissions <strong>may</strong> apply to this group and any future members. If this is not what you intended, please create another group with a different name."] = "Un grupo suprimido con este nombre ha sido restablecido. <strong>Es posible</strong> que los permisos existentes sean aplicados a este grupo y sus futuros miembros. Si no quiere esto, por favor cree otro grupo con un nombre diferente.";
+App::$strings["Add new connections to this privacy group"] = "Añadir conexiones nuevas a este grupo de canales";
+App::$strings["edit"] = "editar";
+App::$strings["Edit group"] = "Editar grupo";
+App::$strings["Add privacy group"] = "Añadir un grupo de canales";
+App::$strings["Channels not in any privacy group"] = "Sin canales en ningún grupo";
+App::$strings["add"] = "añadir";
+App::$strings["(Unknown)"] = "(Desconocido)";
+App::$strings["Visible to anybody on the internet."] = "Visible para cualquiera en internet.";
+App::$strings["Visible to you only."] = "Visible sólo para usted.";
+App::$strings["Visible to anybody in this network."] = "Visible para cualquiera en esta red.";
+App::$strings["Visible to anybody authenticated."] = "Visible para cualquiera que haya sido autenticado.";
+App::$strings["Visible to anybody on %s."] = "Visible para cualquiera en %s.";
+App::$strings["Visible to all connections."] = "Visible para todas las conexiones.";
+App::$strings["Visible to approved connections."] = "Visible para las conexiones permitidas.";
+App::$strings["Visible to specific connections."] = "Visible para conexiones específicas.";
+App::$strings["Privacy group is empty."] = "El grupo de canales está vacío.";
+App::$strings["Privacy group: %s"] = "Grupo de canales: %s";
+App::$strings["Connection not found."] = "Conexión no encontrada";
+App::$strings["profile photo"] = "foto del perfil";
+App::$strings["Image exceeds website size limit of %lu bytes"] = "La imagen excede el límite de %lu bytes del sitio";
+App::$strings["Image file is empty."] = "El fichero de imagen está vacío. ";
+App::$strings["Photo storage failed."] = "La foto no ha podido ser guardada.";
+App::$strings["a new photo"] = "una nueva foto";
+App::$strings["__ctx:photo_upload__ %1\$s posted %2\$s to %3\$s"] = "%1\$s ha publicado %2\$s en %3\$s";
+App::$strings["Upload New Photos"] = "Subir nuevas fotos";
+App::$strings["System"] = "Sistema";
+App::$strings["Create Personal App"] = "Crear una aplicación personal";
+App::$strings["Edit Personal App"] = "Editar una aplicación personal";
+App::$strings["Suggestions"] = "Sugerencias";
+App::$strings["See more..."] = "Ver más...";
+App::$strings["You have %1$.0f of %2$.0f allowed connections."] = "Tiene %1$.0f de %2$.0f conexiones permitidas.";
+App::$strings["Add New Connection"] = "Añadir nueva conexión";
+App::$strings["Enter channel address"] = "Dirección del canal";
+App::$strings["Examples: bob@example.com, https://example.com/barbara"] = "Ejemplos: manuel@ejemplo.com, https://ejemplo.com/carmen";
+App::$strings["Notes"] = "Notas";
+App::$strings["Remove term"] = "Eliminar término";
+App::$strings["Archives"] = "Hemeroteca";
+App::$strings["Refresh"] = "Recargar";
+App::$strings["Account settings"] = "Configuración de la cuenta";
+App::$strings["Channel settings"] = "Configuración del canal";
+App::$strings["Additional features"] = "Funcionalidades";
+App::$strings["Feature/Addon settings"] = "Complementos";
+App::$strings["Display settings"] = "Ajustes de visualización";
+App::$strings["Manage locations"] = "Gestión de ubicaciones (clones) del canal";
+App::$strings["Export channel"] = "Exportar canal";
+App::$strings["Connected apps"] = "Aplicaciones conectadas";
+App::$strings["Premium Channel Settings"] = "Configuración del canal premium";
+App::$strings["Private Mail Menu"] = "Menú de correo privado";
+App::$strings["Combined View"] = "Vista combinada";
+App::$strings["Inbox"] = "Bandeja de entrada";
+App::$strings["Outbox"] = "Bandeja de salida";
+App::$strings["New Message"] = "Nuevo mensaje";
+App::$strings["Conversations"] = "Conversaciones";
+App::$strings["Received Messages"] = "Mensajes recibidos";
+App::$strings["Sent Messages"] = "Enviar mensajes";
+App::$strings["No messages."] = "Sin mensajes.";
+App::$strings["Delete conversation"] = "Eliminar conversación";
+App::$strings["Events Menu"] = "Menú de eventos";
+App::$strings["Day View"] = "Eventos del día";
+App::$strings["Week View"] = "Eventos de la semana";
+App::$strings["Month View"] = "Eventos del mes";
+App::$strings["Events Tools"] = "Gestión de eventos";
+App::$strings["Export Calendar"] = "Exportar el calendario";
+App::$strings["Import Calendar"] = "Importar un calendario";
+App::$strings["Overview"] = "Resumen";
+App::$strings["Chat Members"] = "Miembros del chat";
+App::$strings["Bookmarked Chatrooms"] = "Salas de chat preferidas";
+App::$strings["Suggested Chatrooms"] = "Salas de chat sugeridas";
+App::$strings["photo/image"] = "foto/imagen";
+App::$strings["Click to show more"] = "Hacer clic para ver más";
+App::$strings["Rating Tools"] = "Valoraciones";
+App::$strings["Rate Me"] = "Valorar este canal";
+App::$strings["View Ratings"] = "Mostrar las valoraciones";
+App::$strings["Forums"] = "Foros";
+App::$strings["Tasks"] = "Tareas";
+App::$strings["Documentation"] = "Documentación";
+App::$strings["Project/Site Information"] = "Información sobre el proyecto o sitio";
+App::$strings["For Members"] = "Para los miembros";
+App::$strings["For Administrators"] = "Para los administradores";
+App::$strings["For Developers"] = "Para los desarrolladores";
+App::$strings["Accounts"] = "Cuentas";
+App::$strings["Member registrations waiting for confirmation"] = "Inscripciones de nuevos miembros pendientes de aprobación";
+App::$strings["Inspect queue"] = "Examinar la cola";
+App::$strings["DB updates"] = "Actualizaciones de la base de datos";
+App::$strings["Admin"] = "Administrador";
+App::$strings["Plugin Features"] = "Extensiones";
+App::$strings["Tags"] = "Etiquetas";
+App::$strings["Keywords"] = "Palabras clave";
+App::$strings["have"] = "tener";
+App::$strings["has"] = "tiene";
+App::$strings["want"] = "quiero";
+App::$strings["wants"] = "quiere";
+App::$strings["likes"] = "gusta de";
+App::$strings["dislikes"] = "no gusta de";
+App::$strings["Delete this item?"] = "¿Borrar este elemento?";
+App::$strings["[-] show less"] = "[-] mostrar menos";
+App::$strings["[+] expand"] = "[+] expandir";
+App::$strings["[-] collapse"] = "[-] contraer";
+App::$strings["Password too short"] = "Contraseña demasiado corta";
+App::$strings["Passwords do not match"] = "Las contraseñas no coinciden";
+App::$strings["Secret Passphrase"] = "Contraseña secreta";
+App::$strings["Passphrase hint"] = "Pista de contraseña";
+App::$strings["Notice: Permissions have changed but have not yet been submitted."] = "Aviso: los permisos han cambiado pero aún no han sido enviados.";
+App::$strings["close all"] = "cerrar todo";
+App::$strings["Nothing new here"] = "Nada nuevo por aquí";
+App::$strings["Rate This Channel (this is public)"] = "Valorar este canal (esto es público)";
+App::$strings["Describe (optional)"] = "Describir (opcional)";
+App::$strings["Please enter a link URL"] = "Por favor, introduzca una dirección de enlace";
+App::$strings["Unsaved changes. Are you sure you wish to leave this page?"] = "Cambios no guardados. ¿Está seguro de que desea abandonar la página?";
+App::$strings["timeago.prefixAgo"] = "timeago.prefixAgo";
+App::$strings["timeago.prefixFromNow"] = "timeago.prefixFromNow";
+App::$strings["ago"] = "antes";
+App::$strings["from now"] = "desde ahora";
+App::$strings["less than a minute"] = "menos de un minuto";
+App::$strings["about a minute"] = "alrededor de un minuto";
+App::$strings["%d minutes"] = "%d minutos";
+App::$strings["about an hour"] = "alrededor de una hora";
+App::$strings["about %d hours"] = "alrededor de %d horas";
+App::$strings["a day"] = "un día";
+App::$strings["%d days"] = "%d días";
+App::$strings["about a month"] = "alrededor de un mes";
+App::$strings["%d months"] = "%d meses";
+App::$strings["about a year"] = "alrededor de un año";
+App::$strings["%d years"] = "%d años";
+App::$strings[" "] = " ";
+App::$strings["timeago.numbers"] = "timeago.numbers";
+App::$strings["January"] = "enero";
+App::$strings["February"] = "febrero";
+App::$strings["March"] = "marzo";
+App::$strings["April"] = "abril";
+App::$strings["__ctx:long__ May"] = "mayo";
+App::$strings["June"] = "junio";
+App::$strings["July"] = "julio";
+App::$strings["August"] = "agosto";
+App::$strings["September"] = "septiembre";
+App::$strings["October"] = "octubre";
+App::$strings["November"] = "noviembre";
+App::$strings["December"] = "diciembre";
+App::$strings["Jan"] = "ene";
+App::$strings["Feb"] = "feb";
+App::$strings["Mar"] = "mar";
+App::$strings["Apr"] = "abr";
+App::$strings["__ctx:short__ May"] = "may";
+App::$strings["Jun"] = "jun";
+App::$strings["Jul"] = "jul";
+App::$strings["Aug"] = "ago";
+App::$strings["Sep"] = "sep";
+App::$strings["Oct"] = "oct";
+App::$strings["Nov"] = "nov";
+App::$strings["Dec"] = "dic";
+App::$strings["Sunday"] = "domingo";
+App::$strings["Monday"] = "lunes";
+App::$strings["Tuesday"] = "martes";
+App::$strings["Wednesday"] = "miércoles";
+App::$strings["Thursday"] = "jueves";
+App::$strings["Friday"] = "viernes";
+App::$strings["Saturday"] = "sábado";
+App::$strings["Sun"] = "dom";
+App::$strings["Mon"] = "lun";
+App::$strings["Tue"] = "mar";
+App::$strings["Wed"] = "mié";
+App::$strings["Thu"] = "jue";
+App::$strings["Fri"] = "vie";
+App::$strings["Sat"] = "sáb";
+App::$strings["__ctx:calendar__ today"] = "hoy";
+App::$strings["__ctx:calendar__ month"] = "mes";
+App::$strings["__ctx:calendar__ week"] = "semana";
+App::$strings["__ctx:calendar__ day"] = "día";
+App::$strings["__ctx:calendar__ All day"] = "Todos los días";
+App::$strings["No recipient provided."] = "No se ha especificado ningún destinatario.";
+App::$strings["[no subject]"] = "[sin asunto]";
+App::$strings["Unable to determine sender."] = "No ha sido posible determinar el remitente. ";
+App::$strings["Stored post could not be verified."] = "No se han podido verificar las publicaciones guardadas.";
+App::$strings["Cannot create a duplicate channel identifier on this system. Import failed."] = "No se ha podido crear un canal con un identificador que ya existe en este sistema. La importación ha fallado.";
+App::$strings["Channel clone failed. Import failed."] = "La clonación del canal no ha salido bien. La importación ha fallado.";
+App::$strings["Embedded content"] = "Contenido incorporado";
+App::$strings["Embedding disabled"] = "Incrustación deshabilitada";
+App::$strings["New Page"] = "Nueva página";
+App::$strings["Title"] = "Título";
+App::$strings["Can view my normal stream and posts"] = "Pueden verse mi actividad y publicaciones normales";
+App::$strings["Can view my default channel profile"] = "Puede verse mi perfil de canal predeterminado.";
+App::$strings["Can view my connections"] = "Pueden verse mis conexiones";
+App::$strings["Can view my file storage and photos"] = "Pueden verse mi repositorio de ficheros y mis fotos";
+App::$strings["Can view my webpages"] = "Pueden verse mis páginas web";
+App::$strings["Can send me their channel stream and posts"] = "Me pueden enviar sus entradas y contenidos del canal";
+App::$strings["Can post on my channel page (\"wall\")"] = "Pueden crearse entradas en mi página de inicio del canal (“muro”)";
+App::$strings["Can comment on or like my posts"] = "Pueden publicarse comentarios en mis publicaciones o marcar mis entradas con 'me gusta'.";
+App::$strings["Can send me private mail messages"] = "Se me pueden enviar mensajes privados";
+App::$strings["Can like/dislike stuff"] = "Puede marcarse contenido como me gusta/no me gusta";
+App::$strings["Profiles and things other than posts/comments"] = "Perfiles y otras cosas aparte de publicaciones/comentarios";
+App::$strings["Can forward to all my channel contacts via post @mentions"] = "Puede enviarse una entrada a todos mis contactos del canal mediante una @mención";
+App::$strings["Advanced - useful for creating group forum channels"] = "Avanzado - útil para crear canales de foros de discusión o grupos";
+App::$strings["Can chat with me (when available)"] = "Se puede charlar conmigo (cuando esté disponible)";
+App::$strings["Can write to my file storage and photos"] = "Puede escribirse en mi repositorio de ficheros y fotos";
+App::$strings["Can edit my webpages"] = "Pueden editarse mis páginas web";
+App::$strings["Can source my public posts in derived channels"] = "Pueden utilizarse mis publicaciones públicas como origen de contenidos en canales derivados";
+App::$strings["Somewhat advanced - very useful in open communities"] = "Algo avanzado - muy útil en comunidades abiertas";
+App::$strings["Can administer my channel resources"] = "Pueden administrarse mis recursos del canal";
+App::$strings["Extremely advanced. Leave this alone unless you know what you are doing"] = "Muy avanzado. Déjelo a no ser que sepa bien lo que está haciendo.";
+App::$strings["Social Networking"] = "Redes sociales";
+App::$strings["Social - Mostly Public"] = "Social - Público en su mayor parte";
+App::$strings["Social - Restricted"] = "Social - Restringido";
+App::$strings["Social - Private"] = "Social - Privado";
+App::$strings["Community Forum"] = "Foro de discusión";
+App::$strings["Forum - Mostly Public"] = "Foro - Público en su mayor parte";
+App::$strings["Forum - Restricted"] = "Foro - Restringido";
+App::$strings["Forum - Private"] = "Foro - Privado";
+App::$strings["Feed Republish"] = "Republicar un \"feed\"";
+App::$strings["Feed - Mostly Public"] = "Feed - Público en su mayor parte";
+App::$strings["Feed - Restricted"] = "Feed - Restringido";
+App::$strings["Special Purpose"] = "Propósito especial";
+App::$strings["Special - Celebrity/Soapbox"] = "Especial - Celebridad / Tribuna improvisada";
+App::$strings["Special - Group Repository"] = "Especial - Repositorio de grupo";
+App::$strings["Custom/Expert Mode"] = "Modo personalizado/experto";
+App::$strings["prev"] = "anterior";
+App::$strings["first"] = "primera";
+App::$strings["last"] = "última";
+App::$strings["next"] = "próxima";
+App::$strings["older"] = "más antiguas";
+App::$strings["newer"] = "más recientes";
+App::$strings["No connections"] = "Sin conexiones";
+App::$strings["View all %s connections"] = "Ver todas las %s conexiones";
+App::$strings["poke"] = "un toque";
+App::$strings["ping"] = "un \"ping\"";
+App::$strings["pinged"] = "ha enviado un \"ping\" a";
+App::$strings["prod"] = "una incitación ";
+App::$strings["prodded"] = "ha incitado a ";
+App::$strings["slap"] = "una bofetada ";
+App::$strings["slapped"] = "ha abofeteado a ";
+App::$strings["finger"] = "un \"finger\" ";
+App::$strings["fingered"] = "envió un \"finger\" a";
+App::$strings["rebuff"] = "un reproche";
+App::$strings["rebuffed"] = "ha hecho un reproche a ";
+App::$strings["happy"] = "feliz ";
+App::$strings["sad"] = "triste ";
+App::$strings["mellow"] = "tranquilo/a";
+App::$strings["tired"] = "cansado/a ";
+App::$strings["perky"] = "vivaz";
+App::$strings["angry"] = "enfadado/a";
+App::$strings["stupefied"] = "asombrado/a";
+App::$strings["puzzled"] = "perplejo/a";
+App::$strings["interested"] = "interesado/a";
+App::$strings["bitter"] = "amargado/a";
+App::$strings["cheerful"] = "alegre";
+App::$strings["alive"] = "animado/a";
+App::$strings["annoyed"] = "molesto/a";
+App::$strings["anxious"] = "ansioso/a";
+App::$strings["cranky"] = "de mal humor";
+App::$strings["disturbed"] = "perturbado/a";
+App::$strings["frustrated"] = "frustrado/a";
+App::$strings["depressed"] = "deprimido/a";
+App::$strings["motivated"] = "motivado/a";
+App::$strings["relaxed"] = "relajado/a";
+App::$strings["surprised"] = "sorprendido/a";
+App::$strings["May"] = "mayo";
+App::$strings["Unknown Attachment"] = "Adjunto no reconocido";
+App::$strings["unknown"] = "desconocido";
+App::$strings["remove category"] = "eliminar categoría";
+App::$strings["remove from file"] = "eliminar del fichero";
+App::$strings["Click to open/close"] = "Pulsar para abrir/cerrar";
+App::$strings["default"] = "por defecto";
+App::$strings["Page layout"] = "Plantilla de la página";
+App::$strings["You can create your own with the layouts tool"] = "Puede crear su propia disposición gráfica con la herramienta de plantillas";
+App::$strings["Page content type"] = "Tipo de contenido de la página";
+App::$strings["Select an alternate language"] = "Seleccionar un idioma alternativo";
+App::$strings["activity"] = "la actividad";
+App::$strings["Design Tools"] = "Herramientas de diseño web";
+App::$strings["Pages"] = "Páginas";
+App::$strings["Logout"] = "Finalizar sesión";
+App::$strings["End this session"] = "Finalizar esta sesión";
+App::$strings["Home"] = "Inicio";
+App::$strings["Your posts and conversations"] = "Sus publicaciones y conversaciones";
+App::$strings["Your profile page"] = "Su página del perfil";
+App::$strings["Manage/Edit profiles"] = "Administrar/editar perfiles";
+App::$strings["Edit your profile"] = "Editar su perfil";
+App::$strings["Your photos"] = "Sus fotos";
+App::$strings["Your files"] = "Sus ficheros";
+App::$strings["Your chatrooms"] = "Sus salas de chat";
+App::$strings["Your bookmarks"] = "Sus marcadores";
+App::$strings["Your webpages"] = "Sus páginas web";
+App::$strings["Sign in"] = "Acceder";
+App::$strings["%s - click to logout"] = "%s - pulsar para finalizar sesión";
+App::$strings["Remote authentication"] = "Acceder desde su servidor";
+App::$strings["Click to authenticate to your home hub"] = "Pulsar para identificarse en su servidor de inicio";
+App::$strings["Home Page"] = "Página de inicio";
+App::$strings["Create an account"] = "Crear una cuenta";
+App::$strings["Help and documentation"] = "Ayuda y documentación";
+App::$strings["Applications, utilities, links, games"] = "Aplicaciones, utilidades, enlaces, juegos";
+App::$strings["Search site @name, #tag, ?docs, content"] = "Buscar en el sitio por @nombre, #etiqueta, ?ayuda o contenido";
+App::$strings["Channel Directory"] = "Directorio de canales";
+App::$strings["Your grid"] = "Mi red";
+App::$strings["Mark all grid notifications seen"] = "Marcar todas las notificaciones de la red como vistas";
+App::$strings["Channel home"] = "Mi canal";
+App::$strings["Mark all channel notifications seen"] = "Marcar todas las notificaciones del canal como leídas";
+App::$strings["Notices"] = "Avisos";
+App::$strings["Notifications"] = "Notificaciones";
+App::$strings["See all notifications"] = "Ver todas las notificaciones";
+App::$strings["Private mail"] = "Correo privado";
+App::$strings["See all private messages"] = "Ver todas los mensajes privados";
+App::$strings["Mark all private messages seen"] = "Marcar todos los mensajes privados como leídos";
+App::$strings["Event Calendar"] = "Calendario de eventos";
+App::$strings["See all events"] = "Ver todos los eventos";
+App::$strings["Mark all events seen"] = "Marcar todos los eventos como leidos";
+App::$strings["Manage Your Channels"] = "Gestionar sus canales";
+App::$strings["Account/Channel Settings"] = "Ajustes de cuenta/canales";
+App::$strings["Site Setup and Configuration"] = "Ajustes y configuración del sitio";
+App::$strings["@name, #tag, ?doc, content"] = "@nombre, #etiqueta, ?ayuda, contenido";
+App::$strings["Please wait..."] = "Espere por favor…";
+App::$strings["Invalid data packet"] = "Paquete de datos no válido";
+App::$strings["Unable to verify channel signature"] = "No ha sido posible de verificar la firma del canal";
+App::$strings["Unable to verify site signature for %s"] = "No ha sido posible de verificar la firma del sitio para %s";
+App::$strings["invalid target signature"] = "La firma recibida no es válida";
App::$strings["Focus (Hubzilla default)"] = "Focus (predefinido)";
App::$strings["Theme settings"] = "Ajustes del tema";
App::$strings["Select scheme"] = "Elegir un esquema";
diff --git a/view/js/autocomplete.js b/view/js/autocomplete.js
index 84cc075dc..21ce2d150 100644
--- a/view/js/autocomplete.js
+++ b/view/js/autocomplete.js
@@ -265,7 +265,7 @@ function string2bb(element) {
$.fn.bbco_autocomplete = function(type) {
if(type=='bbcode') {
- var open_close_elements = ['bold', 'italic', 'underline', 'overline', 'strike', 'superscript', 'subscript', 'quote', 'code', 'spoiler', 'map', 'nobb', 'list', 'ul', 'ol', 'li', 'table', 'tr', 'th', 'td', 'center', 'color', 'font', 'size', 'zrl', 'zmg', 'rpost', 'qr', 'observer'];
+ var open_close_elements = ['bold', 'italic', 'underline', 'overline', 'strike', 'superscript', 'subscript', 'quote', 'code', 'open', 'spoiler', 'map', 'nobb', 'list', 'ul', 'ol', 'li', 'table', 'tr', 'th', 'td', 'center', 'color', 'font', 'size', 'zrl', 'zmg', 'rpost', 'qr', 'observer'];
var open_elements = ['observer.baseurl', 'observer.address', 'observer.photo', 'observer.name', 'observer.webname', 'observer.url', '*', 'hr', ];
var elements = open_close_elements.concat(open_elements);
diff --git a/view/js/main.js b/view/js/main.js
index 799ae82bc..748853939 100644
--- a/view/js/main.js
+++ b/view/js/main.js
@@ -372,11 +372,11 @@ function NavUpdate() {
if(! updateCountsOnly) {
// start live update
- if($('#live-network').length) { src = 'network'; liveUpdate(); }
- if($('#live-channel').length) { src = 'channel'; liveUpdate(); }
- if($('#live-public').length) { src = 'public'; liveUpdate(); }
- if($('#live-display').length) { src = 'display'; liveUpdate(); }
- if($('#live-search').length) { src = 'search'; liveUpdate(); }
+ if($('#live-network').length) { src = 'network'; liveUpdate(); }
+ if($('#live-channel').length) { src = 'channel'; liveUpdate(); }
+ if($('#live-pubstream').length) { src = 'pubstream'; liveUpdate(); }
+ if($('#live-display').length) { src = 'display'; liveUpdate(); }
+ if($('#live-search').length) { src = 'search'; liveUpdate(); }
if($('#live-photos').length) {
if(liking) {
@@ -443,6 +443,32 @@ function NavUpdate() {
timer = setTimeout(NavUpdate, updateInterval);
}
+function contextualHelp() {
+ var container = $("#contextual-help-content");
+
+ if(container.hasClass('contextual-help-content-open')) {
+ container.removeClass('contextual-help-content-open');
+ $('main').css('top', '')
+ }
+ else {
+ container.addClass('contextual-help-content-open');
+ var mainTop = container.outerHeight(true);
+ $('main').css('top', mainTop + 'px');
+ }
+}
+
+function contextualHelpFocus(target, openSidePanel) {
+ if (openSidePanel) {
+ $("main").addClass('region_1-on'); // Open the side panel to highlight element
+ }
+ else {
+ $("main").removeClass('region_1-on');
+ }
+ $('html,body').animate({ scrollTop: $(target).offset().top - $('nav').outerHeight(true) - $('#contextual-help-content').outerHeight(true)}, 'slow');
+ for (i = 0; i < 3; i++) {
+ $(target).fadeTo('slow', 0.1).fadeTo('slow', 1.0);
+ }
+}
function updatePageItems(mode, data) {
diff --git a/view/nl/hmessages.po b/view/nl/hmessages.po
index 5cc64246d..85b3676f1 100644
--- a/view/nl/hmessages.po
+++ b/view/nl/hmessages.po
@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Redmatrix\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-04-15 00:01-0700\n"
-"PO-Revision-Date: 2016-04-15 18:18+0000\n"
+"POT-Creation-Date: 2016-04-22 00:01-0700\n"
+"PO-Revision-Date: 2016-04-25 13:03+0000\n"
"Last-Translator: jeroenpraat <jeroenpraat@xs4all.nl>\n"
"Language-Team: Dutch (http://www.transifex.com/Friendica/red-matrix/language/nl/)\n"
"MIME-Version: 1.0\n"
@@ -46,16 +46,16 @@ msgstr "Planning-postvak IN"
msgid "Schedule Outbox"
msgstr "Planning-postvak UIT"
-#: ../../Zotlabs/Storage/Browser.php:164 ../../include/apps.php:360
+#: ../../Zotlabs/Storage/Browser.php:164 ../../Zotlabs/Module/Photos.php:797
+#: ../../Zotlabs/Module/Photos.php:1241 ../../include/apps.php:360
#: ../../include/apps.php:415 ../../include/conversation.php:1037
-#: ../../include/widgets.php:1457 ../../mod/photos.php:793
-#: ../../mod/photos.php:1237
+#: ../../include/widgets.php:1457
msgid "Unknown"
msgstr "Onbekend"
-#: ../../Zotlabs/Storage/Browser.php:226 ../../include/apps.php:135
-#: ../../include/conversation.php:1657 ../../include/nav.php:93
-#: ../../mod/fbrowser.php:109
+#: ../../Zotlabs/Storage/Browser.php:226 ../../Zotlabs/Module/Fbrowser.php:85
+#: ../../include/apps.php:135 ../../include/conversation.php:1657
+#: ../../include/nav.php:93
msgid "Files"
msgstr "Bestanden"
@@ -68,21 +68,23 @@ msgid "Shared"
msgstr "Gedeeld"
#: ../../Zotlabs/Storage/Browser.php:230 ../../Zotlabs/Storage/Browser.php:303
-#: ../../mod/new_channel.php:138 ../../mod/webpages.php:184
-#: ../../mod/blocks.php:154 ../../mod/layouts.php:176 ../../mod/menu.php:114
+#: ../../Zotlabs/Module/Blocks.php:158 ../../Zotlabs/Module/Layouts.php:180
+#: ../../Zotlabs/Module/Menu.php:118 ../../Zotlabs/Module/New_channel.php:142
+#: ../../Zotlabs/Module/Webpages.php:188
msgid "Create"
msgstr "Aanmaken"
#: ../../Zotlabs/Storage/Browser.php:231 ../../Zotlabs/Storage/Browser.php:305
-#: ../../include/widgets.php:1470 ../../mod/photos.php:820
-#: ../../mod/photos.php:1361 ../../mod/profile_photo.php:401
-#: ../../mod/cover_photo.php:353
+#: ../../Zotlabs/Module/Cover_photo.php:357
+#: ../../Zotlabs/Module/Photos.php:824 ../../Zotlabs/Module/Photos.php:1365
+#: ../../Zotlabs/Module/Profile_photo.php:368 ../../include/widgets.php:1470
msgid "Upload"
msgstr "Uploaden"
-#: ../../Zotlabs/Storage/Browser.php:235 ../../mod/admin.php:1158
-#: ../../mod/chat.php:241 ../../mod/settings.php:599
-#: ../../mod/settings.php:625 ../../mod/sharedwithme.php:95
+#: ../../Zotlabs/Storage/Browser.php:235 ../../Zotlabs/Module/Admin.php:1166
+#: ../../Zotlabs/Module/Chat.php:245 ../../Zotlabs/Module/Settings.php:590
+#: ../../Zotlabs/Module/Settings.php:616
+#: ../../Zotlabs/Module/Sharedwithme.php:99
msgid "Name"
msgstr "Naam"
@@ -90,36 +92,45 @@ msgstr "Naam"
msgid "Type"
msgstr "Type"
-#: ../../Zotlabs/Storage/Browser.php:237 ../../include/text.php:1293
-#: ../../mod/sharedwithme.php:97
+#: ../../Zotlabs/Storage/Browser.php:237
+#: ../../Zotlabs/Module/Sharedwithme.php:101 ../../include/text.php:1293
msgid "Size"
msgstr "Grootte"
-#: ../../Zotlabs/Storage/Browser.php:238 ../../mod/sharedwithme.php:98
+#: ../../Zotlabs/Storage/Browser.php:238
+#: ../../Zotlabs/Module/Sharedwithme.php:102
msgid "Last Modified"
msgstr "Laatst gewijzigd"
-#: ../../Zotlabs/Storage/Browser.php:240 ../../include/identity.php:930
+#: ../../Zotlabs/Storage/Browser.php:240 ../../Zotlabs/Module/Admin.php:1775
+#: ../../Zotlabs/Module/Blocks.php:159
+#: ../../Zotlabs/Module/Connections.php:290
+#: ../../Zotlabs/Module/Connections.php:310
+#: ../../Zotlabs/Module/Editblock.php:140
+#: ../../Zotlabs/Module/Editlayout.php:139
+#: ../../Zotlabs/Module/Editpost.php:118
+#: ../../Zotlabs/Module/Editwebpage.php:181
+#: ../../Zotlabs/Module/Layouts.php:188 ../../Zotlabs/Module/Menu.php:112
+#: ../../Zotlabs/Module/Settings.php:650 ../../Zotlabs/Module/Thing.php:260
+#: ../../Zotlabs/Module/Webpages.php:189 ../../include/identity.php:930
#: ../../include/identity.php:934 ../../include/ItemObject.php:100
#: ../../include/apps.php:259 ../../include/menu.php:108
#: ../../include/page_widgets.php:8 ../../include/page_widgets.php:36
-#: ../../mod/admin.php:1767 ../../mod/editpost.php:114
-#: ../../mod/connections.php:286 ../../mod/connections.php:306
-#: ../../mod/editblock.php:136 ../../mod/editlayout.php:135
-#: ../../mod/webpages.php:185 ../../mod/editwebpage.php:177
-#: ../../mod/blocks.php:155 ../../mod/settings.php:659
-#: ../../mod/layouts.php:184 ../../mod/menu.php:108 ../../mod/thing.php:256
msgid "Edit"
msgstr "Bewerken"
-#: ../../Zotlabs/Storage/Browser.php:241 ../../include/ItemObject.php:120
-#: ../../include/apps.php:260 ../../include/conversation.php:657
-#: ../../mod/admin.php:993 ../../mod/admin.php:1152 ../../mod/admin.php:1768
-#: ../../mod/photos.php:1168 ../../mod/connections.php:259
-#: ../../mod/connedit.php:569 ../../mod/editblock.php:183
-#: ../../mod/editlayout.php:180 ../../mod/webpages.php:187
-#: ../../mod/editwebpage.php:224 ../../mod/blocks.php:157
-#: ../../mod/group.php:173 ../../mod/settings.php:660 ../../mod/thing.php:257
+#: ../../Zotlabs/Storage/Browser.php:241 ../../Zotlabs/Module/Admin.php:1001
+#: ../../Zotlabs/Module/Admin.php:1160 ../../Zotlabs/Module/Admin.php:1776
+#: ../../Zotlabs/Module/Blocks.php:161
+#: ../../Zotlabs/Module/Connections.php:263
+#: ../../Zotlabs/Module/Connedit.php:573
+#: ../../Zotlabs/Module/Editblock.php:187
+#: ../../Zotlabs/Module/Editlayout.php:184
+#: ../../Zotlabs/Module/Editwebpage.php:228 ../../Zotlabs/Module/Group.php:177
+#: ../../Zotlabs/Module/Photos.php:1172 ../../Zotlabs/Module/Settings.php:651
+#: ../../Zotlabs/Module/Thing.php:261 ../../Zotlabs/Module/Webpages.php:191
+#: ../../include/ItemObject.php:120 ../../include/apps.php:260
+#: ../../include/conversation.php:657
msgid "Delete"
msgstr "Verwijderen"
@@ -145,58 +156,77 @@ msgstr "Nieuwe map aanmaken"
msgid "Upload file"
msgstr "Bestand uploaden"
-#: ../../Zotlabs/Web/Router.php:47 ../../include/items.php:4671
-#: ../../include/photos.php:29 ../../include/chat.php:133
-#: ../../include/attach.php:141 ../../include/attach.php:189
-#: ../../include/attach.php:252 ../../include/attach.php:266
-#: ../../include/attach.php:273 ../../include/attach.php:338
-#: ../../include/attach.php:352 ../../include/attach.php:359
-#: ../../include/attach.php:437 ../../include/attach.php:895
-#: ../../include/attach.php:966 ../../include/attach.php:1118
-#: ../../mod/achievements.php:30 ../../mod/api.php:26 ../../mod/api.php:31
-#: ../../mod/appman.php:66 ../../mod/page.php:31 ../../mod/page.php:86
-#: ../../mod/authtest.php:13 ../../mod/pdledit.php:22 ../../mod/block.php:22
-#: ../../mod/block.php:72 ../../mod/editpost.php:13 ../../mod/photos.php:70
-#: ../../mod/bookmarks.php:57 ../../mod/mitem.php:111
-#: ../../mod/channel.php:101 ../../mod/channel.php:221
-#: ../../mod/channel.php:261 ../../mod/poke.php:133 ../../mod/chat.php:94
-#: ../../mod/chat.php:99 ../../mod/common.php:35 ../../mod/profile.php:64
-#: ../../mod/profile.php:72 ../../mod/mood.php:112
-#: ../../mod/connections.php:29 ../../mod/profile_photo.php:289
-#: ../../mod/profile_photo.php:302 ../../mod/connedit.php:362
-#: ../../mod/network.php:12 ../../mod/cover_photo.php:273
-#: ../../mod/cover_photo.php:286 ../../mod/profiles.php:198
-#: ../../mod/profiles.php:596 ../../mod/editblock.php:65
-#: ../../mod/new_channel.php:73 ../../mod/new_channel.php:100
-#: ../../mod/editlayout.php:63 ../../mod/editlayout.php:87
-#: ../../mod/rate.php:111 ../../mod/webpages.php:69
-#: ../../mod/editwebpage.php:64 ../../mod/editwebpage.php:86
-#: ../../mod/editwebpage.php:101 ../../mod/editwebpage.php:125
-#: ../../mod/blocks.php:69 ../../mod/blocks.php:76 ../../mod/events.php:260
-#: ../../mod/register.php:73 ../../mod/regmod.php:17
-#: ../../mod/notifications.php:66 ../../mod/filestorage.php:18
-#: ../../mod/filestorage.php:73 ../../mod/filestorage.php:88
-#: ../../mod/filestorage.php:115 ../../mod/fsuggest.php:78
-#: ../../mod/group.php:9 ../../mod/service_limits.php:7
-#: ../../mod/settings.php:579 ../../mod/id.php:71 ../../mod/setup.php:233
-#: ../../mod/sharedwithme.php:7 ../../mod/invite.php:13
-#: ../../mod/invite.php:87 ../../mod/item.php:206 ../../mod/item.php:214
-#: ../../mod/item.php:1069 ../../mod/layouts.php:69 ../../mod/layouts.php:76
-#: ../../mod/layouts.php:87 ../../mod/like.php:177 ../../mod/locs.php:83
-#: ../../mod/sources.php:66 ../../mod/mail.php:126 ../../mod/suggest.php:26
-#: ../../mod/manage.php:6 ../../mod/menu.php:74 ../../mod/message.php:16
-#: ../../mod/thing.php:270 ../../mod/thing.php:290 ../../mod/thing.php:327
-#: ../../mod/viewconnections.php:22 ../../mod/viewconnections.php:27
-#: ../../mod/viewsrc.php:14 ../../index.php:174
+#: ../../Zotlabs/Web/Router.php:65 ../../Zotlabs/Module/Achievements.php:34
+#: ../../Zotlabs/Module/Api.php:13 ../../Zotlabs/Module/Api.php:18
+#: ../../Zotlabs/Module/Appman.php:70 ../../Zotlabs/Module/Authtest.php:16
+#: ../../Zotlabs/Module/Block.php:26 ../../Zotlabs/Module/Block.php:76
+#: ../../Zotlabs/Module/Blocks.php:73 ../../Zotlabs/Module/Blocks.php:80
+#: ../../Zotlabs/Module/Bookmarks.php:61 ../../Zotlabs/Module/Channel.php:104
+#: ../../Zotlabs/Module/Channel.php:224 ../../Zotlabs/Module/Channel.php:264
+#: ../../Zotlabs/Module/Chat.php:98 ../../Zotlabs/Module/Chat.php:103
+#: ../../Zotlabs/Module/Common.php:39 ../../Zotlabs/Module/Connections.php:33
+#: ../../Zotlabs/Module/Connedit.php:366
+#: ../../Zotlabs/Module/Cover_photo.php:277
+#: ../../Zotlabs/Module/Cover_photo.php:290
+#: ../../Zotlabs/Module/Editblock.php:69
+#: ../../Zotlabs/Module/Editlayout.php:67
+#: ../../Zotlabs/Module/Editlayout.php:91 ../../Zotlabs/Module/Editpost.php:17
+#: ../../Zotlabs/Module/Editwebpage.php:68
+#: ../../Zotlabs/Module/Editwebpage.php:90
+#: ../../Zotlabs/Module/Editwebpage.php:105
+#: ../../Zotlabs/Module/Editwebpage.php:129
+#: ../../Zotlabs/Module/Events.php:264 ../../Zotlabs/Module/Filestorage.php:22
+#: ../../Zotlabs/Module/Filestorage.php:77
+#: ../../Zotlabs/Module/Filestorage.php:92
+#: ../../Zotlabs/Module/Filestorage.php:119
+#: ../../Zotlabs/Module/Fsuggest.php:82 ../../Zotlabs/Module/Group.php:13
+#: ../../Zotlabs/Module/Id.php:76 ../../Zotlabs/Module/Invite.php:17
+#: ../../Zotlabs/Module/Invite.php:91 ../../Zotlabs/Module/Item.php:210
+#: ../../Zotlabs/Module/Item.php:218 ../../Zotlabs/Module/Item.php:1070
+#: ../../Zotlabs/Module/Layouts.php:73 ../../Zotlabs/Module/Layouts.php:80
+#: ../../Zotlabs/Module/Layouts.php:91 ../../Zotlabs/Module/Like.php:181
+#: ../../Zotlabs/Module/Locs.php:87 ../../Zotlabs/Module/Mail.php:130
+#: ../../Zotlabs/Module/Manage.php:10 ../../Zotlabs/Module/Menu.php:78
+#: ../../Zotlabs/Module/Message.php:20 ../../Zotlabs/Module/Mitem.php:115
+#: ../../Zotlabs/Module/Mood.php:116 ../../Zotlabs/Module/Network.php:16
+#: ../../Zotlabs/Module/New_channel.php:77
+#: ../../Zotlabs/Module/New_channel.php:104
+#: ../../Zotlabs/Module/Notifications.php:70 ../../Zotlabs/Module/Page.php:35
+#: ../../Zotlabs/Module/Page.php:90 ../../Zotlabs/Module/Pdledit.php:26
+#: ../../Zotlabs/Module/Photos.php:74 ../../Zotlabs/Module/Poke.php:137
+#: ../../Zotlabs/Module/Profile.php:68 ../../Zotlabs/Module/Profile.php:76
+#: ../../Zotlabs/Module/Profile_photo.php:256
+#: ../../Zotlabs/Module/Profile_photo.php:269
+#: ../../Zotlabs/Module/Profiles.php:202 ../../Zotlabs/Module/Profiles.php:600
+#: ../../Zotlabs/Module/Rate.php:115 ../../Zotlabs/Module/Register.php:77
+#: ../../Zotlabs/Module/Regmod.php:21
+#: ../../Zotlabs/Module/Service_limits.php:11
+#: ../../Zotlabs/Module/Settings.php:570 ../../Zotlabs/Module/Setup.php:238
+#: ../../Zotlabs/Module/Sharedwithme.php:11
+#: ../../Zotlabs/Module/Sources.php:70 ../../Zotlabs/Module/Suggest.php:30
+#: ../../Zotlabs/Module/Thing.php:274 ../../Zotlabs/Module/Thing.php:294
+#: ../../Zotlabs/Module/Thing.php:331
+#: ../../Zotlabs/Module/Viewconnections.php:26
+#: ../../Zotlabs/Module/Viewconnections.php:31
+#: ../../Zotlabs/Module/Viewsrc.php:18 ../../Zotlabs/Module/Webpages.php:73
+#: ../../include/chat.php:133 ../../include/attach.php:141
+#: ../../include/attach.php:189 ../../include/attach.php:252
+#: ../../include/attach.php:266 ../../include/attach.php:273
+#: ../../include/attach.php:338 ../../include/attach.php:352
+#: ../../include/attach.php:359 ../../include/attach.php:437
+#: ../../include/attach.php:895 ../../include/attach.php:966
+#: ../../include/attach.php:1118 ../../include/items.php:4671
+#: ../../include/photos.php:29 ../../index.php:174
msgid "Permission denied."
msgstr "Toegang geweigerd."
-#: ../../Zotlabs/Web/Router.php:105 ../../mod/help.php:231
+#: ../../Zotlabs/Web/Router.php:146 ../../Zotlabs/Module/Help.php:94
msgid "Not Found"
msgstr "Niet gevonden"
-#: ../../Zotlabs/Web/Router.php:108 ../../mod/page.php:89
-#: ../../mod/block.php:75 ../../mod/display.php:117 ../../mod/help.php:234
+#: ../../Zotlabs/Web/Router.php:149 ../../Zotlabs/Module/Block.php:79
+#: ../../Zotlabs/Module/Display.php:121 ../../Zotlabs/Module/Help.php:97
+#: ../../Zotlabs/Module/Page.php:93
msgid "Page not found."
msgstr "Pagina niet gevonden."
@@ -206,12 +236,6084 @@ msgid ""
" logout and retry."
msgstr "Authenticatie op afstand geblokkeerd. Je bent lokaal op deze hub ingelogd. Uitloggen en opnieuw proberen."
-#: ../../Zotlabs/Zot/Auth.php:248 ../../mod/openid.php:72
-#: ../../mod/openid.php:179
+#: ../../Zotlabs/Zot/Auth.php:248 ../../Zotlabs/Module/Openid.php:76
+#: ../../Zotlabs/Module/Openid.php:183
#, php-format
msgid "Welcome %s. Remote authentication successful."
msgstr "Welkom %s. Authenticatie op afstand geslaagd."
+#: ../../Zotlabs/Module/Achievements.php:15 ../../Zotlabs/Module/Blocks.php:33
+#: ../../Zotlabs/Module/Connect.php:17 ../../Zotlabs/Module/Editblock.php:33
+#: ../../Zotlabs/Module/Editlayout.php:31
+#: ../../Zotlabs/Module/Editwebpage.php:32
+#: ../../Zotlabs/Module/Filestorage.php:58 ../../Zotlabs/Module/Hcard.php:12
+#: ../../Zotlabs/Module/Layouts.php:33 ../../Zotlabs/Module/Profile.php:20
+#: ../../Zotlabs/Module/Webpages.php:33 ../../include/identity.php:830
+msgid "Requested profile is not available."
+msgstr "Opgevraagd profiel is niet beschikbaar"
+
+#: ../../Zotlabs/Module/Achievements.php:38
+msgid "Some blurb about what to do when you're new here"
+msgstr "Welkom op $Projectname. Klik op de tab ontdekken of klik rechtsboven op de <a href=\"directory\">kanalengids</a>, om kanalen te vinden. Rechtsboven vind je ook <a href=\"directory\">apps</a>, waar je vrijwel alle functies van $Projectname kunt vinden. Voor <a href=\"directory\">hulp</a> met $Projectname klik je op het vraagteken."
+
+#: ../../Zotlabs/Module/Acl.php:225
+msgid "network"
+msgstr "netwerk"
+
+#: ../../Zotlabs/Module/Acl.php:235
+msgid "RSS"
+msgstr "RSS"
+
+#: ../../Zotlabs/Module/Admin.php:58
+msgid "Theme settings updated."
+msgstr "Thema-instellingen bijgewerkt."
+
+#: ../../Zotlabs/Module/Admin.php:145 ../../Zotlabs/Module/Admin.php:1197
+#: ../../Zotlabs/Module/Admin.php:1442 ../../Zotlabs/Module/Display.php:44
+#: ../../Zotlabs/Module/Filestorage.php:31 ../../Zotlabs/Module/Thing.php:89
+#: ../../Zotlabs/Module/Viewsrc.php:24 ../../include/items.php:4592
+msgid "Item not found."
+msgstr "Item niet gevonden."
+
+#: ../../Zotlabs/Module/Admin.php:178
+msgid "# Accounts"
+msgstr "# accounts"
+
+#: ../../Zotlabs/Module/Admin.php:179
+msgid "# blocked accounts"
+msgstr "# geblokkeerde accounts"
+
+#: ../../Zotlabs/Module/Admin.php:180
+msgid "# expired accounts"
+msgstr "# verlopen accounts"
+
+#: ../../Zotlabs/Module/Admin.php:181
+msgid "# expiring accounts"
+msgstr "# accounts die nog moeten verlopen"
+
+#: ../../Zotlabs/Module/Admin.php:192
+msgid "# Channels"
+msgstr "# Kanalen"
+
+#: ../../Zotlabs/Module/Admin.php:193
+msgid "# primary"
+msgstr "# primair"
+
+#: ../../Zotlabs/Module/Admin.php:194
+msgid "# clones"
+msgstr "# klonen"
+
+#: ../../Zotlabs/Module/Admin.php:200
+msgid "Message queues"
+msgstr "Berichtenwachtrij"
+
+#: ../../Zotlabs/Module/Admin.php:216 ../../Zotlabs/Module/Admin.php:462
+#: ../../Zotlabs/Module/Admin.php:677 ../../Zotlabs/Module/Admin.php:717
+#: ../../Zotlabs/Module/Admin.php:992 ../../Zotlabs/Module/Admin.php:1156
+#: ../../Zotlabs/Module/Admin.php:1271 ../../Zotlabs/Module/Admin.php:1332
+#: ../../Zotlabs/Module/Admin.php:1493 ../../Zotlabs/Module/Admin.php:1527
+#: ../../Zotlabs/Module/Admin.php:1612
+msgid "Administration"
+msgstr "Beheer"
+
+#: ../../Zotlabs/Module/Admin.php:217
+msgid "Summary"
+msgstr "Samenvatting"
+
+#: ../../Zotlabs/Module/Admin.php:220
+msgid "Registered accounts"
+msgstr "Geregistreerde accounts"
+
+#: ../../Zotlabs/Module/Admin.php:221 ../../Zotlabs/Module/Admin.php:681
+msgid "Pending registrations"
+msgstr "Accounts die op goedkeuring wachten"
+
+#: ../../Zotlabs/Module/Admin.php:222
+msgid "Registered channels"
+msgstr "Geregistreerde kanalen"
+
+#: ../../Zotlabs/Module/Admin.php:223 ../../Zotlabs/Module/Admin.php:682
+msgid "Active plugins"
+msgstr "Ingeschakelde plugins"
+
+#: ../../Zotlabs/Module/Admin.php:224
+msgid "Version"
+msgstr "Versie"
+
+#: ../../Zotlabs/Module/Admin.php:345
+msgid "Site settings updated."
+msgstr "Hub-instellingen bijgewerkt."
+
+#: ../../Zotlabs/Module/Admin.php:372 ../../include/comanche.php:34
+msgid "Default"
+msgstr "Standaard"
+
+#: ../../Zotlabs/Module/Admin.php:382 ../../Zotlabs/Module/Settings.php:796
+msgid "mobile"
+msgstr "mobiel"
+
+#: ../../Zotlabs/Module/Admin.php:384
+msgid "experimental"
+msgstr "experimenteel"
+
+#: ../../Zotlabs/Module/Admin.php:386
+msgid "unsupported"
+msgstr "Niet ondersteund"
+
+#: ../../Zotlabs/Module/Admin.php:431 ../../Zotlabs/Module/Api.php:89
+#: ../../Zotlabs/Module/Connedit.php:379 ../../Zotlabs/Module/Connedit.php:657
+#: ../../Zotlabs/Module/Events.php:458 ../../Zotlabs/Module/Events.php:459
+#: ../../Zotlabs/Module/Events.php:468
+#: ../../Zotlabs/Module/Filestorage.php:155
+#: ../../Zotlabs/Module/Filestorage.php:163 ../../Zotlabs/Module/Menu.php:100
+#: ../../Zotlabs/Module/Menu.php:157 ../../Zotlabs/Module/Mitem.php:158
+#: ../../Zotlabs/Module/Mitem.php:159 ../../Zotlabs/Module/Mitem.php:232
+#: ../../Zotlabs/Module/Mitem.php:233 ../../Zotlabs/Module/Photos.php:665
+#: ../../Zotlabs/Module/Profiles.php:651 ../../Zotlabs/Module/Removeme.php:64
+#: ../../Zotlabs/Module/Settings.php:579 ../../include/dir_fns.php:141
+#: ../../include/dir_fns.php:142 ../../include/dir_fns.php:143
+#: ../../view/theme/redbasic/php/config.php:105
+#: ../../view/theme/redbasic/php/config.php:130 ../../boot.php:1606
+msgid "No"
+msgstr "Nee"
+
+#: ../../Zotlabs/Module/Admin.php:432
+msgid "Yes - with approval"
+msgstr "Ja - met goedkeuring"
+
+#: ../../Zotlabs/Module/Admin.php:433 ../../Zotlabs/Module/Api.php:88
+#: ../../Zotlabs/Module/Connedit.php:379 ../../Zotlabs/Module/Events.php:458
+#: ../../Zotlabs/Module/Events.php:459 ../../Zotlabs/Module/Events.php:468
+#: ../../Zotlabs/Module/Filestorage.php:155
+#: ../../Zotlabs/Module/Filestorage.php:163 ../../Zotlabs/Module/Menu.php:100
+#: ../../Zotlabs/Module/Menu.php:157 ../../Zotlabs/Module/Mitem.php:158
+#: ../../Zotlabs/Module/Mitem.php:159 ../../Zotlabs/Module/Mitem.php:232
+#: ../../Zotlabs/Module/Mitem.php:233 ../../Zotlabs/Module/Photos.php:665
+#: ../../Zotlabs/Module/Profiles.php:651 ../../Zotlabs/Module/Removeme.php:64
+#: ../../Zotlabs/Module/Settings.php:579 ../../include/dir_fns.php:141
+#: ../../include/dir_fns.php:142 ../../include/dir_fns.php:143
+#: ../../view/theme/redbasic/php/config.php:105
+#: ../../view/theme/redbasic/php/config.php:130 ../../boot.php:1606
+msgid "Yes"
+msgstr "Ja"
+
+#: ../../Zotlabs/Module/Admin.php:438
+msgid "My site is not a public server"
+msgstr "Mijn $Projectname-hub is niet openbaar"
+
+#: ../../Zotlabs/Module/Admin.php:439
+msgid "My site has paid access only"
+msgstr "Mijn $Projectname-hub kent alleen betaalde toegang"
+
+#: ../../Zotlabs/Module/Admin.php:440
+msgid "My site has free access only"
+msgstr "Mijn $Projectname-hub kent alleen gratis toegang"
+
+#: ../../Zotlabs/Module/Admin.php:441
+msgid "My site offers free accounts with optional paid upgrades"
+msgstr "Mijn $Projectname-hub biedt gratis accounts aan met betaalde uitbreidingen als optie"
+
+#: ../../Zotlabs/Module/Admin.php:463 ../../include/widgets.php:1334
+msgid "Site"
+msgstr "Hub-instellingen"
+
+#: ../../Zotlabs/Module/Admin.php:464 ../../Zotlabs/Module/Admin.php:654
+#: ../../Zotlabs/Module/Admin.php:729 ../../Zotlabs/Module/Admin.php:994
+#: ../../Zotlabs/Module/Admin.php:1158 ../../Zotlabs/Module/Admin.php:1334
+#: ../../Zotlabs/Module/Admin.php:1529 ../../Zotlabs/Module/Admin.php:1614
+#: ../../Zotlabs/Module/Admin.php:1778 ../../Zotlabs/Module/Appman.php:103
+#: ../../Zotlabs/Module/Cal.php:341 ../../Zotlabs/Module/Chat.php:194
+#: ../../Zotlabs/Module/Chat.php:236 ../../Zotlabs/Module/Connect.php:97
+#: ../../Zotlabs/Module/Connedit.php:733 ../../Zotlabs/Module/Events.php:472
+#: ../../Zotlabs/Module/Events.php:669
+#: ../../Zotlabs/Module/Filestorage.php:160
+#: ../../Zotlabs/Module/Fsuggest.php:112 ../../Zotlabs/Module/Group.php:85
+#: ../../Zotlabs/Module/Import.php:546
+#: ../../Zotlabs/Module/Import_items.php:120
+#: ../../Zotlabs/Module/Invite.php:146 ../../Zotlabs/Module/Locs.php:121
+#: ../../Zotlabs/Module/Mail.php:384 ../../Zotlabs/Module/Mitem.php:235
+#: ../../Zotlabs/Module/Mood.php:139 ../../Zotlabs/Module/Pconfig.php:107
+#: ../../Zotlabs/Module/Pdledit.php:66 ../../Zotlabs/Module/Photos.php:676
+#: ../../Zotlabs/Module/Photos.php:1051 ../../Zotlabs/Module/Photos.php:1091
+#: ../../Zotlabs/Module/Photos.php:1209 ../../Zotlabs/Module/Poke.php:186
+#: ../../Zotlabs/Module/Profiles.php:691 ../../Zotlabs/Module/Rate.php:172
+#: ../../Zotlabs/Module/Settings.php:588 ../../Zotlabs/Module/Settings.php:701
+#: ../../Zotlabs/Module/Settings.php:729 ../../Zotlabs/Module/Settings.php:752
+#: ../../Zotlabs/Module/Settings.php:840
+#: ../../Zotlabs/Module/Settings.php:1032 ../../Zotlabs/Module/Setup.php:335
+#: ../../Zotlabs/Module/Setup.php:376 ../../Zotlabs/Module/Sources.php:108
+#: ../../Zotlabs/Module/Sources.php:142 ../../Zotlabs/Module/Thing.php:316
+#: ../../Zotlabs/Module/Thing.php:362 ../../Zotlabs/Module/Xchan.php:15
+#: ../../include/ItemObject.php:703 ../../include/widgets.php:708
+#: ../../include/widgets.php:720 ../../include/js_strings.php:22
+#: ../../view/theme/redbasic/php/config.php:99
+msgid "Submit"
+msgstr "Opslaan"
+
+#: ../../Zotlabs/Module/Admin.php:465 ../../Zotlabs/Module/Register.php:245
+msgid "Registration"
+msgstr "Registratie"
+
+#: ../../Zotlabs/Module/Admin.php:466
+msgid "File upload"
+msgstr "Bestand uploaden"
+
+#: ../../Zotlabs/Module/Admin.php:467
+msgid "Policies"
+msgstr "Beleid"
+
+#: ../../Zotlabs/Module/Admin.php:468 ../../include/contact_widgets.php:19
+msgid "Advanced"
+msgstr "Geavanceerd"
+
+#: ../../Zotlabs/Module/Admin.php:472
+msgid "Site name"
+msgstr "Naam van deze $Projectname-hub"
+
+#: ../../Zotlabs/Module/Admin.php:473
+msgid "Banner/Logo"
+msgstr "Banner/logo"
+
+#: ../../Zotlabs/Module/Admin.php:474
+msgid "Administrator Information"
+msgstr "Informatie over de beheerder van deze hub"
+
+#: ../../Zotlabs/Module/Admin.php:474
+msgid ""
+"Contact information for site administrators. Displayed on siteinfo page. "
+"BBCode can be used here"
+msgstr "Contactinformatie voor hub-beheerders. Getoond op pagina met hub-informatie. Er kan hier bbcode gebruikt worden."
+
+#: ../../Zotlabs/Module/Admin.php:475
+msgid "System language"
+msgstr "Standaardtaal"
+
+#: ../../Zotlabs/Module/Admin.php:476
+msgid "System theme"
+msgstr "Standaardthema"
+
+#: ../../Zotlabs/Module/Admin.php:476
+msgid ""
+"Default system theme - may be over-ridden by user profiles - <a href='#' "
+"id='cnftheme'>change theme settings</a>"
+msgstr "Standaardthema voor $Projectname-hub (kan door lid veranderd worden) - <a href='#' id='cnftheme'>verander thema-instellingen</a>"
+
+#: ../../Zotlabs/Module/Admin.php:477
+msgid "Mobile system theme"
+msgstr "Standaardthema voor mobiel"
+
+#: ../../Zotlabs/Module/Admin.php:477
+msgid "Theme for mobile devices"
+msgstr "Thema voor mobiele apparaten"
+
+#: ../../Zotlabs/Module/Admin.php:479
+msgid "Allow Feeds as Connections"
+msgstr "Sta feeds toe als connecties"
+
+#: ../../Zotlabs/Module/Admin.php:479
+msgid "(Heavy system resource usage)"
+msgstr "(sterk negatieve invloed op systeembronnen hub)"
+
+#: ../../Zotlabs/Module/Admin.php:480
+msgid "Maximum image size"
+msgstr "Maximale grootte van afbeeldingen"
+
+#: ../../Zotlabs/Module/Admin.php:480
+msgid ""
+"Maximum size in bytes of uploaded images. Default is 0, which means no "
+"limits."
+msgstr "Maximale grootte in bytes voor afbeeldingen die worden geüpload. Standaard is 0, wat geen limiet betekend."
+
+#: ../../Zotlabs/Module/Admin.php:481
+msgid "Does this site allow new member registration?"
+msgstr "Staat deze hub nieuwe accounts toe?"
+
+#: ../../Zotlabs/Module/Admin.php:482
+msgid "Invitation only"
+msgstr "Alleen op uitnodiging"
+
+#: ../../Zotlabs/Module/Admin.php:482
+msgid ""
+"Only allow new member registrations with an invitation code. Above register "
+"policy must be set to Yes."
+msgstr "Sta alleen nieuwe registraties toe van mensen die een uitnodigingscode hebben. Bovenstaand accountbeleid moet op Ja staan."
+
+#: ../../Zotlabs/Module/Admin.php:483
+msgid "Which best describes the types of account offered by this hub?"
+msgstr "Wat voor soort accounts biedt deze $Projectname-hub aan? Kies wat het meest in de buurt komt."
+
+#: ../../Zotlabs/Module/Admin.php:484
+msgid "Register text"
+msgstr "Tekst tijdens registratie"
+
+#: ../../Zotlabs/Module/Admin.php:484
+msgid "Will be displayed prominently on the registration page."
+msgstr "Tekst dat op de pagina voor het registreren van nieuwe accounts wordt getoond."
+
+#: ../../Zotlabs/Module/Admin.php:485
+msgid "Site homepage to show visitors (default: login box)"
+msgstr "Homepagina van deze hub die aan bezoekers wordt getoond (standaard: inlogformulier)"
+
+#: ../../Zotlabs/Module/Admin.php:485
+msgid ""
+"example: 'public' to show public stream, 'page/sys/home' to show a system "
+"webpage called 'home' or 'include:home.html' to include a file."
+msgstr "voorbeeld: 'public' om de openbare stream te tonen, 'page/sys/home' om de webpagina 'home' van het systeemkanaal te tonen of 'include:home.html' om een gewoon bestand te gebruiken."
+
+#: ../../Zotlabs/Module/Admin.php:486
+msgid "Preserve site homepage URL"
+msgstr "Behoudt de URL van de hub (/)"
+
+#: ../../Zotlabs/Module/Admin.php:486
+msgid ""
+"Present the site homepage in a frame at the original location instead of "
+"redirecting"
+msgstr "Toon de homepagina van de hub in een frame op de oorspronkelijke locatie (/), i.p.v. een doorverwijzing naar een andere locatie (bv. .../home.html)"
+
+#: ../../Zotlabs/Module/Admin.php:487
+msgid "Accounts abandoned after x days"
+msgstr "Accounts als verlaten beschouwen na zoveel aantal dagen:"
+
+#: ../../Zotlabs/Module/Admin.php:487
+msgid ""
+"Will not waste system resources polling external sites for abandonded "
+"accounts. Enter 0 for no time limit."
+msgstr "Zal geen systeembronnen verspillen door polling van externe hubs voor verlaten accounts. Vul 0 in voor geen tijdslimiet."
+
+#: ../../Zotlabs/Module/Admin.php:488
+msgid "Allowed friend domains"
+msgstr "Toegestane domeinen"
+
+#: ../../Zotlabs/Module/Admin.php:488
+msgid ""
+"Comma separated list of domains which are allowed to establish friendships "
+"with this site. Wildcards are accepted. Empty to allow any domains"
+msgstr "Komma-gescheiden lijst van domeinen waarvan kanalen connecties kunnen aangaan met kanalen op deze $Projectname-hub. Wildcards zijn toegestaan.\nLaat leeg om alle domeinen toe te laten."
+
+#: ../../Zotlabs/Module/Admin.php:489
+msgid "Allowed email domains"
+msgstr "Toegestane e-maildomeinen"
+
+#: ../../Zotlabs/Module/Admin.php:489
+msgid ""
+"Comma separated list of domains which are allowed in email addresses for "
+"registrations to this site. Wildcards are accepted. Empty to allow any "
+"domains"
+msgstr "Door komma's gescheiden lijst met e-maildomeinen waarvan e-mailadressen op deze hub mogen registeren. Wildcards zijn toegestaan. Laat leeg om alle domeinen toe te laten."
+
+#: ../../Zotlabs/Module/Admin.php:490
+msgid "Not allowed email domains"
+msgstr "Niet toegestane e-maildomeinen"
+
+#: ../../Zotlabs/Module/Admin.php:490
+msgid ""
+"Comma separated list of domains which are not allowed in email addresses for"
+" registrations to this site. Wildcards are accepted. Empty to allow any "
+"domains, unless allowed domains have been defined."
+msgstr "Door komma's gescheiden lijst met e-maildomeinen waarvan e-mailadressen niet op deze hub mogen registeren. Wildcards zijn toegestaan. Laat leeg om alle domeinen toe te staan, tenzij er toegestane domeinen zijn ingesteld. "
+
+#: ../../Zotlabs/Module/Admin.php:491
+msgid "Verify Email Addresses"
+msgstr "E-mailadres verifieren"
+
+#: ../../Zotlabs/Module/Admin.php:491
+msgid ""
+"Check to verify email addresses used in account registration (recommended)."
+msgstr "Inschakelen om e-mailadressen te verifiëren die tijdens de accountregistratie worden gebruikt (aanbevolen)."
+
+#: ../../Zotlabs/Module/Admin.php:492
+msgid "Force publish"
+msgstr "Dwing kanaalvermelding af"
+
+#: ../../Zotlabs/Module/Admin.php:492
+msgid ""
+"Check to force all profiles on this site to be listed in the site directory."
+msgstr "Vink dit aan om af te dwingen dat alle kanalen op deze hub in de kanalengids worden vermeld."
+
+#: ../../Zotlabs/Module/Admin.php:493
+msgid "Import Public Streams"
+msgstr "Openbare streams importeren"
+
+#: ../../Zotlabs/Module/Admin.php:493
+msgid ""
+"Import and allow access to public content pulled from other sites. Warning: "
+"this content is unmoderated."
+msgstr "Toegang verlenen tot openbare berichten die vanuit andere hubs worden geïmporteerd. Waarschuwing: de inhoud van deze berichten wordt niet gemodereerd."
+
+#: ../../Zotlabs/Module/Admin.php:494
+msgid "Login on Homepage"
+msgstr "Inlogformulier op de homepagina"
+
+#: ../../Zotlabs/Module/Admin.php:494
+msgid ""
+"Present a login box to visitors on the home page if no other content has "
+"been configured."
+msgstr "Toon een inlogformulier voor bezoekers op de homepagina wanneer geen andere inhoud is geconfigureerd. "
+
+#: ../../Zotlabs/Module/Admin.php:495
+msgid "Enable context help"
+msgstr "Schakel contextuele hulp in"
+
+#: ../../Zotlabs/Module/Admin.php:495
+msgid ""
+"Display contextual help for the current page when the help button is "
+"pressed."
+msgstr "Toon hulp en documentatie voor de op dat moment getoonde pagina, wanneer op de hulp-knop wordt geklikt."
+
+#: ../../Zotlabs/Module/Admin.php:497
+msgid "Directory Server URL"
+msgstr "Server-URL voor de kanalengids"
+
+#: ../../Zotlabs/Module/Admin.php:497
+msgid "Default directory server"
+msgstr "Standaardserver voor de kanalengids"
+
+#: ../../Zotlabs/Module/Admin.php:499
+msgid "Proxy user"
+msgstr "Gebruikersnaam proxy"
+
+#: ../../Zotlabs/Module/Admin.php:500
+msgid "Proxy URL"
+msgstr "Proxy-URL"
+
+#: ../../Zotlabs/Module/Admin.php:501
+msgid "Network timeout"
+msgstr "Netwerktimeout"
+
+#: ../../Zotlabs/Module/Admin.php:501
+msgid "Value is in seconds. Set to 0 for unlimited (not recommended)."
+msgstr "Waarde is in seconden. Zet op 0 voor onbeperkt (niet aanbevolen)"
+
+#: ../../Zotlabs/Module/Admin.php:502
+msgid "Delivery interval"
+msgstr "Afleveringsinterval"
+
+#: ../../Zotlabs/Module/Admin.php:502
+msgid ""
+"Delay background delivery processes by this many seconds to reduce system "
+"load. Recommend: 4-5 for shared hosts, 2-3 for virtual private servers. 0-1 "
+"for large dedicated servers."
+msgstr "Vertraag de achtergrondprocessen voor het afleveren met een aantal seconden om de systeembelasting te verminderen. Aanbevolen: 4-5 voor shared hosts, 2-3 voor virtual private servers (VPS) en 0-1 voor grote dedicated servers."
+
+#: ../../Zotlabs/Module/Admin.php:503
+msgid "Deliveries per process"
+msgstr "Leveringen per serverproces"
+
+#: ../../Zotlabs/Module/Admin.php:503
+msgid ""
+"Number of deliveries to attempt in a single operating system process. Adjust"
+" if necessary to tune system performance. Recommend: 1-5."
+msgstr "Aantal leveringen die aan één serverproces worden meegegeven. Pas dit aan wanneer het nodig is om systeemprestaties te verbeteren. Aangeraden: 1-5"
+
+#: ../../Zotlabs/Module/Admin.php:504
+msgid "Poll interval"
+msgstr "Poll-interval"
+
+#: ../../Zotlabs/Module/Admin.php:504
+msgid ""
+"Delay background polling processes by this many seconds to reduce system "
+"load. If 0, use delivery interval."
+msgstr "De achtergrondprocessen voor het afleveren met zoveel seconden vertragen om de systeembelasting te verminderen. 0 om de afleveringsinterval te gebruiken."
+
+#: ../../Zotlabs/Module/Admin.php:505
+msgid "Maximum Load Average"
+msgstr "Maximaal gemiddelde systeembelasting"
+
+#: ../../Zotlabs/Module/Admin.php:505
+msgid ""
+"Maximum system load before delivery and poll processes are deferred - "
+"default 50."
+msgstr "Maximale systeembelasting voordat de afleverings- en polllingsprocessen worden uitgesteld. Standaard is 50."
+
+#: ../../Zotlabs/Module/Admin.php:506
+msgid "Expiration period in days for imported (grid/network) content"
+msgstr "Aantal dagen waarna geïmporteerde inhoud uit iemands grid/netwerk-pagina wordt verwijderd."
+
+#: ../../Zotlabs/Module/Admin.php:506
+msgid "0 for no expiration of imported content"
+msgstr "Dit geldt alleen voor inhoud van andere kanalen, dus niet voor iemands eigen kanaal. 0 voor het niet verwijderen van geïmporteerde inhoud."
+
+#: ../../Zotlabs/Module/Admin.php:643 ../../Zotlabs/Module/Admin.php:644
+#: ../../Zotlabs/Module/Settings.php:720
+msgid "Off"
+msgstr "Uit"
+
+#: ../../Zotlabs/Module/Admin.php:643 ../../Zotlabs/Module/Admin.php:644
+#: ../../Zotlabs/Module/Settings.php:720
+msgid "On"
+msgstr "Aan"
+
+#: ../../Zotlabs/Module/Admin.php:644
+#, php-format
+msgid "Lock feature %s"
+msgstr " Vergrendel de functie '%s'"
+
+#: ../../Zotlabs/Module/Admin.php:652
+msgid "Manage Additional Features"
+msgstr "Beheer - Extra functies"
+
+#: ../../Zotlabs/Module/Admin.php:669
+msgid "No server found"
+msgstr "Geen hub gevonden"
+
+#: ../../Zotlabs/Module/Admin.php:676 ../../Zotlabs/Module/Admin.php:1006
+msgid "ID"
+msgstr "ID"
+
+#: ../../Zotlabs/Module/Admin.php:676
+msgid "for channel"
+msgstr "voor kanaal"
+
+#: ../../Zotlabs/Module/Admin.php:676
+msgid "on server"
+msgstr "op hub"
+
+#: ../../Zotlabs/Module/Admin.php:676 ../../Zotlabs/Module/Connections.php:270
+msgid "Status"
+msgstr "Status"
+
+#: ../../Zotlabs/Module/Admin.php:678
+msgid "Server"
+msgstr "Hubbeheer"
+
+#: ../../Zotlabs/Module/Admin.php:718 ../../include/widgets.php:1337
+msgid "Security"
+msgstr "Beveiliging"
+
+#: ../../Zotlabs/Module/Admin.php:720
+msgid "Block public"
+msgstr "Openbare toegang blokkeren"
+
+#: ../../Zotlabs/Module/Admin.php:720
+msgid ""
+"Check to block public access to all otherwise public personal pages on this "
+"site unless you are currently authenticated."
+msgstr "Vink dit aan om alle normaliter openbare persoonlijke pagina's op deze hub alleen toegankelijk te maken voor leden die zich hebben geauthenticeerd."
+
+#: ../../Zotlabs/Module/Admin.php:721
+msgid "Allow communications only from these sites"
+msgstr "Alleen communicatie met deze hubs toestaan"
+
+#: ../../Zotlabs/Module/Admin.php:721
+msgid ""
+"One site per line. Leave empty to allow communication from anywhere by "
+"default"
+msgstr "Eén hub per regel. Laat leeg om communicatie standaard met alle hubs toe te staan"
+
+#: ../../Zotlabs/Module/Admin.php:722
+msgid "Block communications from these sites"
+msgstr "Communicatie met deze hubs blokkeren"
+
+#: ../../Zotlabs/Module/Admin.php:723
+msgid "Allow communications only from these channels"
+msgstr "Sta alleen communicatie toe met deze kanalen"
+
+#: ../../Zotlabs/Module/Admin.php:723
+msgid ""
+"One channel (hash) per line. Leave empty to allow from any channel by "
+"default"
+msgstr "Eén kanaal (hash) per regel. Laat leeg om communicatie standaard met alle kanalen toe te staan"
+
+#: ../../Zotlabs/Module/Admin.php:724
+msgid "Block communications from these channels"
+msgstr "Communicatie met deze kanalen blokkeren"
+
+#: ../../Zotlabs/Module/Admin.php:725
+msgid "Allow embedded HTML content only from these domains"
+msgstr "Alleen ingesloten (embedded) HTML vanaf deze domeinen toestaan"
+
+#: ../../Zotlabs/Module/Admin.php:725
+msgid "One site per line. Leave empty to allow from any site by default"
+msgstr "Eén per regel. Laat leeg om standaard vanaf elk domein toe te staan"
+
+#: ../../Zotlabs/Module/Admin.php:726
+msgid "Block embedded HTML from these domains"
+msgstr "Ingesloten (embedded) HTML vanaf deze domeinen blokkeren"
+
+#: ../../Zotlabs/Module/Admin.php:728
+msgid "Cooperative embed security"
+msgstr "Met elkaar ingesloten (embedded) HTML beveiligen"
+
+#: ../../Zotlabs/Module/Admin.php:728
+msgid "Enable to share embed security with other compatible sites/hubs"
+msgstr "Beveiliging omtrent ingesloten (embedded) HTML met andere compatibele hubs delen."
+
+#: ../../Zotlabs/Module/Admin.php:743
+msgid "Update has been marked successful"
+msgstr "Update is als succesvol gemarkeerd"
+
+#: ../../Zotlabs/Module/Admin.php:753
+#, php-format
+msgid "Executing %s failed. Check system logs."
+msgstr "Uitvoeren van %s is mislukt. Controleer systeemlogboek."
+
+#: ../../Zotlabs/Module/Admin.php:756
+#, php-format
+msgid "Update %s was successfully applied."
+msgstr "Update %s was geslaagd."
+
+#: ../../Zotlabs/Module/Admin.php:760
+#, php-format
+msgid "Update %s did not return a status. Unknown if it succeeded."
+msgstr "Update %s gaf geen melding. Het is daarom niet bekend of deze geslaagd is."
+
+#: ../../Zotlabs/Module/Admin.php:763
+#, php-format
+msgid "Update function %s could not be found."
+msgstr "Update-functie %s kon niet gevonden worden."
+
+#: ../../Zotlabs/Module/Admin.php:779
+msgid "No failed updates."
+msgstr "Geen mislukte updates."
+
+#: ../../Zotlabs/Module/Admin.php:783
+msgid "Failed Updates"
+msgstr "Mislukte updates"
+
+#: ../../Zotlabs/Module/Admin.php:785
+msgid "Mark success (if update was manually applied)"
+msgstr "Markeer als geslaagd (wanneer de update handmatig was uitgevoerd)"
+
+#: ../../Zotlabs/Module/Admin.php:786
+msgid "Attempt to execute this update step automatically"
+msgstr "Poging om deze stap van de update automatisch uit te voeren."
+
+#: ../../Zotlabs/Module/Admin.php:817
+msgid "Queue Statistics"
+msgstr "Wachtrij-statistieken"
+
+#: ../../Zotlabs/Module/Admin.php:818
+msgid "Total Entries"
+msgstr "Aantal vermeldingen"
+
+#: ../../Zotlabs/Module/Admin.php:819
+msgid "Priority"
+msgstr "Prioriteit"
+
+#: ../../Zotlabs/Module/Admin.php:820
+msgid "Destination URL"
+msgstr "Doel-URL"
+
+#: ../../Zotlabs/Module/Admin.php:821
+msgid "Mark hub permanently offline"
+msgstr "Hub als permanent offline markeren"
+
+#: ../../Zotlabs/Module/Admin.php:822
+msgid "Empty queue for this hub"
+msgstr "Berichtenwachtrij voor deze hub legen"
+
+#: ../../Zotlabs/Module/Admin.php:823
+msgid "Last known contact"
+msgstr "Voor het laatst contact"
+
+#: ../../Zotlabs/Module/Admin.php:859
+#, php-format
+msgid "%s account blocked/unblocked"
+msgid_plural "%s account blocked/unblocked"
+msgstr[0] "%s account geblokkeerd/gedeblokkeerd"
+msgstr[1] "%s accounts geblokkeerd/gedeblokkeerd"
+
+#: ../../Zotlabs/Module/Admin.php:867
+#, php-format
+msgid "%s account deleted"
+msgid_plural "%s accounts deleted"
+msgstr[0] "%s account verwijderd"
+msgstr[1] "%s accounts verwijderd"
+
+#: ../../Zotlabs/Module/Admin.php:903
+msgid "Account not found"
+msgstr "Account niet gevonden"
+
+#: ../../Zotlabs/Module/Admin.php:915
+#, php-format
+msgid "Account '%s' deleted"
+msgstr "Account '%s' verwijderd"
+
+#: ../../Zotlabs/Module/Admin.php:923
+#, php-format
+msgid "Account '%s' blocked"
+msgstr "Account '%s' geblokkeerd"
+
+#: ../../Zotlabs/Module/Admin.php:931
+#, php-format
+msgid "Account '%s' unblocked"
+msgstr "Account '%s' gedeblokkeerd"
+
+#: ../../Zotlabs/Module/Admin.php:993 ../../Zotlabs/Module/Admin.php:1005
+msgid "Users"
+msgstr "Accounts"
+
+#: ../../Zotlabs/Module/Admin.php:995 ../../Zotlabs/Module/Admin.php:1159
+msgid "select all"
+msgstr "alles selecteren"
+
+#: ../../Zotlabs/Module/Admin.php:996
+msgid "User registrations waiting for confirm"
+msgstr "Accounts die op goedkeuring wachten"
+
+#: ../../Zotlabs/Module/Admin.php:997
+msgid "Request date"
+msgstr "Tijd/datum verzoek"
+
+#: ../../Zotlabs/Module/Admin.php:997 ../../Zotlabs/Module/Admin.php:1006
+#: ../../Zotlabs/Module/Id.php:17 ../../Zotlabs/Module/Id.php:18
+#: ../../include/contact_selectors.php:81 ../../boot.php:1604
+msgid "Email"
+msgstr "E-mail"
+
+#: ../../Zotlabs/Module/Admin.php:998
+msgid "No registrations."
+msgstr "Geen verzoeken."
+
+#: ../../Zotlabs/Module/Admin.php:999 ../../Zotlabs/Module/Connections.php:275
+msgid "Approve"
+msgstr "Goedkeuren"
+
+#: ../../Zotlabs/Module/Admin.php:1000
+msgid "Deny"
+msgstr "Afkeuren"
+
+#: ../../Zotlabs/Module/Admin.php:1002 ../../Zotlabs/Module/Connedit.php:541
+msgid "Block"
+msgstr "Blokkeren"
+
+#: ../../Zotlabs/Module/Admin.php:1003 ../../Zotlabs/Module/Connedit.php:541
+msgid "Unblock"
+msgstr "Deblokkeren"
+
+#: ../../Zotlabs/Module/Admin.php:1006 ../../include/group.php:267
+msgid "All Channels"
+msgstr "Alle kanalen"
+
+#: ../../Zotlabs/Module/Admin.php:1006
+msgid "Register date"
+msgstr "Geregistreerd"
+
+#: ../../Zotlabs/Module/Admin.php:1006
+msgid "Last login"
+msgstr "Laatste keer ingelogd"
+
+#: ../../Zotlabs/Module/Admin.php:1006
+msgid "Expires"
+msgstr "Verloopt"
+
+#: ../../Zotlabs/Module/Admin.php:1006
+msgid "Service Class"
+msgstr "Abonnementen"
+
+#: ../../Zotlabs/Module/Admin.php:1008
+msgid ""
+"Selected accounts will be deleted!\\n\\nEverything these accounts had posted"
+" on this site will be permanently deleted!\\n\\nAre you sure?"
+msgstr "Geselecteerde accounts (met bijbehorende kanalen) worden verwijderd!\\n\\nAlles wat deze accounts op deze hub hebben gepubliceerd wordt definitief verwijderd!\\n\\Weet je het zeker?"
+
+#: ../../Zotlabs/Module/Admin.php:1009
+msgid ""
+"The account {0} will be deleted!\\n\\nEverything this account has posted on "
+"this site will be permanently deleted!\\n\\nAre you sure?"
+msgstr "Account {0} (met bijbehorende kanalen) wordt verwijderd !\\n\\nAlles wat dit account op deze hub heeft gepubliceerd wordt definitief verwijderd!\\n\\nWeet je het zeker?"
+
+#: ../../Zotlabs/Module/Admin.php:1045
+#, php-format
+msgid "%s channel censored/uncensored"
+msgid_plural "%s channels censored/uncensored"
+msgstr[0] "%s kanaal gecensureerd/ongecensureerd"
+msgstr[1] "%s kanalen gecensureerd/ongecensureerd"
+
+#: ../../Zotlabs/Module/Admin.php:1054
+#, php-format
+msgid "%s channel code allowed/disallowed"
+msgid_plural "%s channels code allowed/disallowed"
+msgstr[0] "Scripts toegestaan/niet toegestaan voor %s kanaal"
+msgstr[1] "Scripts toegestaan/niet toegestaan voor %s kanalen"
+
+#: ../../Zotlabs/Module/Admin.php:1061
+#, php-format
+msgid "%s channel deleted"
+msgid_plural "%s channels deleted"
+msgstr[0] "%s kanaal verwijderd"
+msgstr[1] "%s kanalen verwijderd"
+
+#: ../../Zotlabs/Module/Admin.php:1081
+msgid "Channel not found"
+msgstr "Kanaal niet gevonden"
+
+#: ../../Zotlabs/Module/Admin.php:1092
+#, php-format
+msgid "Channel '%s' deleted"
+msgstr "Kanaal '%s' verwijderd"
+
+#: ../../Zotlabs/Module/Admin.php:1104
+#, php-format
+msgid "Channel '%s' censored"
+msgstr "Kanaal '%s' gecensureerd"
+
+#: ../../Zotlabs/Module/Admin.php:1104
+#, php-format
+msgid "Channel '%s' uncensored"
+msgstr "Kanaal '%s' ongecensureerd"
+
+#: ../../Zotlabs/Module/Admin.php:1115
+#, php-format
+msgid "Channel '%s' code allowed"
+msgstr "Scripts toegestaan voor kanaal '%s'"
+
+#: ../../Zotlabs/Module/Admin.php:1115
+#, php-format
+msgid "Channel '%s' code disallowed"
+msgstr "Scripts niet toegestaan voor kanaal '%s'"
+
+#: ../../Zotlabs/Module/Admin.php:1157 ../../include/widgets.php:1336
+msgid "Channels"
+msgstr "Kanalen"
+
+#: ../../Zotlabs/Module/Admin.php:1161
+msgid "Censor"
+msgstr "Censureren"
+
+#: ../../Zotlabs/Module/Admin.php:1162
+msgid "Uncensor"
+msgstr "Niet censureren"
+
+#: ../../Zotlabs/Module/Admin.php:1163
+msgid "Allow Code"
+msgstr "Scripts toestaan"
+
+#: ../../Zotlabs/Module/Admin.php:1164
+msgid "Disallow Code"
+msgstr "Scripts niet toestaan"
+
+#: ../../Zotlabs/Module/Admin.php:1165 ../../include/conversation.php:1629
+msgid "Channel"
+msgstr "Kanaal"
+
+#: ../../Zotlabs/Module/Admin.php:1166
+msgid "UID"
+msgstr "UID"
+
+#: ../../Zotlabs/Module/Admin.php:1166 ../../Zotlabs/Module/Locs.php:118
+#: ../../Zotlabs/Module/Profiles.php:469
+msgid "Address"
+msgstr "Kanaaladres"
+
+#: ../../Zotlabs/Module/Admin.php:1168
+msgid ""
+"Selected channels will be deleted!\\n\\nEverything that was posted in these "
+"channels on this site will be permanently deleted!\\n\\nAre you sure?"
+msgstr "Geselecteerde kanalen worden verwijderd!\\n\\nAlles wat in deze kanalen op deze hub werd gepubliceerd wordt definitief verwijderd!\\n\\nWeet je het zeker?"
+
+#: ../../Zotlabs/Module/Admin.php:1169
+msgid ""
+"The channel {0} will be deleted!\\n\\nEverything that was posted in this "
+"channel on this site will be permanently deleted!\\n\\nAre you sure?"
+msgstr "Kanaal {0} wordt verwijderd!\\n\\nAlles wat in dit kanaal op deze hub werd gepubliceerd wordt definitief verwijderd!\\n\\nWeet je het zeker?"
+
+#: ../../Zotlabs/Module/Admin.php:1226
+#, php-format
+msgid "Plugin %s disabled."
+msgstr "Plugin %s uitgeschakeld."
+
+#: ../../Zotlabs/Module/Admin.php:1230
+#, php-format
+msgid "Plugin %s enabled."
+msgstr "Plugin %s ingeschakeld"
+
+#: ../../Zotlabs/Module/Admin.php:1240 ../../Zotlabs/Module/Admin.php:1466
+msgid "Disable"
+msgstr "Uitschakelen"
+
+#: ../../Zotlabs/Module/Admin.php:1243 ../../Zotlabs/Module/Admin.php:1468
+msgid "Enable"
+msgstr "Inschakelen"
+
+#: ../../Zotlabs/Module/Admin.php:1272 ../../Zotlabs/Module/Admin.php:1333
+#: ../../include/widgets.php:1339
+msgid "Plugins"
+msgstr "Plugins"
+
+#: ../../Zotlabs/Module/Admin.php:1273 ../../Zotlabs/Module/Admin.php:1495
+msgid "Toggle"
+msgstr "Omschakelen"
+
+#: ../../Zotlabs/Module/Admin.php:1274 ../../Zotlabs/Module/Admin.php:1496
+#: ../../include/apps.php:134 ../../include/widgets.php:589
+#: ../../include/nav.php:211
+msgid "Settings"
+msgstr "Instellingen"
+
+#: ../../Zotlabs/Module/Admin.php:1281 ../../Zotlabs/Module/Admin.php:1505
+msgid "Author: "
+msgstr "Auteur: "
+
+#: ../../Zotlabs/Module/Admin.php:1282 ../../Zotlabs/Module/Admin.php:1506
+msgid "Maintainer: "
+msgstr "Beheerder: "
+
+#: ../../Zotlabs/Module/Admin.php:1283
+msgid "Minimum project version: "
+msgstr "Minimum versie Hubzilla: "
+
+#: ../../Zotlabs/Module/Admin.php:1284
+msgid "Maximum project version: "
+msgstr "Maximum versie Hubzilla:"
+
+#: ../../Zotlabs/Module/Admin.php:1285
+msgid "Minimum PHP version: "
+msgstr "Minimum versie PHP: "
+
+#: ../../Zotlabs/Module/Admin.php:1286
+msgid "Requires: "
+msgstr "Vereist: "
+
+#: ../../Zotlabs/Module/Admin.php:1287 ../../Zotlabs/Module/Admin.php:1338
+msgid "Disabled - version incompatibility"
+msgstr "Uitgeschakeld - versie is incompatibel"
+
+#: ../../Zotlabs/Module/Admin.php:1431
+msgid "No themes found."
+msgstr "Geen thema's gevonden"
+
+#: ../../Zotlabs/Module/Admin.php:1487
+msgid "Screenshot"
+msgstr "Schermafdruk"
+
+#: ../../Zotlabs/Module/Admin.php:1494 ../../Zotlabs/Module/Admin.php:1528
+#: ../../include/widgets.php:1340
+msgid "Themes"
+msgstr "Thema's"
+
+#: ../../Zotlabs/Module/Admin.php:1533
+msgid "[Experimental]"
+msgstr "[Experimenteel]"
+
+#: ../../Zotlabs/Module/Admin.php:1534
+msgid "[Unsupported]"
+msgstr "[Niet ondersteund]"
+
+#: ../../Zotlabs/Module/Admin.php:1558
+msgid "Log settings updated."
+msgstr "Logboek-instellingen bijgewerkt."
+
+#: ../../Zotlabs/Module/Admin.php:1613 ../../include/widgets.php:1361
+#: ../../include/widgets.php:1371
+msgid "Logs"
+msgstr "Logboeken"
+
+#: ../../Zotlabs/Module/Admin.php:1615
+msgid "Clear"
+msgstr "Leegmaken"
+
+#: ../../Zotlabs/Module/Admin.php:1621
+msgid "Debugging"
+msgstr "Debuggen"
+
+#: ../../Zotlabs/Module/Admin.php:1622
+msgid "Log file"
+msgstr "Logbestand"
+
+#: ../../Zotlabs/Module/Admin.php:1622
+msgid ""
+"Must be writable by web server. Relative to your Red top-level directory."
+msgstr "Moet door de webserver beschrijfbaar zijn. Relatief ten opzichte van de bovenste map van je $Projectname-installatie."
+
+#: ../../Zotlabs/Module/Admin.php:1623
+msgid "Log level"
+msgstr "Logniveau"
+
+#: ../../Zotlabs/Module/Admin.php:1690
+msgid "New Profile Field"
+msgstr "Nieuw profielveld"
+
+#: ../../Zotlabs/Module/Admin.php:1691 ../../Zotlabs/Module/Admin.php:1711
+msgid "Field nickname"
+msgstr "Bijnaam voor veld"
+
+#: ../../Zotlabs/Module/Admin.php:1691 ../../Zotlabs/Module/Admin.php:1711
+msgid "System name of field"
+msgstr "Systeemnaam voor veld"
+
+#: ../../Zotlabs/Module/Admin.php:1692 ../../Zotlabs/Module/Admin.php:1712
+msgid "Input type"
+msgstr "Invoertype"
+
+#: ../../Zotlabs/Module/Admin.php:1693 ../../Zotlabs/Module/Admin.php:1713
+msgid "Field Name"
+msgstr "Veldnaam"
+
+#: ../../Zotlabs/Module/Admin.php:1693 ../../Zotlabs/Module/Admin.php:1713
+msgid "Label on profile pages"
+msgstr "Tekstlabel voor op profielpagina's"
+
+#: ../../Zotlabs/Module/Admin.php:1694 ../../Zotlabs/Module/Admin.php:1714
+msgid "Help text"
+msgstr "Helptekst"
+
+#: ../../Zotlabs/Module/Admin.php:1694 ../../Zotlabs/Module/Admin.php:1714
+msgid "Additional info (optional)"
+msgstr "Extra informatie (optioneel)"
+
+#: ../../Zotlabs/Module/Admin.php:1695 ../../Zotlabs/Module/Admin.php:1715
+#: ../../Zotlabs/Module/Filer.php:53 ../../Zotlabs/Module/Rbmark.php:32
+#: ../../Zotlabs/Module/Rbmark.php:104 ../../include/widgets.php:201
+#: ../../include/text.php:905 ../../include/text.php:917
+msgid "Save"
+msgstr "Opslaan"
+
+#: ../../Zotlabs/Module/Admin.php:1704
+msgid "Field definition not found"
+msgstr "Velddefinitie niet gevonden"
+
+#: ../../Zotlabs/Module/Admin.php:1710
+msgid "Edit Profile Field"
+msgstr "Profielveld bewerken"
+
+#: ../../Zotlabs/Module/Admin.php:1768 ../../include/widgets.php:1342
+msgid "Profile Fields"
+msgstr "Profielvelden"
+
+#: ../../Zotlabs/Module/Admin.php:1769
+msgid "Basic Profile Fields"
+msgstr "Standaard profielvelden"
+
+#: ../../Zotlabs/Module/Admin.php:1770
+msgid "Advanced Profile Fields"
+msgstr "Geavanceerde profielvelden"
+
+#: ../../Zotlabs/Module/Admin.php:1770
+msgid "(In addition to basic fields)"
+msgstr "(als toevoeging op de standaard velden)"
+
+#: ../../Zotlabs/Module/Admin.php:1772
+msgid "All available fields"
+msgstr "Alle beschikbare velden"
+
+#: ../../Zotlabs/Module/Admin.php:1773
+msgid "Custom Fields"
+msgstr "Extra (handmatig toegevoegde) velden"
+
+#: ../../Zotlabs/Module/Admin.php:1777
+msgid "Create Custom Field"
+msgstr "Extra velden aanmaken"
+
+#: ../../Zotlabs/Module/Api.php:61 ../../Zotlabs/Module/Api.php:85
+msgid "Authorize application connection"
+msgstr "Geef toestemming voor applicatiekoppeling"
+
+#: ../../Zotlabs/Module/Api.php:62
+msgid "Return to your app and insert this Securty Code:"
+msgstr "Ga terug naar je app en voeg deze beveiligingscode in:"
+
+#: ../../Zotlabs/Module/Api.php:72
+msgid "Please login to continue."
+msgstr "Inloggen om verder te kunnen gaan."
+
+#: ../../Zotlabs/Module/Api.php:87
+msgid ""
+"Do you want to authorize this application to access your posts and contacts,"
+" and/or create new posts for you?"
+msgstr "Wil je deze applicatie toestemming geven om jouw berichten en connecties te zien, en/of nieuwe berichten voor jou te plaatsen?"
+
+#: ../../Zotlabs/Module/Appman.php:32 ../../Zotlabs/Module/Appman.php:48
+msgid "App installed."
+msgstr "App geïnstalleerd"
+
+#: ../../Zotlabs/Module/Appman.php:41
+msgid "Malformed app."
+msgstr "Misvormde app."
+
+#: ../../Zotlabs/Module/Appman.php:84
+msgid "Embed code"
+msgstr "Insluitcode"
+
+#: ../../Zotlabs/Module/Appman.php:90
+msgid "Edit App"
+msgstr "App bewerken"
+
+#: ../../Zotlabs/Module/Appman.php:90
+msgid "Create App"
+msgstr "App maken"
+
+#: ../../Zotlabs/Module/Appman.php:95
+msgid "Name of app"
+msgstr "Naam van app"
+
+#: ../../Zotlabs/Module/Appman.php:95 ../../Zotlabs/Module/Appman.php:96
+#: ../../Zotlabs/Module/Events.php:448 ../../Zotlabs/Module/Events.php:453
+#: ../../Zotlabs/Module/Profiles.php:712 ../../Zotlabs/Module/Profiles.php:716
+#: ../../include/datetime.php:246
+msgid "Required"
+msgstr "Vereist"
+
+#: ../../Zotlabs/Module/Appman.php:96
+msgid "Location (URL) of app"
+msgstr "Locatie (URL) van app"
+
+#: ../../Zotlabs/Module/Appman.php:97 ../../Zotlabs/Module/Events.php:461
+#: ../../Zotlabs/Module/Rbmark.php:101
+msgid "Description"
+msgstr "Omschrijving"
+
+#: ../../Zotlabs/Module/Appman.php:98
+msgid "Photo icon URL"
+msgstr "URL van pictogram"
+
+#: ../../Zotlabs/Module/Appman.php:98
+msgid "80 x 80 pixels - optional"
+msgstr "80 x 80 pixels (optioneel)"
+
+#: ../../Zotlabs/Module/Appman.php:99
+msgid "Version ID"
+msgstr "Versie-ID"
+
+#: ../../Zotlabs/Module/Appman.php:100
+msgid "Price of app"
+msgstr "Prijs van de app"
+
+#: ../../Zotlabs/Module/Appman.php:101
+msgid "Location (URL) to purchase app"
+msgstr "Locatie (URL) om de app aan te schaffen"
+
+#: ../../Zotlabs/Module/Apps.php:40 ../../include/widgets.php:102
+#: ../../include/nav.php:165
+msgid "Apps"
+msgstr "Apps"
+
+#: ../../Zotlabs/Module/Attach.php:13
+msgid "Item not available."
+msgstr "Item is niet aanwezig."
+
+#: ../../Zotlabs/Module/Block.php:31 ../../Zotlabs/Module/Page.php:40
+msgid "Invalid item."
+msgstr "Ongeldig item."
+
+#: ../../Zotlabs/Module/Block.php:43 ../../Zotlabs/Module/Cal.php:65
+#: ../../Zotlabs/Module/Page.php:56 ../../Zotlabs/Module/Wall_upload.php:33
+msgid "Channel not found."
+msgstr "Kanaal niet gevonden."
+
+#: ../../Zotlabs/Module/Blocks.php:99 ../../Zotlabs/Module/Blocks.php:154
+msgid "Block Name"
+msgstr "Bloknaam"
+
+#: ../../Zotlabs/Module/Blocks.php:153 ../../include/text.php:2278
+msgid "Blocks"
+msgstr "Blokken"
+
+#: ../../Zotlabs/Module/Blocks.php:155
+msgid "Block Title"
+msgstr "Bloktitel"
+
+#: ../../Zotlabs/Module/Blocks.php:156 ../../Zotlabs/Module/Layouts.php:186
+#: ../../Zotlabs/Module/Menu.php:114 ../../Zotlabs/Module/Webpages.php:200
+#: ../../include/page_widgets.php:44
+msgid "Created"
+msgstr "Aangemaakt"
+
+#: ../../Zotlabs/Module/Blocks.php:157 ../../Zotlabs/Module/Layouts.php:187
+#: ../../Zotlabs/Module/Menu.php:115 ../../Zotlabs/Module/Webpages.php:201
+#: ../../include/page_widgets.php:45
+msgid "Edited"
+msgstr "Bewerkt"
+
+#: ../../Zotlabs/Module/Blocks.php:160 ../../Zotlabs/Module/Layouts.php:189
+#: ../../Zotlabs/Module/Photos.php:1071 ../../Zotlabs/Module/Webpages.php:190
+#: ../../include/conversation.php:1209
+msgid "Share"
+msgstr "Delen"
+
+#: ../../Zotlabs/Module/Blocks.php:165 ../../Zotlabs/Module/Layouts.php:193
+#: ../../Zotlabs/Module/Pubsites.php:46 ../../Zotlabs/Module/Webpages.php:195
+#: ../../include/page_widgets.php:39
+msgid "View"
+msgstr "Weergeven"
+
+#: ../../Zotlabs/Module/Bookmarks.php:53
+msgid "Bookmark added"
+msgstr "Bladwijzer toegevoegd"
+
+#: ../../Zotlabs/Module/Bookmarks.php:75
+msgid "My Bookmarks"
+msgstr "Mijn bladwijzers"
+
+#: ../../Zotlabs/Module/Bookmarks.php:86
+msgid "My Connections Bookmarks"
+msgstr "Bladwijzers van mijn connecties"
+
+#: ../../Zotlabs/Module/Cal.php:41 ../../Zotlabs/Module/Photos.php:45
+#: ../../include/js_strings.php:13
+msgid "everybody"
+msgstr "iedereen"
+
+#: ../../Zotlabs/Module/Cal.php:72
+msgid "Permissions denied."
+msgstr "Permissies niet toegestaan"
+
+#: ../../Zotlabs/Module/Cal.php:262 ../../Zotlabs/Module/Events.php:585
+msgid "l, F j"
+msgstr "l j F"
+
+#: ../../Zotlabs/Module/Cal.php:311 ../../Zotlabs/Module/Events.php:634
+#: ../../include/text.php:1743
+msgid "Link to Source"
+msgstr "Originele locatie"
+
+#: ../../Zotlabs/Module/Cal.php:334 ../../Zotlabs/Module/Events.php:662
+msgid "Edit Event"
+msgstr "Gebeurtenis bewerken"
+
+#: ../../Zotlabs/Module/Cal.php:334 ../../Zotlabs/Module/Events.php:662
+msgid "Create Event"
+msgstr "Gebeurtenis aanmaken"
+
+#: ../../Zotlabs/Module/Cal.php:335 ../../Zotlabs/Module/Cal.php:342
+#: ../../Zotlabs/Module/Events.php:663 ../../Zotlabs/Module/Events.php:670
+#: ../../Zotlabs/Module/Photos.php:948
+msgid "Previous"
+msgstr "Vorige"
+
+#: ../../Zotlabs/Module/Cal.php:336 ../../Zotlabs/Module/Cal.php:343
+#: ../../Zotlabs/Module/Events.php:664 ../../Zotlabs/Module/Events.php:671
+#: ../../Zotlabs/Module/Photos.php:957 ../../Zotlabs/Module/Setup.php:290
+msgid "Next"
+msgstr "Volgende"
+
+#: ../../Zotlabs/Module/Cal.php:337 ../../Zotlabs/Module/Events.php:665
+#: ../../include/widgets.php:706
+msgid "Export"
+msgstr "Exporteren"
+
+#: ../../Zotlabs/Module/Cal.php:340 ../../Zotlabs/Module/Events.php:668
+#: ../../include/widgets.php:707
+msgid "Import"
+msgstr "Importeren"
+
+#: ../../Zotlabs/Module/Cal.php:344 ../../Zotlabs/Module/Events.php:672
+msgid "Today"
+msgstr "Vandaag"
+
+#: ../../Zotlabs/Module/Channel.php:28 ../../Zotlabs/Module/Chat.php:23
+msgid "You must be logged in to see this page."
+msgstr "Je moet zijn ingelogd om deze pagina te kunnen bekijken."
+
+#: ../../Zotlabs/Module/Channel.php:40
+msgid "Posts and comments"
+msgstr "Berichten en reacties"
+
+#: ../../Zotlabs/Module/Channel.php:41
+msgid "Only posts"
+msgstr "Alleen berichten"
+
+#: ../../Zotlabs/Module/Channel.php:101
+msgid "Insufficient permissions. Request redirected to profile page."
+msgstr "Onvoldoende permissies. Doorgestuurd naar profielpagina."
+
+#: ../../Zotlabs/Module/Channel.php:135 ../../Zotlabs/Module/Network.php:173
+#: ../../Zotlabs/Module/Rpost.php:118
+msgid "Public"
+msgstr "Openbaar"
+
+#: ../../Zotlabs/Module/Chat.php:179
+msgid "Room not found"
+msgstr "Chatkanaal niet gevonden"
+
+#: ../../Zotlabs/Module/Chat.php:195
+msgid "Leave Room"
+msgstr "Chatkanaal verlaten"
+
+#: ../../Zotlabs/Module/Chat.php:196
+msgid "Delete Room"
+msgstr "Chatkanaal verwijderen"
+
+#: ../../Zotlabs/Module/Chat.php:197
+msgid "I am away right now"
+msgstr "Ik ben momenteel afwezig"
+
+#: ../../Zotlabs/Module/Chat.php:198
+msgid "I am online"
+msgstr "Ik ben online"
+
+#: ../../Zotlabs/Module/Chat.php:200
+msgid "Bookmark this room"
+msgstr "Chatkanaal aan bladwijzers toevoegen"
+
+#: ../../Zotlabs/Module/Chat.php:203 ../../Zotlabs/Module/Mail.php:206
+#: ../../Zotlabs/Module/Mail.php:320 ../../include/conversation.php:1170
+msgid "Please enter a link URL:"
+msgstr "Vul een URL in:"
+
+#: ../../Zotlabs/Module/Chat.php:204 ../../Zotlabs/Module/Editpost.php:163
+#: ../../Zotlabs/Module/Mail.php:259 ../../Zotlabs/Module/Mail.php:389
+#: ../../include/ItemObject.php:715 ../../include/conversation.php:1274
+msgid "Encrypt text"
+msgstr "Tekst versleutelen"
+
+#: ../../Zotlabs/Module/Chat.php:205 ../../Zotlabs/Module/Editblock.php:149
+#: ../../Zotlabs/Module/Editlayout.php:147
+#: ../../Zotlabs/Module/Editpost.php:126
+#: ../../Zotlabs/Module/Editwebpage.php:189 ../../Zotlabs/Module/Mail.php:253
+#: ../../Zotlabs/Module/Mail.php:383 ../../include/conversation.php:1225
+msgid "Insert web link"
+msgstr "Weblink invoegen"
+
+#: ../../Zotlabs/Module/Chat.php:216
+msgid "Feature disabled."
+msgstr "Functie uitgeschakeld."
+
+#: ../../Zotlabs/Module/Chat.php:230
+msgid "New Chatroom"
+msgstr "Nieuw chatkanaal"
+
+#: ../../Zotlabs/Module/Chat.php:231
+msgid "Chatroom name"
+msgstr "Naam chatkanaal"
+
+#: ../../Zotlabs/Module/Chat.php:232
+msgid "Expiration of chats (minutes)"
+msgstr "Aantal minuten voordat chatberichten worden verwijderd"
+
+#: ../../Zotlabs/Module/Chat.php:233 ../../Zotlabs/Module/Filestorage.php:151
+#: ../../Zotlabs/Module/Photos.php:670 ../../Zotlabs/Module/Photos.php:1044
+#: ../../Zotlabs/Module/Thing.php:313 ../../Zotlabs/Module/Thing.php:359
+#: ../../include/acl_selectors.php:251
+msgid "Permissions"
+msgstr "Permissies"
+
+#: ../../Zotlabs/Module/Chat.php:244
+#, php-format
+msgid "%1$s's Chatrooms"
+msgstr "Chatkanalen van %1$s"
+
+#: ../../Zotlabs/Module/Chat.php:249
+msgid "No chatrooms available"
+msgstr "Geen chatkanalen beschikbaar"
+
+#: ../../Zotlabs/Module/Chat.php:250 ../../Zotlabs/Module/Manage.php:141
+#: ../../Zotlabs/Module/Profiles.php:781
+msgid "Create New"
+msgstr "Nieuwe aanmaken"
+
+#: ../../Zotlabs/Module/Chat.php:253
+msgid "Expiration"
+msgstr "Verloopt na"
+
+#: ../../Zotlabs/Module/Chat.php:254
+msgid "min"
+msgstr "min"
+
+#: ../../Zotlabs/Module/Chatsvc.php:115
+msgid "Away"
+msgstr "Afwezig"
+
+#: ../../Zotlabs/Module/Chatsvc.php:120
+msgid "Online"
+msgstr "Online"
+
+#: ../../Zotlabs/Module/Common.php:14
+msgid "No channel."
+msgstr "Geen kanaal."
+
+#: ../../Zotlabs/Module/Common.php:43
+msgid "Common connections"
+msgstr "Veel voorkomende connecties"
+
+#: ../../Zotlabs/Module/Common.php:48
+msgid "No connections in common."
+msgstr "Geen gemeenschappelijke connecties."
+
+#: ../../Zotlabs/Module/Connect.php:60 ../../Zotlabs/Module/Connect.php:108
+msgid "Continue"
+msgstr "Ga verder"
+
+#: ../../Zotlabs/Module/Connect.php:89
+msgid "Premium Channel Setup"
+msgstr "Instellen premiumkanaal "
+
+#: ../../Zotlabs/Module/Connect.php:91
+msgid "Enable premium channel connection restrictions"
+msgstr "Restricties voor connecties van premiumkanaal toestaan"
+
+#: ../../Zotlabs/Module/Connect.php:92
+msgid ""
+"Please enter your restrictions or conditions, such as paypal receipt, usage "
+"guidelines, etc."
+msgstr "Vul je restricties of voorwaarden in, zoals een paypal-afschrift, voorschriften voor leden, enz."
+
+#: ../../Zotlabs/Module/Connect.php:94 ../../Zotlabs/Module/Connect.php:114
+msgid ""
+"This channel may require additional steps or acknowledgement of the "
+"following conditions prior to connecting:"
+msgstr "Dit kanaal kan extra stappen of het accepteren van de volgende voorwaarden vereisen, voordat de connectie wordt geaccepteerd:"
+
+#: ../../Zotlabs/Module/Connect.php:95
+msgid ""
+"Potential connections will then see the following text before proceeding:"
+msgstr "Mogelijke connecties zullen dan de volgende tekst zien voordat ze verder kunnen:"
+
+#: ../../Zotlabs/Module/Connect.php:96 ../../Zotlabs/Module/Connect.php:117
+msgid ""
+"By continuing, I certify that I have complied with any instructions provided"
+" on this page."
+msgstr "Door verder te gaan ga ik automatisch akkoord met alle voorwaarden en aanwijzingen op deze pagina."
+
+#: ../../Zotlabs/Module/Connect.php:105
+msgid "(No specific instructions have been provided by the channel owner.)"
+msgstr "(Er zijn geen speciale voorwaarden en aanwijzingen door de kanaal-eigenaar verstrekt) "
+
+#: ../../Zotlabs/Module/Connect.php:113
+msgid "Restricted or Premium Channel"
+msgstr "Beperkt of premiumkanaal"
+
+#: ../../Zotlabs/Module/Connections.php:56
+#: ../../Zotlabs/Module/Connections.php:161
+#: ../../Zotlabs/Module/Connections.php:242
+msgid "Blocked"
+msgstr "Geblokkeerd"
+
+#: ../../Zotlabs/Module/Connections.php:61
+#: ../../Zotlabs/Module/Connections.php:168
+#: ../../Zotlabs/Module/Connections.php:241
+msgid "Ignored"
+msgstr "Genegeerd"
+
+#: ../../Zotlabs/Module/Connections.php:66
+#: ../../Zotlabs/Module/Connections.php:182
+#: ../../Zotlabs/Module/Connections.php:240
+msgid "Hidden"
+msgstr "Verborgen"
+
+#: ../../Zotlabs/Module/Connections.php:71
+#: ../../Zotlabs/Module/Connections.php:175
+#: ../../Zotlabs/Module/Connections.php:239
+msgid "Archived"
+msgstr "Gearchiveerd"
+
+#: ../../Zotlabs/Module/Connections.php:76
+#: ../../Zotlabs/Module/Connections.php:86 ../../Zotlabs/Module/Menu.php:116
+#: ../../include/conversation.php:1553
+msgid "New"
+msgstr "Nieuw"
+
+#: ../../Zotlabs/Module/Connections.php:92
+#: ../../Zotlabs/Module/Connections.php:107
+#: ../../Zotlabs/Module/Connedit.php:597 ../../include/widgets.php:448
+msgid "All"
+msgstr "Alles"
+
+#: ../../Zotlabs/Module/Connections.php:138
+msgid "New Connections"
+msgstr "Nieuwe connecties"
+
+#: ../../Zotlabs/Module/Connections.php:141
+msgid "Show pending (new) connections"
+msgstr "Nog te accepteren (nieuwe) connecties weergeven"
+
+#: ../../Zotlabs/Module/Connections.php:145
+#: ../../Zotlabs/Module/Profperm.php:144
+msgid "All Connections"
+msgstr "Alle connecties"
+
+#: ../../Zotlabs/Module/Connections.php:148
+msgid "Show all connections"
+msgstr "Toon alle connecties"
+
+#: ../../Zotlabs/Module/Connections.php:164
+msgid "Only show blocked connections"
+msgstr "Toon alleen geblokkeerde connecties"
+
+#: ../../Zotlabs/Module/Connections.php:171
+msgid "Only show ignored connections"
+msgstr "Toon alleen genegeerde connecties"
+
+#: ../../Zotlabs/Module/Connections.php:178
+msgid "Only show archived connections"
+msgstr "Toon alleen gearchiveerde connecties"
+
+#: ../../Zotlabs/Module/Connections.php:185
+msgid "Only show hidden connections"
+msgstr "Toon alleen verborgen connecties"
+
+#: ../../Zotlabs/Module/Connections.php:238
+msgid "Pending approval"
+msgstr "Moet nog geaccepteerd worden"
+
+#: ../../Zotlabs/Module/Connections.php:254
+#, php-format
+msgid "%1$s [%2$s]"
+msgstr "%1$s [%2$s]"
+
+#: ../../Zotlabs/Module/Connections.php:255
+msgid "Edit connection"
+msgstr "Connectie bewerken"
+
+#: ../../Zotlabs/Module/Connections.php:256
+msgid "Delete connection"
+msgstr "Connectie verwijderen"
+
+#: ../../Zotlabs/Module/Connections.php:265
+msgid "Channel address"
+msgstr "Kanaaladres"
+
+#: ../../Zotlabs/Module/Connections.php:267
+msgid "Network"
+msgstr "Netwerk"
+
+#: ../../Zotlabs/Module/Connections.php:272
+msgid "Connected"
+msgstr "Verbonden"
+
+#: ../../Zotlabs/Module/Connections.php:274
+msgid "Approve connection"
+msgstr "Connectie accepteren"
+
+#: ../../Zotlabs/Module/Connections.php:276
+msgid "Ignore connection"
+msgstr "Connectie negeren"
+
+#: ../../Zotlabs/Module/Connections.php:277
+#: ../../Zotlabs/Module/Connedit.php:549
+#: ../../Zotlabs/Module/Notifications.php:55
+msgid "Ignore"
+msgstr "Negeren"
+
+#: ../../Zotlabs/Module/Connections.php:278
+msgid "Recent activity"
+msgstr "Recente activiteit"
+
+#: ../../Zotlabs/Module/Connections.php:302 ../../include/text.php:834
+#: ../../include/nav.php:189
+msgid "Connections"
+msgstr "Connecties"
+
+#: ../../Zotlabs/Module/Connections.php:306 ../../Zotlabs/Module/Search.php:44
+#: ../../include/apps.php:147 ../../include/text.php:904
+#: ../../include/text.php:916 ../../include/nav.php:167
+msgid "Search"
+msgstr "Zoeken"
+
+#: ../../Zotlabs/Module/Connections.php:307
+msgid "Search your connections"
+msgstr "Doorzoek jouw connecties"
+
+#: ../../Zotlabs/Module/Connections.php:308
+msgid "Connections search"
+msgstr "Connecties zoeken"
+
+#: ../../Zotlabs/Module/Connections.php:309
+#: ../../Zotlabs/Module/Directory.php:388
+#: ../../Zotlabs/Module/Directory.php:393 ../../include/contact_widgets.php:26
+msgid "Find"
+msgstr "Vinden"
+
+#: ../../Zotlabs/Module/Connedit.php:80
+msgid "Could not access contact record."
+msgstr "Kon geen toegang krijgen tot de connectie-gegevens."
+
+#: ../../Zotlabs/Module/Connedit.php:104
+msgid "Could not locate selected profile."
+msgstr "Kon het gekozen profiel niet vinden."
+
+#: ../../Zotlabs/Module/Connedit.php:227
+msgid "Connection updated."
+msgstr "Connectie bijgewerkt."
+
+#: ../../Zotlabs/Module/Connedit.php:229
+msgid "Failed to update connection record."
+msgstr "Bijwerken van connectie-gegevens mislukt."
+
+#: ../../Zotlabs/Module/Connedit.php:276
+msgid "is now connected to"
+msgstr "is nu verbonden met"
+
+#: ../../Zotlabs/Module/Connedit.php:411
+msgid "Could not access address book record."
+msgstr "Kon geen toegang krijgen tot de record van de connectie."
+
+#: ../../Zotlabs/Module/Connedit.php:425
+msgid "Refresh failed - channel is currently unavailable."
+msgstr "Vernieuwen mislukt - kanaal is momenteel niet beschikbaar"
+
+#: ../../Zotlabs/Module/Connedit.php:440 ../../Zotlabs/Module/Connedit.php:449
+#: ../../Zotlabs/Module/Connedit.php:458 ../../Zotlabs/Module/Connedit.php:467
+#: ../../Zotlabs/Module/Connedit.php:480
+msgid "Unable to set address book parameters."
+msgstr "Niet in staat om de parameters van connecties in te stellen."
+
+#: ../../Zotlabs/Module/Connedit.php:504
+msgid "Connection has been removed."
+msgstr "Connectie is verwijderd"
+
+#: ../../Zotlabs/Module/Connedit.php:520 ../../include/conversation.php:959
+#: ../../include/nav.php:86
+msgid "View Profile"
+msgstr "Profiel weergeven"
+
+#: ../../Zotlabs/Module/Connedit.php:523
+#, php-format
+msgid "View %s's profile"
+msgstr "Profiel van %s weergeven"
+
+#: ../../Zotlabs/Module/Connedit.php:527
+msgid "Refresh Permissions"
+msgstr "Permissies vernieuwen"
+
+#: ../../Zotlabs/Module/Connedit.php:530
+msgid "Fetch updated permissions"
+msgstr "Aangepaste permissies ophalen"
+
+#: ../../Zotlabs/Module/Connedit.php:534
+msgid "Recent Activity"
+msgstr "Recente activiteit/berichten"
+
+#: ../../Zotlabs/Module/Connedit.php:537
+msgid "View recent posts and comments"
+msgstr "Recente berichten en reacties weergeven"
+
+#: ../../Zotlabs/Module/Connedit.php:544
+msgid "Block (or Unblock) all communications with this connection"
+msgstr "Blokkeer (of deblokkeer) alle communicatie met deze connectie"
+
+#: ../../Zotlabs/Module/Connedit.php:545
+msgid "This connection is blocked!"
+msgstr "Deze connectie is geblokkeerd!"
+
+#: ../../Zotlabs/Module/Connedit.php:549
+msgid "Unignore"
+msgstr "Niet meer negeren"
+
+#: ../../Zotlabs/Module/Connedit.php:552
+msgid "Ignore (or Unignore) all inbound communications from this connection"
+msgstr "Negeer (of negeer niet meer) alle inkomende communicatie van deze connectie"
+
+#: ../../Zotlabs/Module/Connedit.php:553
+msgid "This connection is ignored!"
+msgstr "Deze connectie wordt genegeerd!"
+
+#: ../../Zotlabs/Module/Connedit.php:557
+msgid "Unarchive"
+msgstr "Niet meer archiveren"
+
+#: ../../Zotlabs/Module/Connedit.php:557
+msgid "Archive"
+msgstr "Archiveren"
+
+#: ../../Zotlabs/Module/Connedit.php:560
+msgid ""
+"Archive (or Unarchive) this connection - mark channel dead but keep content"
+msgstr "Archiveer (of dearchiveer) deze connectie - markeer het kanaal als dood, maar bewaar de inhoud"
+
+#: ../../Zotlabs/Module/Connedit.php:561
+msgid "This connection is archived!"
+msgstr "Deze connectie is gearchiveerd!"
+
+#: ../../Zotlabs/Module/Connedit.php:565
+msgid "Unhide"
+msgstr "Niet meer verbergen"
+
+#: ../../Zotlabs/Module/Connedit.php:565
+msgid "Hide"
+msgstr "Verbergen"
+
+#: ../../Zotlabs/Module/Connedit.php:568
+msgid "Hide or Unhide this connection from your other connections"
+msgstr "Deze connectie verbergen (of niet meer verbergen) voor jouw andere connecties"
+
+#: ../../Zotlabs/Module/Connedit.php:569
+msgid "This connection is hidden!"
+msgstr "Deze connectie is verborgen!"
+
+#: ../../Zotlabs/Module/Connedit.php:576
+msgid "Delete this connection"
+msgstr "Deze connectie verwijderen"
+
+#: ../../Zotlabs/Module/Connedit.php:593 ../../include/widgets.php:444
+msgid "Me"
+msgstr "Ik"
+
+#: ../../Zotlabs/Module/Connedit.php:594 ../../include/widgets.php:445
+msgid "Family"
+msgstr "Familie"
+
+#: ../../Zotlabs/Module/Connedit.php:595 ../../Zotlabs/Module/Settings.php:340
+#: ../../Zotlabs/Module/Settings.php:344 ../../Zotlabs/Module/Settings.php:345
+#: ../../Zotlabs/Module/Settings.php:348 ../../Zotlabs/Module/Settings.php:359
+#: ../../include/identity.php:389 ../../include/identity.php:390
+#: ../../include/identity.php:397 ../../include/profile_selectors.php:80
+#: ../../include/widgets.php:446
+msgid "Friends"
+msgstr "Vrienden"
+
+#: ../../Zotlabs/Module/Connedit.php:596 ../../include/widgets.php:447
+msgid "Acquaintances"
+msgstr "Kennissen"
+
+#: ../../Zotlabs/Module/Connedit.php:657
+msgid "Approve this connection"
+msgstr "Deze connectie accepteren"
+
+#: ../../Zotlabs/Module/Connedit.php:657
+msgid "Accept connection to allow communication"
+msgstr "Keur deze connectie goed om communicatie toe te staan"
+
+#: ../../Zotlabs/Module/Connedit.php:662
+msgid "Set Affinity"
+msgstr "Verwantschapsfilter instellen"
+
+#: ../../Zotlabs/Module/Connedit.php:665
+msgid "Set Profile"
+msgstr "Profiel instellen"
+
+#: ../../Zotlabs/Module/Connedit.php:668
+msgid "Set Affinity & Profile"
+msgstr "Verwantschapsfilter en profiel instellen"
+
+#: ../../Zotlabs/Module/Connedit.php:701
+msgid "none"
+msgstr "geen"
+
+#: ../../Zotlabs/Module/Connedit.php:705 ../../include/widgets.php:565
+msgid "Connection Default Permissions"
+msgstr "Standaard permissies voor connecties"
+
+#: ../../Zotlabs/Module/Connedit.php:705 ../../include/items.php:5159
+#, php-format
+msgid "Connection: %s"
+msgstr "Connectie: %s"
+
+#: ../../Zotlabs/Module/Connedit.php:706
+msgid "Apply these permissions automatically"
+msgstr "Deze permissies automatisch toepassen"
+
+#: ../../Zotlabs/Module/Connedit.php:706
+msgid "Connection requests will be approved without your interaction"
+msgstr "Connectieverzoeken zullen automatisch worden geaccepteerd"
+
+#: ../../Zotlabs/Module/Connedit.php:708
+msgid "This connection's primary address is"
+msgstr "Het primaire kanaaladres van deze connectie is"
+
+#: ../../Zotlabs/Module/Connedit.php:709
+msgid "Available locations:"
+msgstr "Beschikbare locaties:"
+
+#: ../../Zotlabs/Module/Connedit.php:713
+msgid ""
+"The permissions indicated on this page will be applied to all new "
+"connections."
+msgstr "Permissies die op deze pagina staan vermeld worden op alle nieuwe connecties toegepast."
+
+#: ../../Zotlabs/Module/Connedit.php:715
+msgid "Slide to adjust your degree of friendship"
+msgstr "Schuif om te bepalen hoe goed je iemand kent en/of mag"
+
+#: ../../Zotlabs/Module/Connedit.php:716 ../../Zotlabs/Module/Rate.php:161
+#: ../../include/js_strings.php:20
+msgid "Rating"
+msgstr "Beoordeling"
+
+#: ../../Zotlabs/Module/Connedit.php:717
+msgid "Slide to adjust your rating"
+msgstr "Gebruik de schuif om je beoordeling te geven"
+
+#: ../../Zotlabs/Module/Connedit.php:718 ../../Zotlabs/Module/Connedit.php:723
+msgid "Optionally explain your rating"
+msgstr "Verklaar jouw beoordeling (niet verplicht)"
+
+#: ../../Zotlabs/Module/Connedit.php:720
+msgid "Custom Filter"
+msgstr "Berichtenfilter"
+
+#: ../../Zotlabs/Module/Connedit.php:721
+msgid "Only import posts with this text"
+msgstr "Importeer alleen berichten met deze tekst"
+
+#: ../../Zotlabs/Module/Connedit.php:721 ../../Zotlabs/Module/Connedit.php:722
+msgid ""
+"words one per line or #tags or /patterns/ or lang=xx, leave blank to import "
+"all posts"
+msgstr "woorden (één per regel), #tags, /regex/ of talen (lang=iso639-1) - laat leeg om alle berichten te importeren"
+
+#: ../../Zotlabs/Module/Connedit.php:722
+msgid "Do not import posts with this text"
+msgstr "Importeer geen berichten met deze tekst"
+
+#: ../../Zotlabs/Module/Connedit.php:724
+msgid "This information is public!"
+msgstr "Deze informatie is openbaar!"
+
+#: ../../Zotlabs/Module/Connedit.php:729
+msgid "Connection Pending Approval"
+msgstr "Connectie moet nog geaccepteerd worden"
+
+#: ../../Zotlabs/Module/Connedit.php:732
+msgid "inherited"
+msgstr "geërfd"
+
+#: ../../Zotlabs/Module/Connedit.php:734
+#, php-format
+msgid ""
+"Please choose the profile you would like to display to %s when viewing your "
+"profile securely."
+msgstr "Kies het profiel dat je aan %s wil tonen wanneer hij/zij ingelogd jouw profiel wil bekijken."
+
+#: ../../Zotlabs/Module/Connedit.php:736
+msgid "Their Settings"
+msgstr "Hun instellingen"
+
+#: ../../Zotlabs/Module/Connedit.php:737
+msgid "My Settings"
+msgstr "Mijn instellingen"
+
+#: ../../Zotlabs/Module/Connedit.php:739
+msgid "Individual Permissions"
+msgstr "Individuele permissies"
+
+#: ../../Zotlabs/Module/Connedit.php:740
+msgid ""
+"Some permissions may be inherited from your channel's <a "
+"href=\"settings\"><strong>privacy settings</strong></a>, which have higher "
+"priority than individual settings. You can <strong>not</strong> change those"
+" settings here."
+msgstr "Sommige permissies worden mogelijk overgeërfd van de <a href=\"settings\">privacy-instellingen</a> van jouw kanaal, die een hogere prioriteit hebben dan deze individuele instellingen. Je kan je deze overgeërfde permissies hier <strong>niet</strong> veranderen."
+
+#: ../../Zotlabs/Module/Connedit.php:741
+msgid ""
+"Some permissions may be inherited from your channel's <a "
+"href=\"settings\"><strong>privacy settings</strong></a>, which have higher "
+"priority than individual settings. You can change those settings here but "
+"they wont have any impact unless the inherited setting changes."
+msgstr "Sommige permissies worden mogelijk overgeërfd van de <a href=\"settings\">privacy-instellingen</a> van jouw kanaal, die een hogere prioriteit hebben dan deze individuele permissies. Je kan de permissies hier veranderen, maar die hebben geen effect, tenzij de overgeërfde permissies worden veranderd. "
+
+#: ../../Zotlabs/Module/Connedit.php:742
+msgid "Last update:"
+msgstr "Laatste wijziging:"
+
+#: ../../Zotlabs/Module/Cover_photo.php:58
+#: ../../Zotlabs/Module/Profile_photo.php:79
+msgid "Image uploaded but image cropping failed."
+msgstr "Afbeelding geüpload, maar afbeelding kon niet worden bijgesneden. "
+
+#: ../../Zotlabs/Module/Cover_photo.php:134
+#: ../../Zotlabs/Module/Cover_photo.php:181
+msgid "Cover Photos"
+msgstr "Omslagfoto's"
+
+#: ../../Zotlabs/Module/Cover_photo.php:154
+#: ../../Zotlabs/Module/Profile_photo.php:133
+msgid "Image resize failed."
+msgstr "Afbeelding kon niet van grootte veranderd worden."
+
+#: ../../Zotlabs/Module/Cover_photo.php:168
+#: ../../Zotlabs/Module/Profile_photo.php:192 ../../include/photos.php:146
+msgid "Unable to process image"
+msgstr "Afbeelding kan niet verwerkt worden"
+
+#: ../../Zotlabs/Module/Cover_photo.php:192
+#: ../../Zotlabs/Module/Profile_photo.php:217
+msgid "Image upload failed."
+msgstr "Uploaden afbeelding mislukt"
+
+#: ../../Zotlabs/Module/Cover_photo.php:210
+#: ../../Zotlabs/Module/Profile_photo.php:236
+msgid "Unable to process image."
+msgstr "Niet in staat om afbeelding te verwerken."
+
+#: ../../Zotlabs/Module/Cover_photo.php:233 ../../include/items.php:5587
+msgid "female"
+msgstr "vrouw"
+
+#: ../../Zotlabs/Module/Cover_photo.php:234 ../../include/items.php:5588
+#, php-format
+msgid "%1$s updated her %2$s"
+msgstr "%1$s heeft haar %2$s bijgewerkt"
+
+#: ../../Zotlabs/Module/Cover_photo.php:235 ../../include/items.php:5589
+msgid "male"
+msgstr "man"
+
+#: ../../Zotlabs/Module/Cover_photo.php:236 ../../include/items.php:5590
+#, php-format
+msgid "%1$s updated his %2$s"
+msgstr "%1$s heeft zijn %2$s bijgewerkt"
+
+#: ../../Zotlabs/Module/Cover_photo.php:238 ../../include/items.php:5592
+#, php-format
+msgid "%1$s updated their %2$s"
+msgstr "De %2$s van %1$s is bijgewerkt"
+
+#: ../../Zotlabs/Module/Cover_photo.php:240 ../../include/identity.php:1800
+msgid "cover photo"
+msgstr "omslagfoto"
+
+#: ../../Zotlabs/Module/Cover_photo.php:303
+#: ../../Zotlabs/Module/Cover_photo.php:318
+#: ../../Zotlabs/Module/Profile_photo.php:283
+#: ../../Zotlabs/Module/Profile_photo.php:324
+msgid "Photo not available."
+msgstr "Foto niet beschikbaar."
+
+#: ../../Zotlabs/Module/Cover_photo.php:354
+#: ../../Zotlabs/Module/Profile_photo.php:365
+msgid "Upload File:"
+msgstr "Bestand uploaden:"
+
+#: ../../Zotlabs/Module/Cover_photo.php:355
+#: ../../Zotlabs/Module/Profile_photo.php:366
+msgid "Select a profile:"
+msgstr "Kies een profiel:"
+
+#: ../../Zotlabs/Module/Cover_photo.php:356
+msgid "Upload Cover Photo"
+msgstr "Omslagfoto uploaden"
+
+#: ../../Zotlabs/Module/Cover_photo.php:361
+#: ../../Zotlabs/Module/Profile_photo.php:374
+#: ../../Zotlabs/Module/Settings.php:983
+msgid "or"
+msgstr "of"
+
+#: ../../Zotlabs/Module/Cover_photo.php:361
+#: ../../Zotlabs/Module/Profile_photo.php:374
+msgid "skip this step"
+msgstr "sla deze stap over"
+
+#: ../../Zotlabs/Module/Cover_photo.php:361
+#: ../../Zotlabs/Module/Profile_photo.php:374
+msgid "select a photo from your photo albums"
+msgstr "Kies een foto uit jouw fotoalbums"
+
+#: ../../Zotlabs/Module/Cover_photo.php:377
+#: ../../Zotlabs/Module/Profile_photo.php:390
+msgid "Crop Image"
+msgstr "Afbeelding bijsnijden"
+
+#: ../../Zotlabs/Module/Cover_photo.php:378
+#: ../../Zotlabs/Module/Profile_photo.php:391
+msgid "Please adjust the image cropping for optimum viewing."
+msgstr "Snij de afbeelding zo uit dat deze optimaal wordt weergegeven."
+
+#: ../../Zotlabs/Module/Cover_photo.php:380
+#: ../../Zotlabs/Module/Profile_photo.php:393
+msgid "Done Editing"
+msgstr "Klaar met bewerken"
+
+#: ../../Zotlabs/Module/Dav.php:127
+msgid "$Projectname channel"
+msgstr "$Projectname-kanaal"
+
+#: ../../Zotlabs/Module/Directory.php:63 ../../Zotlabs/Module/Display.php:21
+#: ../../Zotlabs/Module/Photos.php:521 ../../Zotlabs/Module/Ratings.php:86
+#: ../../Zotlabs/Module/Search.php:17
+#: ../../Zotlabs/Module/Viewconnections.php:21
+msgid "Public access denied."
+msgstr "Openbare toegang geweigerd."
+
+#: ../../Zotlabs/Module/Directory.php:243
+#, php-format
+msgid "%d rating"
+msgid_plural "%d ratings"
+msgstr[0] "%d beoordeling"
+msgstr[1] "%d beoordelingen"
+
+#: ../../Zotlabs/Module/Directory.php:254
+msgid "Gender: "
+msgstr "Geslacht:"
+
+#: ../../Zotlabs/Module/Directory.php:256
+msgid "Status: "
+msgstr "Status: "
+
+#: ../../Zotlabs/Module/Directory.php:258
+msgid "Homepage: "
+msgstr "Homepage: "
+
+#: ../../Zotlabs/Module/Directory.php:306 ../../include/identity.php:1322
+msgid "Age:"
+msgstr "Leeftijd:"
+
+#: ../../Zotlabs/Module/Directory.php:311 ../../include/identity.php:1022
+#: ../../include/bb2diaspora.php:509 ../../include/event.php:52
+#: ../../include/text.php:1452
+msgid "Location:"
+msgstr "Plaats:"
+
+#: ../../Zotlabs/Module/Directory.php:317
+msgid "Description:"
+msgstr "Omschrijving:"
+
+#: ../../Zotlabs/Module/Directory.php:322 ../../include/identity.php:1338
+msgid "Hometown:"
+msgstr "Oorspronkelijk uit:"
+
+#: ../../Zotlabs/Module/Directory.php:324 ../../include/identity.php:1346
+msgid "About:"
+msgstr "Over:"
+
+#: ../../Zotlabs/Module/Directory.php:325 ../../Zotlabs/Module/Match.php:68
+#: ../../Zotlabs/Module/Suggest.php:56 ../../include/identity.php:1007
+#: ../../include/conversation.php:961 ../../include/Contact.php:101
+#: ../../include/widgets.php:147 ../../include/widgets.php:184
+msgid "Connect"
+msgstr "Verbinden"
+
+#: ../../Zotlabs/Module/Directory.php:326
+msgid "Public Forum:"
+msgstr "Openbaar forum:"
+
+#: ../../Zotlabs/Module/Directory.php:329
+msgid "Keywords: "
+msgstr "Trefwoorden: "
+
+#: ../../Zotlabs/Module/Directory.php:332
+msgid "Don't suggest"
+msgstr "Niet voorstellen"
+
+#: ../../Zotlabs/Module/Directory.php:334
+msgid "Common connections:"
+msgstr "Gemeenschappelijke connecties:"
+
+#: ../../Zotlabs/Module/Directory.php:383
+msgid "Global Directory"
+msgstr "Volledige kanalengids"
+
+#: ../../Zotlabs/Module/Directory.php:383
+msgid "Local Directory"
+msgstr "Lokale kanalengids"
+
+#: ../../Zotlabs/Module/Directory.php:389
+msgid "Finding:"
+msgstr "Gezocht naar:"
+
+#: ../../Zotlabs/Module/Directory.php:392 ../../Zotlabs/Module/Suggest.php:64
+#: ../../include/contact_widgets.php:27
+msgid "Channel Suggestions"
+msgstr "Voorgestelde kanalen"
+
+#: ../../Zotlabs/Module/Directory.php:394
+msgid "next page"
+msgstr "volgende pagina"
+
+#: ../../Zotlabs/Module/Directory.php:394
+msgid "previous page"
+msgstr "vorige pagina"
+
+#: ../../Zotlabs/Module/Directory.php:395
+msgid "Sort options"
+msgstr "Sorteeropties"
+
+#: ../../Zotlabs/Module/Directory.php:396
+msgid "Alphabetic"
+msgstr "Alfabetisch"
+
+#: ../../Zotlabs/Module/Directory.php:397
+msgid "Reverse Alphabetic"
+msgstr "Omgekeerd alfabetisch"
+
+#: ../../Zotlabs/Module/Directory.php:398
+msgid "Newest to Oldest"
+msgstr "Nieuw naar oud"
+
+#: ../../Zotlabs/Module/Directory.php:399
+msgid "Oldest to Newest"
+msgstr "Oud naar nieuw"
+
+#: ../../Zotlabs/Module/Directory.php:416
+msgid "No entries (some entries may be hidden)."
+msgstr "Niets gevonden (sommige kanalen kunnen verborgen zijn)."
+
+#: ../../Zotlabs/Module/Dirsearch.php:25 ../../Zotlabs/Module/Regdir.php:49
+msgid "This site is not a directory server"
+msgstr "Deze hub is geen kanalengidshub (directoryserver)"
+
+#: ../../Zotlabs/Module/Dirsearch.php:33
+msgid "This directory server requires an access token"
+msgstr "Deze kanalengidshub (directoryserver) heeft een toegangs-token nodig"
+
+#: ../../Zotlabs/Module/Dreport.php:10 ../../Zotlabs/Module/Dreport.php:49
+#: ../../Zotlabs/Module/Group.php:72 ../../Zotlabs/Module/Import_items.php:112
+#: ../../Zotlabs/Module/Like.php:284 ../../Zotlabs/Module/Profperm.php:28
+#: ../../Zotlabs/Module/Subthread.php:62 ../../include/items.php:423
+#: ../../index.php:173
+msgid "Permission denied"
+msgstr "Toegang geweigerd"
+
+#: ../../Zotlabs/Module/Dreport.php:27
+msgid "Invalid message"
+msgstr "Ongeldig bericht"
+
+#: ../../Zotlabs/Module/Dreport.php:59
+msgid "no results"
+msgstr "geen resultaten"
+
+#: ../../Zotlabs/Module/Dreport.php:64
+#, php-format
+msgid "Delivery report for %1$s"
+msgstr "Afleveringsrapport voor %1$s"
+
+#: ../../Zotlabs/Module/Dreport.php:78
+msgid "channel sync processed"
+msgstr "kanaalsync verwerkt"
+
+#: ../../Zotlabs/Module/Dreport.php:82
+msgid "queued"
+msgstr "in wachtrij"
+
+#: ../../Zotlabs/Module/Dreport.php:86
+msgid "posted"
+msgstr "verstuurd"
+
+#: ../../Zotlabs/Module/Dreport.php:90
+msgid "accepted for delivery"
+msgstr "geaccepteerd om afgeleverd te worden"
+
+#: ../../Zotlabs/Module/Dreport.php:94
+msgid "updated"
+msgstr "geüpdatet"
+
+#: ../../Zotlabs/Module/Dreport.php:97
+msgid "update ignored"
+msgstr "update genegeerd"
+
+#: ../../Zotlabs/Module/Dreport.php:100
+msgid "permission denied"
+msgstr "toegang geweigerd"
+
+#: ../../Zotlabs/Module/Dreport.php:104
+msgid "recipient not found"
+msgstr "ontvanger niet gevonden"
+
+#: ../../Zotlabs/Module/Dreport.php:107
+msgid "mail recalled"
+msgstr "Privébericht ingetrokken"
+
+#: ../../Zotlabs/Module/Dreport.php:110
+msgid "duplicate mail received"
+msgstr "dubbel privébericht ontvangen"
+
+#: ../../Zotlabs/Module/Dreport.php:113
+msgid "mail delivered"
+msgstr "privébericht afgeleverd"
+
+#: ../../Zotlabs/Module/Editblock.php:82 ../../Zotlabs/Module/Editblock.php:98
+#: ../../Zotlabs/Module/Editlayout.php:80 ../../Zotlabs/Module/Editpost.php:24
+#: ../../Zotlabs/Module/Editwebpage.php:81
+msgid "Item not found"
+msgstr "Item niet gevonden"
+
+#: ../../Zotlabs/Module/Editblock.php:122
+msgid "Delete block?"
+msgstr "Blok verwijderen"
+
+#: ../../Zotlabs/Module/Editblock.php:141
+#: ../../Zotlabs/Module/Editlayout.php:140
+#: ../../Zotlabs/Module/Editpost.php:119
+#: ../../Zotlabs/Module/Editwebpage.php:182 ../../include/ItemObject.php:704
+#: ../../include/conversation.php:1216
+msgid "Bold"
+msgstr "Vet"
+
+#: ../../Zotlabs/Module/Editblock.php:142
+#: ../../Zotlabs/Module/Editlayout.php:141
+#: ../../Zotlabs/Module/Editpost.php:120
+#: ../../Zotlabs/Module/Editwebpage.php:183 ../../include/ItemObject.php:705
+#: ../../include/conversation.php:1217
+msgid "Italic"
+msgstr "Cursief"
+
+#: ../../Zotlabs/Module/Editblock.php:143
+#: ../../Zotlabs/Module/Editlayout.php:142
+#: ../../Zotlabs/Module/Editpost.php:121
+#: ../../Zotlabs/Module/Editwebpage.php:184 ../../include/ItemObject.php:706
+#: ../../include/conversation.php:1218
+msgid "Underline"
+msgstr "Onderstrepen"
+
+#: ../../Zotlabs/Module/Editblock.php:144
+#: ../../Zotlabs/Module/Editlayout.php:143
+#: ../../Zotlabs/Module/Editpost.php:122
+#: ../../Zotlabs/Module/Editwebpage.php:185 ../../include/ItemObject.php:707
+#: ../../include/conversation.php:1219
+msgid "Quote"
+msgstr "Citeren"
+
+#: ../../Zotlabs/Module/Editblock.php:145
+#: ../../Zotlabs/Module/Editlayout.php:144
+#: ../../Zotlabs/Module/Editpost.php:123
+#: ../../Zotlabs/Module/Editwebpage.php:186 ../../include/ItemObject.php:708
+#: ../../include/conversation.php:1220
+msgid "Code"
+msgstr "Broncode"
+
+#: ../../Zotlabs/Module/Editblock.php:147
+#: ../../Zotlabs/Module/Editlayout.php:145
+#: ../../Zotlabs/Module/Editpost.php:124
+#: ../../Zotlabs/Module/Editwebpage.php:187
+#: ../../include/conversation.php:1221
+msgid "Upload photo"
+msgstr "Foto uploaden"
+
+#: ../../Zotlabs/Module/Editblock.php:148
+#: ../../Zotlabs/Module/Editlayout.php:146
+#: ../../Zotlabs/Module/Editpost.php:125
+#: ../../Zotlabs/Module/Editwebpage.php:188 ../../Zotlabs/Module/Mail.php:252
+#: ../../Zotlabs/Module/Mail.php:382 ../../include/conversation.php:1223
+msgid "Attach file"
+msgstr "Bestand toevoegen"
+
+#: ../../Zotlabs/Module/Editblock.php:150
+#: ../../Zotlabs/Module/Editlayout.php:148
+#: ../../Zotlabs/Module/Editpost.php:127
+#: ../../Zotlabs/Module/Editwebpage.php:190
+msgid "Insert YouTube video"
+msgstr "YouTube-video invoegen"
+
+#: ../../Zotlabs/Module/Editblock.php:151
+#: ../../Zotlabs/Module/Editlayout.php:149
+#: ../../Zotlabs/Module/Editpost.php:128
+#: ../../Zotlabs/Module/Editwebpage.php:191
+msgid "Insert Vorbis [.ogg] video"
+msgstr "Vorbis-video [.ogg] invoegen"
+
+#: ../../Zotlabs/Module/Editblock.php:152
+#: ../../Zotlabs/Module/Editlayout.php:150
+#: ../../Zotlabs/Module/Editpost.php:129
+#: ../../Zotlabs/Module/Editwebpage.php:192
+msgid "Insert Vorbis [.ogg] audio"
+msgstr "Vorbis-audio [.ogg] invoegen"
+
+#: ../../Zotlabs/Module/Editblock.php:153
+#: ../../Zotlabs/Module/Editlayout.php:151
+#: ../../Zotlabs/Module/Editpost.php:130
+#: ../../Zotlabs/Module/Editwebpage.php:193
+#: ../../include/conversation.php:1231
+msgid "Set your location"
+msgstr "Locatie instellen"
+
+#: ../../Zotlabs/Module/Editblock.php:154
+#: ../../Zotlabs/Module/Editlayout.php:152
+#: ../../Zotlabs/Module/Editpost.php:131
+#: ../../Zotlabs/Module/Editwebpage.php:194
+#: ../../include/conversation.php:1236
+msgid "Clear browser location"
+msgstr "Locatie van webbrowser wissen"
+
+#: ../../Zotlabs/Module/Editblock.php:155
+#: ../../Zotlabs/Module/Editlayout.php:153
+#: ../../Zotlabs/Module/Editpost.php:135
+#: ../../Zotlabs/Module/Editwebpage.php:195
+#: ../../Zotlabs/Module/Photos.php:1072 ../../include/ItemObject.php:389
+#: ../../include/conversation.php:740 ../../include/conversation.php:1244
+msgid "Please wait"
+msgstr "Even wachten"
+
+#: ../../Zotlabs/Module/Editblock.php:156
+#: ../../Zotlabs/Module/Editlayout.php:154
+#: ../../Zotlabs/Module/Editpost.php:136
+#: ../../Zotlabs/Module/Editwebpage.php:196
+#: ../../Zotlabs/Module/Events.php:470 ../../include/conversation.php:1245
+msgid "Permission settings"
+msgstr "Permissies"
+
+#: ../../Zotlabs/Module/Editblock.php:164
+#: ../../Zotlabs/Module/Editlayout.php:161
+#: ../../Zotlabs/Module/Editpost.php:144
+#: ../../Zotlabs/Module/Editwebpage.php:205
+#: ../../include/conversation.php:1254
+msgid "Public post"
+msgstr "Openbaar bericht"
+
+#: ../../Zotlabs/Module/Editblock.php:167
+#: ../../Zotlabs/Module/Editpost.php:147
+#: ../../Zotlabs/Module/Editwebpage.php:210
+#: ../../include/conversation.php:1239
+msgid "Title (optional)"
+msgstr "Titel (optioneel)"
+
+#: ../../Zotlabs/Module/Editblock.php:170
+#: ../../Zotlabs/Module/Editlayout.php:168
+#: ../../Zotlabs/Module/Editpost.php:149
+#: ../../Zotlabs/Module/Editwebpage.php:212
+#: ../../include/conversation.php:1243
+msgid "Categories (optional, comma-separated list)"
+msgstr "Categorieën (optioneel, door komma's gescheiden lijst)"
+
+#: ../../Zotlabs/Module/Editblock.php:171
+#: ../../Zotlabs/Module/Editlayout.php:169
+#: ../../Zotlabs/Module/Editpost.php:150
+#: ../../Zotlabs/Module/Editwebpage.php:213
+#: ../../include/conversation.php:1256
+msgid "Example: bob@example.com, mary@example.com"
+msgstr "Voorbeeld: bob@voorbeeld.nl, mary@voorbeeld.be"
+
+#: ../../Zotlabs/Module/Editblock.php:176
+#: ../../Zotlabs/Module/Editpost.php:155
+#: ../../Zotlabs/Module/Editwebpage.php:217
+#: ../../Zotlabs/Module/Events.php:469 ../../Zotlabs/Module/Photos.php:1092
+#: ../../Zotlabs/Module/Webpages.php:196 ../../include/ItemObject.php:712
+#: ../../include/conversation.php:1186 ../../include/page_widgets.php:40
+msgid "Preview"
+msgstr "Voorvertoning"
+
+#: ../../Zotlabs/Module/Editblock.php:181
+#: ../../Zotlabs/Module/Editlayout.php:178
+#: ../../Zotlabs/Module/Editpost.php:161
+#: ../../Zotlabs/Module/Editwebpage.php:222 ../../Zotlabs/Module/Mail.php:257
+#: ../../Zotlabs/Module/Mail.php:387 ../../include/conversation.php:1269
+msgid "Set expiration date"
+msgstr "Verloopdatum instellen"
+
+#: ../../Zotlabs/Module/Editblock.php:186
+msgid "Edit Block"
+msgstr "Blok bewerken"
+
+#: ../../Zotlabs/Module/Editlayout.php:116
+msgid "Delete layout?"
+msgstr "Lay-out verwijderen?"
+
+#: ../../Zotlabs/Module/Editlayout.php:164
+#: ../../Zotlabs/Module/Layouts.php:128
+msgid "Layout Description (Optional)"
+msgstr "Lay-out-omschrijving (optioneel)"
+
+#: ../../Zotlabs/Module/Editlayout.php:166
+#: ../../Zotlabs/Module/Layouts.php:125 ../../Zotlabs/Module/Layouts.php:184
+msgid "Layout Name"
+msgstr "Naam lay-out"
+
+#: ../../Zotlabs/Module/Editlayout.php:183
+msgid "Edit Layout"
+msgstr "Lay-out bewerken"
+
+#: ../../Zotlabs/Module/Editpost.php:35
+msgid "Item is not editable"
+msgstr "Item is niet te bewerken"
+
+#: ../../Zotlabs/Module/Editpost.php:60 ../../Zotlabs/Module/Mail.php:207
+#: ../../Zotlabs/Module/Mail.php:321 ../../include/conversation.php:1176
+msgid "Expires YYYY-MM-DD HH:MM"
+msgstr "Verloopt op DD-MM-YYYY om HH:MM"
+
+#: ../../Zotlabs/Module/Editpost.php:61
+msgid "Delete item?"
+msgstr "Item verwijderen?"
+
+#: ../../Zotlabs/Module/Editpost.php:132 ../../include/conversation.php:1233
+msgid "Toggle voting"
+msgstr "Peiling in- of uitschakelen"
+
+#: ../../Zotlabs/Module/Editpost.php:165 ../../include/conversation.php:1276
+msgid "OK"
+msgstr "OK"
+
+#: ../../Zotlabs/Module/Editpost.php:166 ../../Zotlabs/Module/Fbrowser.php:66
+#: ../../Zotlabs/Module/Fbrowser.php:88 ../../Zotlabs/Module/Settings.php:589
+#: ../../Zotlabs/Module/Settings.php:615 ../../Zotlabs/Module/Tagrm.php:15
+#: ../../Zotlabs/Module/Tagrm.php:138 ../../include/conversation.php:1277
+msgid "Cancel"
+msgstr "Annuleren"
+
+#: ../../Zotlabs/Module/Editpost.php:171 ../../Zotlabs/Module/Rpost.php:134
+msgid "Edit post"
+msgstr "Bericht bewerken"
+
+#: ../../Zotlabs/Module/Editwebpage.php:157
+msgid "Delete webpage?"
+msgstr "Webpagina verwijderen?"
+
+#: ../../Zotlabs/Module/Editwebpage.php:177
+msgid "Page link title"
+msgstr "Titel van paginalink"
+
+#: ../../Zotlabs/Module/Editwebpage.php:227
+msgid "Edit Webpage"
+msgstr "Webpagina bewerken"
+
+#: ../../Zotlabs/Module/Events.php:25
+msgid "Calendar entries imported."
+msgstr "Agenda-items geïmporteerd."
+
+#: ../../Zotlabs/Module/Events.php:27
+msgid "No calendar entries found."
+msgstr "Geen agenda-items gevonden."
+
+#: ../../Zotlabs/Module/Events.php:104
+msgid "Event can not end before it has started."
+msgstr "Gebeurtenis kan niet eindigen voordat het is begonnen"
+
+#: ../../Zotlabs/Module/Events.php:106 ../../Zotlabs/Module/Events.php:115
+#: ../../Zotlabs/Module/Events.php:135
+msgid "Unable to generate preview."
+msgstr "Niet in staat om voorvertoning te genereren"
+
+#: ../../Zotlabs/Module/Events.php:113
+msgid "Event title and start time are required."
+msgstr "Titel en begintijd van gebeurtenis zijn vereist."
+
+#: ../../Zotlabs/Module/Events.php:133 ../../Zotlabs/Module/Events.php:258
+msgid "Event not found."
+msgstr "Gebeurtenis niet gevonden"
+
+#: ../../Zotlabs/Module/Events.php:253 ../../Zotlabs/Module/Like.php:373
+#: ../../Zotlabs/Module/Tagger.php:51 ../../include/conversation.php:123
+#: ../../include/event.php:915 ../../include/text.php:1970
+msgid "event"
+msgstr "gebeurtenis"
+
+#: ../../Zotlabs/Module/Events.php:448
+msgid "Edit event title"
+msgstr "Titel bewerken"
+
+#: ../../Zotlabs/Module/Events.php:448
+msgid "Event title"
+msgstr "Titel"
+
+#: ../../Zotlabs/Module/Events.php:450
+msgid "Categories (comma-separated list)"
+msgstr "Categorieën (door komma's gescheiden lijst)"
+
+#: ../../Zotlabs/Module/Events.php:451
+msgid "Edit Category"
+msgstr "Categorie"
+
+#: ../../Zotlabs/Module/Events.php:451
+msgid "Category"
+msgstr "Categorie"
+
+#: ../../Zotlabs/Module/Events.php:454
+msgid "Edit start date and time"
+msgstr "Begindatum en -tijd bewerken"
+
+#: ../../Zotlabs/Module/Events.php:454
+msgid "Start date and time"
+msgstr "Begindatum en -tijd"
+
+#: ../../Zotlabs/Module/Events.php:455 ../../Zotlabs/Module/Events.php:458
+msgid "Finish date and time are not known or not relevant"
+msgstr "Einddatum en -tijd zijn niet bekend of niet van toepassing"
+
+#: ../../Zotlabs/Module/Events.php:457
+msgid "Edit finish date and time"
+msgstr "Einddatum en -tijd bewerken"
+
+#: ../../Zotlabs/Module/Events.php:457
+msgid "Finish date and time"
+msgstr "Einddatum en -tijd"
+
+#: ../../Zotlabs/Module/Events.php:459 ../../Zotlabs/Module/Events.php:460
+msgid "Adjust for viewer timezone"
+msgstr "Aanpassen aan de tijdzone van wie deze gebeurtenis bekijkt"
+
+#: ../../Zotlabs/Module/Events.php:459
+msgid ""
+"Important for events that happen in a particular place. Not practical for "
+"global holidays."
+msgstr "Belangrijk voor gebeurtenissen die op een bepaalde locatie plaatsvinden. Niet praktisch voor wereldwijde feestdagen."
+
+#: ../../Zotlabs/Module/Events.php:461
+msgid "Edit Description"
+msgstr "Omschrijving bewerken"
+
+#: ../../Zotlabs/Module/Events.php:463
+msgid "Edit Location"
+msgstr "Locatie bewerken"
+
+#: ../../Zotlabs/Module/Events.php:463 ../../Zotlabs/Module/Locs.php:117
+#: ../../Zotlabs/Module/Profiles.php:476 ../../Zotlabs/Module/Profiles.php:701
+#: ../../Zotlabs/Module/Pubsites.php:40 ../../include/js_strings.php:25
+msgid "Location"
+msgstr "Locatie"
+
+#: ../../Zotlabs/Module/Events.php:466 ../../Zotlabs/Module/Events.php:468
+msgid "Share this event"
+msgstr "Deel deze gebeurtenis"
+
+#: ../../Zotlabs/Module/Events.php:473
+msgid "Advanced Options"
+msgstr "Geavanceerde opties"
+
+#: ../../Zotlabs/Module/Events.php:607
+msgid "Edit event"
+msgstr "Gebeurtenis bewerken"
+
+#: ../../Zotlabs/Module/Events.php:609
+msgid "Delete event"
+msgstr "Gebeurtenis verwijderen"
+
+#: ../../Zotlabs/Module/Events.php:643
+msgid "calendar"
+msgstr "agenda"
+
+#: ../../Zotlabs/Module/Events.php:703
+msgid "Event removed"
+msgstr "Gebeurtenis verwijderd"
+
+#: ../../Zotlabs/Module/Events.php:706
+msgid "Failed to remove event"
+msgstr "Verwijderen gebeurtenis mislukt"
+
+#: ../../Zotlabs/Module/Fbrowser.php:29 ../../include/apps.php:139
+#: ../../include/conversation.php:1650 ../../include/nav.php:92
+msgid "Photos"
+msgstr "Foto's"
+
+#: ../../Zotlabs/Module/Ffsapi.php:12
+msgid "Share content from Firefox to $Projectname"
+msgstr "Deel webpagina's vanuit Firefox met "
+
+#: ../../Zotlabs/Module/Ffsapi.php:15
+msgid "Activate the Firefox $Projectname provider"
+msgstr "Activeer de $Projectname-service in Firefox"
+
+#: ../../Zotlabs/Module/Filer.php:52 ../../include/conversation.php:1174
+msgid "Save to Folder:"
+msgstr "Bewaar in map: "
+
+#: ../../Zotlabs/Module/Filer.php:52
+msgid "- select -"
+msgstr "- kies map -"
+
+#: ../../Zotlabs/Module/Filestorage.php:86
+msgid "Permission Denied."
+msgstr "Toegang geweigerd"
+
+#: ../../Zotlabs/Module/Filestorage.php:102
+msgid "File not found."
+msgstr "Bestand niet gevonden."
+
+#: ../../Zotlabs/Module/Filestorage.php:145
+msgid "Edit file permissions"
+msgstr "Bestandsrechten bewerken"
+
+#: ../../Zotlabs/Module/Filestorage.php:154
+msgid "Set/edit permissions"
+msgstr "Rechten instellen/bewerken"
+
+#: ../../Zotlabs/Module/Filestorage.php:155
+msgid "Include all files and sub folders"
+msgstr "Toepassen op alle bestanden en submappen"
+
+#: ../../Zotlabs/Module/Filestorage.php:156
+msgid "Return to file list"
+msgstr "Terugkeren naar bestandlijst "
+
+#: ../../Zotlabs/Module/Filestorage.php:158
+msgid "Copy/paste this code to attach file to a post"
+msgstr "Kopieer/plak deze code om het bestand aan een bericht te koppelen"
+
+#: ../../Zotlabs/Module/Filestorage.php:159
+msgid "Copy/paste this URL to link file from a web page"
+msgstr "Kopieer/plak deze URL om het bestand aan een externe webpagina te koppelen"
+
+#: ../../Zotlabs/Module/Filestorage.php:161
+msgid "Share this file"
+msgstr "Dit bestand delen"
+
+#: ../../Zotlabs/Module/Filestorage.php:162
+msgid "Show URL to this file"
+msgstr "Toon URL van dit bestand"
+
+#: ../../Zotlabs/Module/Filestorage.php:163
+msgid "Notify your contacts about this file"
+msgstr "Jouw connecties over dit bestand berichten"
+
+#: ../../Zotlabs/Module/Follow.php:31
+msgid "Channel added."
+msgstr "Kanaal toegevoegd."
+
+#: ../../Zotlabs/Module/Fsuggest.php:24 ../../Zotlabs/Module/Fsuggest.php:96
+msgid "Contact not found."
+msgstr "Contact niet gevonden"
+
+#: ../../Zotlabs/Module/Fsuggest.php:67
+msgid "Friend suggestion sent."
+msgstr "Kanaalvoorstel verzonden."
+
+#: ../../Zotlabs/Module/Fsuggest.php:101
+msgid "Suggest Friends"
+msgstr "Kanalen voorstellen"
+
+#: ../../Zotlabs/Module/Fsuggest.php:103
+#, php-format
+msgid "Suggest a friend for %s"
+msgstr "Stel een kanaal voor aan %s"
+
+#: ../../Zotlabs/Module/Group.php:24
+msgid "Privacy group created."
+msgstr "Privacygroep aangemaakt"
+
+#: ../../Zotlabs/Module/Group.php:30
+msgid "Could not create privacy group."
+msgstr "Kon privacygroep niet aanmaken"
+
+#: ../../Zotlabs/Module/Group.php:42 ../../Zotlabs/Module/Group.php:141
+#: ../../include/items.php:5126
+msgid "Privacy group not found."
+msgstr "Privacygroep niet gevonden"
+
+#: ../../Zotlabs/Module/Group.php:58
+msgid "Privacy group updated."
+msgstr "Privacygroep bijgewerkt"
+
+#: ../../Zotlabs/Module/Group.php:90
+msgid "Create a group of channels."
+msgstr "Privacygroep met kanalen aanmaken"
+
+#: ../../Zotlabs/Module/Group.php:91 ../../Zotlabs/Module/Group.php:184
+msgid "Privacy group name: "
+msgstr "Naam privacygroep: "
+
+#: ../../Zotlabs/Module/Group.php:93 ../../Zotlabs/Module/Group.php:187
+msgid "Members are visible to other channels"
+msgstr "Kanalen in deze privacygroep zijn zichtbaar voor andere kanalen"
+
+#: ../../Zotlabs/Module/Group.php:111
+msgid "Privacy group removed."
+msgstr "Privacygroep verwijderd."
+
+#: ../../Zotlabs/Module/Group.php:113
+msgid "Unable to remove privacy group."
+msgstr "Verwijderen privacygroep mislukt"
+
+#: ../../Zotlabs/Module/Group.php:183
+msgid "Privacy group editor"
+msgstr "Privacygroep bewerken"
+
+#: ../../Zotlabs/Module/Group.php:197
+msgid "Members"
+msgstr "Kanalen"
+
+#: ../../Zotlabs/Module/Group.php:199
+msgid "All Connected Channels"
+msgstr "Alle kanaalconnecties"
+
+#: ../../Zotlabs/Module/Group.php:231
+msgid "Click on a channel to add or remove."
+msgstr "Klik op een kanaal om deze toe te voegen of te verwijderen."
+
+#: ../../Zotlabs/Module/Help.php:26
+msgid "Documentation Search"
+msgstr "Zoek documentatie"
+
+#: ../../Zotlabs/Module/Help.php:67 ../../Zotlabs/Module/Help.php:73
+#: ../../Zotlabs/Module/Help.php:79
+msgid "Help:"
+msgstr "Hulp:"
+
+#: ../../Zotlabs/Module/Help.php:85 ../../Zotlabs/Module/Help.php:90
+#: ../../Zotlabs/Module/Layouts.php:181 ../../include/apps.php:142
+#: ../../include/nav.php:161
+msgid "Help"
+msgstr "Hulp"
+
+#: ../../Zotlabs/Module/Help.php:120
+msgid "$Projectname Documentation"
+msgstr "$Projectname-documentatie"
+
+#: ../../Zotlabs/Module/Home.php:61 ../../Zotlabs/Module/Home.php:69
+#: ../../Zotlabs/Module/Siteinfo.php:65
+msgid "$Projectname"
+msgstr "$Projectname"
+
+#: ../../Zotlabs/Module/Home.php:79
+#, php-format
+msgid "Welcome to %s"
+msgstr "Welkom op %s"
+
+#: ../../Zotlabs/Module/Id.php:13
+msgid "First Name"
+msgstr "Voornaam"
+
+#: ../../Zotlabs/Module/Id.php:14
+msgid "Last Name"
+msgstr "Achternaam"
+
+#: ../../Zotlabs/Module/Id.php:15
+msgid "Nickname"
+msgstr "Bijnaam"
+
+#: ../../Zotlabs/Module/Id.php:16
+msgid "Full Name"
+msgstr "Volledige naam"
+
+#: ../../Zotlabs/Module/Id.php:19 ../../Zotlabs/Module/Id.php:20
+#: ../../Zotlabs/Module/Id.php:21 ../../include/apps.php:155
+msgid "Profile Photo"
+msgstr "Profielfoto"
+
+#: ../../Zotlabs/Module/Id.php:22
+msgid "Profile Photo 16px"
+msgstr "Profielfoto 16px"
+
+#: ../../Zotlabs/Module/Id.php:23
+msgid "Profile Photo 32px"
+msgstr "Profielfoto 32px"
+
+#: ../../Zotlabs/Module/Id.php:24
+msgid "Profile Photo 48px"
+msgstr "Profielfoto 48px"
+
+#: ../../Zotlabs/Module/Id.php:25
+msgid "Profile Photo 64px"
+msgstr "Profielfoto 64px"
+
+#: ../../Zotlabs/Module/Id.php:26
+msgid "Profile Photo 80px"
+msgstr "Profielfoto 80px"
+
+#: ../../Zotlabs/Module/Id.php:27
+msgid "Profile Photo 128px"
+msgstr "Profielfoto 128px"
+
+#: ../../Zotlabs/Module/Id.php:28
+msgid "Timezone"
+msgstr "Tijdzone"
+
+#: ../../Zotlabs/Module/Id.php:29 ../../Zotlabs/Module/Profiles.php:734
+msgid "Homepage URL"
+msgstr "URL homepagina"
+
+#: ../../Zotlabs/Module/Id.php:30 ../../include/apps.php:153
+msgid "Language"
+msgstr "Taal"
+
+#: ../../Zotlabs/Module/Id.php:31
+msgid "Birth Year"
+msgstr "Geboortejaar"
+
+#: ../../Zotlabs/Module/Id.php:32
+msgid "Birth Month"
+msgstr "Geboortemaand"
+
+#: ../../Zotlabs/Module/Id.php:33
+msgid "Birth Day"
+msgstr "Geboortedag"
+
+#: ../../Zotlabs/Module/Id.php:34
+msgid "Birthdate"
+msgstr "Geboortedatum"
+
+#: ../../Zotlabs/Module/Id.php:35 ../../Zotlabs/Module/Profiles.php:453
+msgid "Gender"
+msgstr "Geslacht"
+
+#: ../../Zotlabs/Module/Id.php:108 ../../include/profile_selectors.php:6
+#: ../../include/profile_selectors.php:23
+msgid "Male"
+msgstr "Man"
+
+#: ../../Zotlabs/Module/Id.php:110 ../../include/profile_selectors.php:6
+#: ../../include/profile_selectors.php:23
+msgid "Female"
+msgstr "Vrouw"
+
+#: ../../Zotlabs/Module/Impel.php:41 ../../include/bbcode.php:193
+msgid "webpage"
+msgstr "Webpagina"
+
+#: ../../Zotlabs/Module/Impel.php:46 ../../include/bbcode.php:199
+msgid "block"
+msgstr "blok"
+
+#: ../../Zotlabs/Module/Impel.php:51 ../../include/bbcode.php:196
+msgid "layout"
+msgstr "lay-out"
+
+#: ../../Zotlabs/Module/Impel.php:58 ../../include/bbcode.php:202
+msgid "menu"
+msgstr "menu"
+
+#: ../../Zotlabs/Module/Impel.php:196
+#, php-format
+msgid "%s element installed"
+msgstr "%s onderdeel geïnstalleerd"
+
+#: ../../Zotlabs/Module/Impel.php:199
+#, php-format
+msgid "%s element installation failed"
+msgstr "Installatie %s-element mislukt"
+
+#: ../../Zotlabs/Module/Import.php:32
+#, php-format
+msgid "Your service plan only allows %d channels."
+msgstr "Jouw abonnement staat maar %d kanalen toe."
+
+#: ../../Zotlabs/Module/Import.php:70 ../../Zotlabs/Module/Import_items.php:42
+msgid "Nothing to import."
+msgstr "Niets gevonden om te importeren"
+
+#: ../../Zotlabs/Module/Import.php:94 ../../Zotlabs/Module/Import_items.php:66
+msgid "Unable to download data from old server"
+msgstr "Niet in staat om gegevens van de oude hub te downloaden"
+
+#: ../../Zotlabs/Module/Import.php:100
+#: ../../Zotlabs/Module/Import_items.php:72
+msgid "Imported file is empty."
+msgstr "Geïmporteerde bestand is leeg"
+
+#: ../../Zotlabs/Module/Import.php:122
+#: ../../Zotlabs/Module/Import_items.php:86
+#, php-format
+msgid "Warning: Database versions differ by %1$d updates."
+msgstr "Waarschuwing: database-versies lopen %1$d updates achter."
+
+#: ../../Zotlabs/Module/Import.php:150 ../../include/import.php:80
+msgid "Cloned channel not found. Import failed."
+msgstr "Gekloond kanaal niet gevonden. Importeren mislukt."
+
+#: ../../Zotlabs/Module/Import.php:160
+msgid "No channel. Import failed."
+msgstr "Geen kanaal. Importeren mislukt."
+
+#: ../../Zotlabs/Module/Import.php:506
+#: ../../include/Import/import_diaspora.php:143
+msgid "Import completed."
+msgstr "Import voltooid."
+
+#: ../../Zotlabs/Module/Import.php:528
+msgid "You must be logged in to use this feature."
+msgstr "Je moet ingelogd zijn om dit onderdeel te kunnen gebruiken."
+
+#: ../../Zotlabs/Module/Import.php:533
+msgid "Import Channel"
+msgstr "Kanaal importeren"
+
+#: ../../Zotlabs/Module/Import.php:534
+msgid ""
+"Use this form to import an existing channel from a different server/hub. You"
+" may retrieve the channel identity from the old server/hub via the network "
+"or provide an export file."
+msgstr "Gebruik dit formulier om een bestaand kanaal te importeren van een andere hub. Je kan de kanaal-identiteit van de oude hub via het netwerk ontvangen of een exportbestand verstrekken."
+
+#: ../../Zotlabs/Module/Import.php:535
+#: ../../Zotlabs/Module/Import_items.php:119
+msgid "File to Upload"
+msgstr "Bestand om te uploaden"
+
+#: ../../Zotlabs/Module/Import.php:536
+msgid "Or provide the old server/hub details"
+msgstr "Of vul de gegevens van de oude hub in"
+
+#: ../../Zotlabs/Module/Import.php:537
+msgid "Your old identity address (xyz@example.com)"
+msgstr "Jouw oude kanaaladres (xyz@example.com)"
+
+#: ../../Zotlabs/Module/Import.php:538
+msgid "Your old login email address"
+msgstr "Het e-mailadres van je oude account"
+
+#: ../../Zotlabs/Module/Import.php:539
+msgid "Your old login password"
+msgstr "Wachtwoord van jouw oude account"
+
+#: ../../Zotlabs/Module/Import.php:540
+msgid ""
+"For either option, please choose whether to make this hub your new primary "
+"address, or whether your old location should continue this role. You will be"
+" able to post from either location, but only one can be marked as the "
+"primary location for files, photos, and media."
+msgstr "Voor elke optie geldt dat je moet kiezen of je jouw primaire kanaaladres op deze hub wil instellen of dat jouw oude hub deze rol blijft vervullen."
+
+#: ../../Zotlabs/Module/Import.php:541
+msgid "Make this hub my primary location"
+msgstr "Stel deze hub als mijn primaire locatie in"
+
+#: ../../Zotlabs/Module/Import.php:542
+msgid ""
+"Import existing posts if possible (experimental - limited by available "
+"memory"
+msgstr "Importeer bestaande berichten wanneer mogelijk (experimenteel - afhankelijk van beschikbaar servergeheugen)"
+
+#: ../../Zotlabs/Module/Import.php:543
+msgid ""
+"This process may take several minutes to complete. Please submit the form "
+"only once and leave this page open until finished."
+msgstr "Dit proces kan enkele minuten in beslag nemen. Klik maar één keer op opslaan en verlaat deze pagina niet alvorens het proces is voltooid."
+
+#: ../../Zotlabs/Module/Import_items.php:102
+msgid "Import completed"
+msgstr "Importeren voltooid"
+
+#: ../../Zotlabs/Module/Import_items.php:117
+msgid "Import Items"
+msgstr "Importeer items"
+
+#: ../../Zotlabs/Module/Import_items.php:118
+msgid ""
+"Use this form to import existing posts and content from an export file."
+msgstr "Gebruik dit formulier om bestaande berichten en andere inhoud vanuit een exportbestand te importeren."
+
+#: ../../Zotlabs/Module/Invite.php:29
+msgid "Total invitation limit exceeded."
+msgstr "Limiet voor aantal uitnodigingen overschreden."
+
+#: ../../Zotlabs/Module/Invite.php:53
+#, php-format
+msgid "%s : Not a valid email address."
+msgstr "%s : Geen geldig e-mailadres."
+
+#: ../../Zotlabs/Module/Invite.php:63
+msgid "Please join us on $Projectname"
+msgstr "Uitnodiging voor $Projectname"
+
+#: ../../Zotlabs/Module/Invite.php:74
+msgid "Invitation limit exceeded. Please contact your site administrator."
+msgstr "Limiet voor aantal uitnodigingen overschreden. Neem contact op met je hub-beheerder."
+
+#: ../../Zotlabs/Module/Invite.php:79
+#, php-format
+msgid "%s : Message delivery failed."
+msgstr "%s: Aflevering bericht mislukt."
+
+#: ../../Zotlabs/Module/Invite.php:83
+#, php-format
+msgid "%d message sent."
+msgid_plural "%d messages sent."
+msgstr[0] "%d bericht verzonden."
+msgstr[1] "%d berichten verzonden."
+
+#: ../../Zotlabs/Module/Invite.php:102
+msgid "You have no more invitations available"
+msgstr "Je hebt geen uitnodigingen meer beschikbaar"
+
+#: ../../Zotlabs/Module/Invite.php:133
+msgid "Send invitations"
+msgstr "Uitnodigingen verzenden"
+
+#: ../../Zotlabs/Module/Invite.php:134
+msgid "Enter email addresses, one per line:"
+msgstr "Voer e-mailadressen in, één per regel:"
+
+#: ../../Zotlabs/Module/Invite.php:135 ../../Zotlabs/Module/Mail.php:250
+msgid "Your message:"
+msgstr "Jouw bericht:"
+
+#: ../../Zotlabs/Module/Invite.php:136
+msgid "Please join my community on $Projectname."
+msgstr "Hierbij nodig ik je uit om mij, en andere vrienden en kennissen, op $Projectname te vergezellen. Lees meer over $Projectname op http://hubzilla.org"
+
+#: ../../Zotlabs/Module/Invite.php:138
+msgid "You will need to supply this invitation code:"
+msgstr "Je moet deze uitnodigingscode opgeven:"
+
+#: ../../Zotlabs/Module/Invite.php:139
+msgid ""
+"1. Register at any $Projectname location (they are all inter-connected)"
+msgstr "1. Registreer je op een willekeurige $Projectname-hub (ze zijn allemaal onderling met elkaar verbonden):"
+
+#: ../../Zotlabs/Module/Invite.php:141
+msgid "2. Enter my $Projectname network address into the site searchbar."
+msgstr "2. Nadat je bent ingelogd en een kanaal hebt aangemaakt kan je mijn $Projectname-kanaaladres in het zoekveld invullen:"
+
+#: ../../Zotlabs/Module/Invite.php:142
+msgid "or visit"
+msgstr "of bezoek"
+
+#: ../../Zotlabs/Module/Invite.php:144
+msgid "3. Click [Connect]"
+msgstr "3. Klik op [+ Verbinden]"
+
+#: ../../Zotlabs/Module/Item.php:178
+msgid "Unable to locate original post."
+msgstr "Niet in staat om de originele locatie van het bericht te vinden. "
+
+#: ../../Zotlabs/Module/Item.php:427
+msgid "Empty post discarded."
+msgstr "Leeg bericht geannuleerd"
+
+#: ../../Zotlabs/Module/Item.php:467
+msgid "Executable content type not permitted to this channel."
+msgstr "Uitvoerbare bestanden zijn niet toegestaan op dit kanaal."
+
+#: ../../Zotlabs/Module/Item.php:847
+msgid "Duplicate post suppressed."
+msgstr "Dubbel bericht tegengehouden."
+
+#: ../../Zotlabs/Module/Item.php:977
+msgid "System error. Post not saved."
+msgstr "Systeemfout. Bericht niet opgeslagen."
+
+#: ../../Zotlabs/Module/Item.php:1241
+msgid "Unable to obtain post information from database."
+msgstr "Niet in staat om informatie over dit bericht uit de database te verkrijgen."
+
+#: ../../Zotlabs/Module/Item.php:1248
+#, php-format
+msgid "You have reached your limit of %1$.0f top level posts."
+msgstr "Je hebt jouw limiet van %1$.0f berichten bereikt."
+
+#: ../../Zotlabs/Module/Item.php:1255
+#, php-format
+msgid "You have reached your limit of %1$.0f webpages."
+msgstr "Je hebt jouw limiet van %1$.0f webpagina's bereikt."
+
+#: ../../Zotlabs/Module/Layouts.php:179 ../../include/text.php:2280
+msgid "Layouts"
+msgstr "Lay-outs"
+
+#: ../../Zotlabs/Module/Layouts.php:181
+msgid "Comanche page description language help"
+msgstr "Hulp met de paginabeschrijvingstaal Comanche"
+
+#: ../../Zotlabs/Module/Layouts.php:185
+msgid "Layout Description"
+msgstr "Lay-out-omschrijving"
+
+#: ../../Zotlabs/Module/Layouts.php:190
+msgid "Download PDL file"
+msgstr "Download PDL-bestand"
+
+#: ../../Zotlabs/Module/Like.php:19
+msgid "Like/Dislike"
+msgstr "Leuk/niet leuk"
+
+#: ../../Zotlabs/Module/Like.php:24
+msgid "This action is restricted to members."
+msgstr "Deze actie kan alleen door $Projectname-leden worden uitgevoerd."
+
+#: ../../Zotlabs/Module/Like.php:25
+msgid ""
+"Please <a href=\"rmagic\">login with your $Projectname ID</a> or <a "
+"href=\"register\">register as a new $Projectname member</a> to continue."
+msgstr "Je dient <a href=\"rmagic\">in te loggen met je $Projectname-account</a> of <a href=\"register\">een nieuw $Projectname-account aan te maken</a> om verder te kunnen gaan."
+
+#: ../../Zotlabs/Module/Like.php:105 ../../Zotlabs/Module/Like.php:131
+#: ../../Zotlabs/Module/Like.php:169
+msgid "Invalid request."
+msgstr "Ongeldig verzoek"
+
+#: ../../Zotlabs/Module/Like.php:117 ../../include/conversation.php:126
+msgid "channel"
+msgstr "kanaal"
+
+#: ../../Zotlabs/Module/Like.php:146
+msgid "thing"
+msgstr "ding"
+
+#: ../../Zotlabs/Module/Like.php:192
+msgid "Channel unavailable."
+msgstr "Kanaal niet beschikbaar."
+
+#: ../../Zotlabs/Module/Like.php:240
+msgid "Previous action reversed."
+msgstr "Vorige actie omgedraaid"
+
+#: ../../Zotlabs/Module/Like.php:371 ../../Zotlabs/Module/Subthread.php:87
+#: ../../Zotlabs/Module/Tagger.php:47 ../../include/conversation.php:120
+#: ../../include/text.php:1967
+msgid "photo"
+msgstr "foto"
+
+#: ../../Zotlabs/Module/Like.php:371 ../../Zotlabs/Module/Subthread.php:87
+#: ../../include/conversation.php:148 ../../include/text.php:1973
+msgid "status"
+msgstr "bericht"
+
+#: ../../Zotlabs/Module/Like.php:420 ../../include/conversation.php:164
+#, php-format
+msgid "%1$s likes %2$s's %3$s"
+msgstr "%1$s vindt %3$s van %2$s leuk"
+
+#: ../../Zotlabs/Module/Like.php:422 ../../include/conversation.php:167
+#, php-format
+msgid "%1$s doesn't like %2$s's %3$s"
+msgstr "%1$s vindt %3$s van %2$s niet leuk"
+
+#: ../../Zotlabs/Module/Like.php:424
+#, php-format
+msgid "%1$s agrees with %2$s's %3$s"
+msgstr "%1$s is het eens met %2$s's %3$s"
+
+#: ../../Zotlabs/Module/Like.php:426
+#, php-format
+msgid "%1$s doesn't agree with %2$s's %3$s"
+msgstr "%1$s is het niet eens met %2$s's %3$s"
+
+#: ../../Zotlabs/Module/Like.php:428
+#, php-format
+msgid "%1$s abstains from a decision on %2$s's %3$s"
+msgstr "%1$s onthoudt zich van een besluit over %2$s's %3$s"
+
+#: ../../Zotlabs/Module/Like.php:430
+#, php-format
+msgid "%1$s is attending %2$s's %3$s"
+msgstr "%1$s is aanwezig op %2$s's %3$s"
+
+#: ../../Zotlabs/Module/Like.php:432
+#, php-format
+msgid "%1$s is not attending %2$s's %3$s"
+msgstr "%1$s is niet aanwezig op %2$s's %3$s"
+
+#: ../../Zotlabs/Module/Like.php:434
+#, php-format
+msgid "%1$s may attend %2$s's %3$s"
+msgstr "%1$s is mogelijk aanwezig op %2$s's %3$s"
+
+#: ../../Zotlabs/Module/Like.php:537
+msgid "Action completed."
+msgstr "Actie voltooid"
+
+#: ../../Zotlabs/Module/Like.php:538
+msgid "Thank you."
+msgstr "Bedankt"
+
+#: ../../Zotlabs/Module/Lockview.php:61
+msgid "Remote privacy information not available."
+msgstr "Privacy-informatie op afstand niet beschikbaar."
+
+#: ../../Zotlabs/Module/Lockview.php:82
+msgid "Visible to:"
+msgstr "Zichtbaar voor:"
+
+#: ../../Zotlabs/Module/Locs.php:25 ../../Zotlabs/Module/Locs.php:54
+msgid "Location not found."
+msgstr "Locatie niet gevonden."
+
+#: ../../Zotlabs/Module/Locs.php:62
+msgid "Location lookup failed."
+msgstr "Opzoeken locatie mislukt"
+
+#: ../../Zotlabs/Module/Locs.php:66
+msgid ""
+"Please select another location to become primary before removing the primary"
+" location."
+msgstr "Kies eerst een andere primaire locatie alvorens de huidige primaire locatie te verwijderen."
+
+#: ../../Zotlabs/Module/Locs.php:95
+msgid "Syncing locations"
+msgstr "Locaties synchronizeren"
+
+#: ../../Zotlabs/Module/Locs.php:105
+msgid "No locations found."
+msgstr "Geen locaties gevonden."
+
+#: ../../Zotlabs/Module/Locs.php:116
+msgid "Manage Channel Locations"
+msgstr "Kanaallocaties beheren"
+
+#: ../../Zotlabs/Module/Locs.php:119
+msgid "Primary"
+msgstr "Primair"
+
+#: ../../Zotlabs/Module/Locs.php:120 ../../Zotlabs/Module/Menu.php:113
+msgid "Drop"
+msgstr "Verwijderen"
+
+#: ../../Zotlabs/Module/Locs.php:122
+msgid "Sync Now"
+msgstr "Nu synchroniseren"
+
+#: ../../Zotlabs/Module/Locs.php:123
+msgid "Please wait several minutes between consecutive operations."
+msgstr "Wacht enkele minuten tussen opeenvolgende handelingen."
+
+#: ../../Zotlabs/Module/Locs.php:124
+msgid ""
+"When possible, drop a location by logging into that website/hub and removing"
+" your channel."
+msgstr "Wij adviseren, wanneer dit (nog) mogelijk is, de locatie te verwijderen door op de hub van de kloon in te loggen en het kanaal daar te verwijderen."
+
+#: ../../Zotlabs/Module/Locs.php:125
+msgid "Use this form to drop the location if the hub is no longer operating."
+msgstr "Gebruik dit formulier om de locatie te verwijderen wanneer de hub van de kloon niet meer operationeel is."
+
+#: ../../Zotlabs/Module/Lostpass.php:19
+msgid "No valid account found."
+msgstr "Geen geldige account gevonden."
+
+#: ../../Zotlabs/Module/Lostpass.php:33
+msgid "Password reset request issued. Check your email."
+msgstr "Het verzoek om je wachtwoord opnieuw in te stellen is behandeld. Controleer je e-mail."
+
+#: ../../Zotlabs/Module/Lostpass.php:39 ../../Zotlabs/Module/Lostpass.php:107
+#, php-format
+msgid "Site Member (%s)"
+msgstr "Lid van hub (%s)"
+
+#: ../../Zotlabs/Module/Lostpass.php:44
+#, php-format
+msgid "Password reset requested at %s"
+msgstr "Verzoek tot het opnieuw instellen van een wachtwoord op %s is ingediend"
+
+#: ../../Zotlabs/Module/Lostpass.php:67
+msgid ""
+"Request could not be verified. (You may have previously submitted it.) "
+"Password reset failed."
+msgstr "Het verzoek kon niet worden geverifieerd. (Mogelijk heb je al eerder een verzoek ingediend.) Opnieuw instellen van wachtwoord is mislukt."
+
+#: ../../Zotlabs/Module/Lostpass.php:90 ../../boot.php:1610
+msgid "Password Reset"
+msgstr "Wachtwoord vergeten?"
+
+#: ../../Zotlabs/Module/Lostpass.php:91
+msgid "Your password has been reset as requested."
+msgstr "Jouw wachtwoord is opnieuw ingesteld zoals je had verzocht."
+
+#: ../../Zotlabs/Module/Lostpass.php:92
+msgid "Your new password is"
+msgstr "Jouw nieuwe wachtwoord is"
+
+#: ../../Zotlabs/Module/Lostpass.php:93
+msgid "Save or copy your new password - and then"
+msgstr "Kopieer of sla je nieuwe wachtwoord op - en"
+
+#: ../../Zotlabs/Module/Lostpass.php:94
+msgid "click here to login"
+msgstr "klik dan hier om in te loggen"
+
+#: ../../Zotlabs/Module/Lostpass.php:95
+msgid ""
+"Your password may be changed from the <em>Settings</em> page after "
+"successful login."
+msgstr "Jouw wachtwoord kan worden veranderd onder <em>instellingen</em>, nadat je succesvol bent ingelogd."
+
+#: ../../Zotlabs/Module/Lostpass.php:112
+#, php-format
+msgid "Your password has changed at %s"
+msgstr "Jouw wachtwoord op %s is veranderd"
+
+#: ../../Zotlabs/Module/Lostpass.php:127
+msgid "Forgot your Password?"
+msgstr "Wachtwoord vergeten?"
+
+#: ../../Zotlabs/Module/Lostpass.php:128
+msgid ""
+"Enter your email address and submit to have your password reset. Then check "
+"your email for further instructions."
+msgstr "Voer je e-mailadres in en verstuur deze om je wachtwoord opnieuw in te stellen. Controleer hierna hier je e-mail voor verdere instructies."
+
+#: ../../Zotlabs/Module/Lostpass.php:129
+msgid "Email Address"
+msgstr "E-mailadres"
+
+#: ../../Zotlabs/Module/Lostpass.php:130
+msgid "Reset"
+msgstr "Opnieuw instellen"
+
+#: ../../Zotlabs/Module/Magic.php:73
+msgid "Hub not found."
+msgstr "Hub niet gevonden."
+
+#: ../../Zotlabs/Module/Mail.php:38
+msgid "Unable to lookup recipient."
+msgstr "Niet in staat om ontvanger op te zoeken."
+
+#: ../../Zotlabs/Module/Mail.php:46
+msgid "Unable to communicate with requested channel."
+msgstr "Niet in staat om met het aangevraagde kanaal te communiceren."
+
+#: ../../Zotlabs/Module/Mail.php:53
+msgid "Cannot verify requested channel."
+msgstr "Kan opgevraagd kanaal niet verifieren"
+
+#: ../../Zotlabs/Module/Mail.php:79
+msgid "Selected channel has private message restrictions. Send failed."
+msgstr "Gekozen kanaal heeft restricties voor privéberichten. Verzenden mislukt."
+
+#: ../../Zotlabs/Module/Mail.php:144
+msgid "Messages"
+msgstr "Berichten"
+
+#: ../../Zotlabs/Module/Mail.php:179
+msgid "Message recalled."
+msgstr "Bericht ingetrokken."
+
+#: ../../Zotlabs/Module/Mail.php:192
+msgid "Conversation removed."
+msgstr "Conversatie verwijderd"
+
+#: ../../Zotlabs/Module/Mail.php:235
+msgid "Requested channel is not in this network"
+msgstr "Opgevraagd kanaal is niet in dit netwerk beschikbaar"
+
+#: ../../Zotlabs/Module/Mail.php:243
+msgid "Send Private Message"
+msgstr "Privébericht versturen"
+
+#: ../../Zotlabs/Module/Mail.php:244 ../../Zotlabs/Module/Mail.php:374
+msgid "To:"
+msgstr "Aan:"
+
+#: ../../Zotlabs/Module/Mail.php:247 ../../Zotlabs/Module/Mail.php:376
+msgid "Subject:"
+msgstr "Onderwerp:"
+
+#: ../../Zotlabs/Module/Mail.php:254
+msgid "Send"
+msgstr "Verzenden"
+
+#: ../../Zotlabs/Module/Mail.php:346
+msgid "Delete message"
+msgstr "Bericht verwijderen"
+
+#: ../../Zotlabs/Module/Mail.php:347
+msgid "Delivery report"
+msgstr "Afleveringsrapport"
+
+#: ../../Zotlabs/Module/Mail.php:348
+msgid "Recall message"
+msgstr "Bericht intrekken"
+
+#: ../../Zotlabs/Module/Mail.php:350
+msgid "Message has been recalled."
+msgstr "Bericht is ingetrokken."
+
+#: ../../Zotlabs/Module/Mail.php:367
+msgid "Delete Conversation"
+msgstr "Verwijder conversatie"
+
+#: ../../Zotlabs/Module/Mail.php:369
+msgid ""
+"No secure communications available. You <strong>may</strong> be able to "
+"respond from the sender's profile page."
+msgstr "Geen veilige communicatie beschikbaar. <strong>Mogelijk</strong> kan je reageren op de kanaalpagina van de afzender."
+
+#: ../../Zotlabs/Module/Mail.php:373
+msgid "Send Reply"
+msgstr "Antwoord versturen"
+
+#: ../../Zotlabs/Module/Mail.php:378
+#, php-format
+msgid "Your message for %s (%s):"
+msgstr "Jouw privébericht aan %s (%s):"
+
+#: ../../Zotlabs/Module/Manage.php:134
+#: ../../Zotlabs/Module/New_channel.php:121
+#, php-format
+msgid "You have created %1$.0f of %2$.0f allowed channels."
+msgstr "Je hebt %1$.0f van totaal %2$.0f toegestane kanalen aangemaakt."
+
+#: ../../Zotlabs/Module/Manage.php:141
+msgid "Create a new channel"
+msgstr "Nieuw kanaal aanmaken"
+
+#: ../../Zotlabs/Module/Manage.php:162 ../../include/apps.php:132
+#: ../../include/nav.php:209
+msgid "Channel Manager"
+msgstr "Kanaalbeheer"
+
+#: ../../Zotlabs/Module/Manage.php:163
+msgid "Current Channel"
+msgstr "Huidig kanaal"
+
+#: ../../Zotlabs/Module/Manage.php:165
+msgid "Switch to one of your channels by selecting it."
+msgstr "Activeer een van jouw andere kanalen door er op te klikken."
+
+#: ../../Zotlabs/Module/Manage.php:166
+msgid "Default Channel"
+msgstr "Standaardkanaal"
+
+#: ../../Zotlabs/Module/Manage.php:167
+msgid "Make Default"
+msgstr "Als standaard instellen"
+
+#: ../../Zotlabs/Module/Manage.php:170
+#, php-format
+msgid "%d new messages"
+msgstr "%d nieuwe berichten"
+
+#: ../../Zotlabs/Module/Manage.php:171
+#, php-format
+msgid "%d new introductions"
+msgstr "%d nieuwe connectieverzoeken"
+
+#: ../../Zotlabs/Module/Manage.php:173
+msgid "Delegated Channel"
+msgstr "Uitbesteed kanaal"
+
+#: ../../Zotlabs/Module/Match.php:26
+msgid "Profile Match"
+msgstr "Profielovereenkomst"
+
+#: ../../Zotlabs/Module/Match.php:35
+msgid "No keywords to match. Please add keywords to your default profile."
+msgstr "Je hebt geen trefwoorden waarmee overeenkomsten gevonden kunnen worden. Voeg enkele trefwoorden aan je standaardprofiel toe."
+
+#: ../../Zotlabs/Module/Match.php:67
+msgid "is interested in:"
+msgstr "is geïnteresseerd in:"
+
+#: ../../Zotlabs/Module/Match.php:74
+msgid "No matches"
+msgstr "Geen overeenkomsten"
+
+#: ../../Zotlabs/Module/Menu.php:49
+msgid "Unable to update menu."
+msgstr "Niet in staat om menu aan te passen"
+
+#: ../../Zotlabs/Module/Menu.php:60
+msgid "Unable to create menu."
+msgstr "Niet in staat om menu aan te maken."
+
+#: ../../Zotlabs/Module/Menu.php:98 ../../Zotlabs/Module/Menu.php:110
+msgid "Menu Name"
+msgstr "Menunaam"
+
+#: ../../Zotlabs/Module/Menu.php:98
+msgid "Unique name (not visible on webpage) - required"
+msgstr "Unieke naam vereist (niet zichtbaar op webpagina)"
+
+#: ../../Zotlabs/Module/Menu.php:99 ../../Zotlabs/Module/Menu.php:111
+msgid "Menu Title"
+msgstr "Menutitel"
+
+#: ../../Zotlabs/Module/Menu.php:99
+msgid "Visible on webpage - leave empty for no title"
+msgstr "Zichtbaar op webpagina (leeg laten voor geen titel)"
+
+#: ../../Zotlabs/Module/Menu.php:100
+msgid "Allow Bookmarks"
+msgstr "Bladwijzers toestaan"
+
+#: ../../Zotlabs/Module/Menu.php:100 ../../Zotlabs/Module/Menu.php:157
+msgid "Menu may be used to store saved bookmarks"
+msgstr "Menu kan gebruikt worden om bladwijzers in op te slaan"
+
+#: ../../Zotlabs/Module/Menu.php:101 ../../Zotlabs/Module/Menu.php:159
+msgid "Submit and proceed"
+msgstr "Opslaan en doorgaan"
+
+#: ../../Zotlabs/Module/Menu.php:107 ../../include/text.php:2279
+msgid "Menus"
+msgstr "Menu's"
+
+#: ../../Zotlabs/Module/Menu.php:117
+msgid "Bookmarks allowed"
+msgstr "Bladwijzers toegestaan"
+
+#: ../../Zotlabs/Module/Menu.php:119
+msgid "Delete this menu"
+msgstr "Menu verwijderen"
+
+#: ../../Zotlabs/Module/Menu.php:120 ../../Zotlabs/Module/Menu.php:154
+msgid "Edit menu contents"
+msgstr "Bewerk de inhoud van het menu"
+
+#: ../../Zotlabs/Module/Menu.php:121
+msgid "Edit this menu"
+msgstr "Dit menu bewerken"
+
+#: ../../Zotlabs/Module/Menu.php:136
+msgid "Menu could not be deleted."
+msgstr "Menu kon niet verwijderd worden."
+
+#: ../../Zotlabs/Module/Menu.php:144 ../../Zotlabs/Module/Mitem.php:28
+msgid "Menu not found."
+msgstr "Menu niet gevonden."
+
+#: ../../Zotlabs/Module/Menu.php:149
+msgid "Edit Menu"
+msgstr "Menu bewerken"
+
+#: ../../Zotlabs/Module/Menu.php:153
+msgid "Add or remove entries to this menu"
+msgstr "Items aan dit menu toevoegen of verwijder"
+
+#: ../../Zotlabs/Module/Menu.php:155
+msgid "Menu name"
+msgstr "Naam van menu"
+
+#: ../../Zotlabs/Module/Menu.php:155
+msgid "Must be unique, only seen by you"
+msgstr "Moet uniek zijn en is alleen zichtbaar voor jou."
+
+#: ../../Zotlabs/Module/Menu.php:156
+msgid "Menu title"
+msgstr "Titel van menu"
+
+#: ../../Zotlabs/Module/Menu.php:156
+msgid "Menu title as seen by others"
+msgstr "Titel van menu zoals anderen dat zien."
+
+#: ../../Zotlabs/Module/Menu.php:157
+msgid "Allow bookmarks"
+msgstr "Bladwijzers toestaan"
+
+#: ../../Zotlabs/Module/Menu.php:166 ../../Zotlabs/Module/Mitem.php:120
+#: ../../Zotlabs/Module/Xchan.php:41
+msgid "Not found."
+msgstr "Niet gevonden."
+
+#: ../../Zotlabs/Module/Mitem.php:52
+msgid "Unable to create element."
+msgstr "Niet in staat om onderdeel aan te maken."
+
+#: ../../Zotlabs/Module/Mitem.php:76
+msgid "Unable to update menu element."
+msgstr "Menu-onderdeel kan niet worden geüpdatet."
+
+#: ../../Zotlabs/Module/Mitem.php:92
+msgid "Unable to add menu element."
+msgstr "Menu-onderdeel kan niet worden toegevoegd."
+
+#: ../../Zotlabs/Module/Mitem.php:153 ../../Zotlabs/Module/Mitem.php:226
+msgid "Menu Item Permissions"
+msgstr "Permissies menu-item"
+
+#: ../../Zotlabs/Module/Mitem.php:154 ../../Zotlabs/Module/Mitem.php:227
+#: ../../Zotlabs/Module/Settings.php:1066
+msgid "(click to open/close)"
+msgstr "(klik om te openen/sluiten)"
+
+#: ../../Zotlabs/Module/Mitem.php:156 ../../Zotlabs/Module/Mitem.php:172
+msgid "Link Name"
+msgstr "Linknaam"
+
+#: ../../Zotlabs/Module/Mitem.php:157 ../../Zotlabs/Module/Mitem.php:231
+msgid "Link or Submenu Target"
+msgstr "Linkdoel of submenu-doel"
+
+#: ../../Zotlabs/Module/Mitem.php:157
+msgid "Enter URL of the link or select a menu name to create a submenu"
+msgstr "Geef de URL van de link of kies een menunaam om een submenu aan te maken"
+
+#: ../../Zotlabs/Module/Mitem.php:158 ../../Zotlabs/Module/Mitem.php:232
+msgid "Use magic-auth if available"
+msgstr "Gebruik magic-auth wanneer beschikbaar"
+
+#: ../../Zotlabs/Module/Mitem.php:159 ../../Zotlabs/Module/Mitem.php:233
+msgid "Open link in new window"
+msgstr "Open link in nieuw venster"
+
+#: ../../Zotlabs/Module/Mitem.php:160 ../../Zotlabs/Module/Mitem.php:234
+msgid "Order in list"
+msgstr "Volgorde in lijst"
+
+#: ../../Zotlabs/Module/Mitem.php:160 ../../Zotlabs/Module/Mitem.php:234
+msgid "Higher numbers will sink to bottom of listing"
+msgstr "Hogere nummers komen onderaan de lijst terecht"
+
+#: ../../Zotlabs/Module/Mitem.php:161
+msgid "Submit and finish"
+msgstr "Opslaan en afsluiten"
+
+#: ../../Zotlabs/Module/Mitem.php:162
+msgid "Submit and continue"
+msgstr "Opslaan en doorgaan"
+
+#: ../../Zotlabs/Module/Mitem.php:170
+msgid "Menu:"
+msgstr "Menu:"
+
+#: ../../Zotlabs/Module/Mitem.php:173
+msgid "Link Target"
+msgstr "Linkdoel"
+
+#: ../../Zotlabs/Module/Mitem.php:176
+msgid "Edit menu"
+msgstr "Menu bewerken"
+
+#: ../../Zotlabs/Module/Mitem.php:179
+msgid "Edit element"
+msgstr "Onderdeel bewerken"
+
+#: ../../Zotlabs/Module/Mitem.php:180
+msgid "Drop element"
+msgstr "Onderdeel verwijderen"
+
+#: ../../Zotlabs/Module/Mitem.php:181
+msgid "New element"
+msgstr "Nieuw element"
+
+#: ../../Zotlabs/Module/Mitem.php:182
+msgid "Edit this menu container"
+msgstr "Deze menu-container bewerken"
+
+#: ../../Zotlabs/Module/Mitem.php:183
+msgid "Add menu element"
+msgstr "Menu-element toevoegen"
+
+#: ../../Zotlabs/Module/Mitem.php:184
+msgid "Delete this menu item"
+msgstr "Dit menu-item verwijderen"
+
+#: ../../Zotlabs/Module/Mitem.php:185
+msgid "Edit this menu item"
+msgstr "Dit menu-item bewerken"
+
+#: ../../Zotlabs/Module/Mitem.php:202
+msgid "Menu item not found."
+msgstr "Menu-item niet gevonden."
+
+#: ../../Zotlabs/Module/Mitem.php:215
+msgid "Menu item deleted."
+msgstr "Menu-item verwijderd."
+
+#: ../../Zotlabs/Module/Mitem.php:217
+msgid "Menu item could not be deleted."
+msgstr "Menu-item kon niet worden verwijderd."
+
+#: ../../Zotlabs/Module/Mitem.php:224
+msgid "Edit Menu Element"
+msgstr "Menu-element bewerken"
+
+#: ../../Zotlabs/Module/Mitem.php:230
+msgid "Link text"
+msgstr "Linktekst"
+
+#: ../../Zotlabs/Module/Mood.php:67 ../../include/conversation.php:260
+#, php-format
+msgctxt "mood"
+msgid "%1$s is %2$s"
+msgstr "%1$s is %2$s"
+
+#: ../../Zotlabs/Module/Mood.php:135 ../../include/apps.php:144
+msgid "Mood"
+msgstr "Stemming"
+
+#: ../../Zotlabs/Module/Mood.php:136
+msgid "Set your current mood and tell your friends"
+msgstr "Noteer je huidige stemming en toon het aan je connecties"
+
+#: ../../Zotlabs/Module/Network.php:95
+msgid "No such group"
+msgstr "Collectie niet gevonden"
+
+#: ../../Zotlabs/Module/Network.php:135
+msgid "No such channel"
+msgstr "Niet zo'n kanaal"
+
+#: ../../Zotlabs/Module/Network.php:140
+msgid "forum"
+msgstr "forum"
+
+#: ../../Zotlabs/Module/Network.php:152
+msgid "Search Results For:"
+msgstr "Zoekresultaten voor:"
+
+#: ../../Zotlabs/Module/Network.php:216
+msgid "Privacy group is empty"
+msgstr "Privacygroep is leeg"
+
+#: ../../Zotlabs/Module/Network.php:225
+msgid "Privacy group: "
+msgstr "Privacygroep: "
+
+#: ../../Zotlabs/Module/Network.php:251
+msgid "Invalid connection."
+msgstr "Ongeldige connectie."
+
+#: ../../Zotlabs/Module/New_channel.php:128
+#: ../../Zotlabs/Module/Register.php:231
+msgid "Name or caption"
+msgstr "Naam"
+
+#: ../../Zotlabs/Module/New_channel.php:128
+#: ../../Zotlabs/Module/Register.php:231
+msgid "Examples: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \"Aviation Group\""
+msgstr "Voorbeelden: \"Jan Pietersen\", \"Willems weblog\", \"Computerforum\""
+
+#: ../../Zotlabs/Module/New_channel.php:130
+#: ../../Zotlabs/Module/Register.php:233
+msgid "Choose a short nickname"
+msgstr "Korte bijnaam"
+
+#: ../../Zotlabs/Module/New_channel.php:130
+#: ../../Zotlabs/Module/Register.php:233
+#, php-format
+msgid ""
+"Your nickname will be used to create an easy to remember channel address "
+"e.g. nickname%s"
+msgstr "Deze bijnaam wordt gebruikt om een makkelijk te onthouden kanaaladres van jouw kanaal aan te maken, die je dan met anderen kunt delen. Bijvoorbeeld: bijnaam%s"
+
+#: ../../Zotlabs/Module/New_channel.php:132
+#: ../../Zotlabs/Module/Register.php:235
+msgid "Channel role and privacy"
+msgstr "Kanaaltype en privacy"
+
+#: ../../Zotlabs/Module/New_channel.php:132
+#: ../../Zotlabs/Module/Register.php:235
+msgid "Select a channel role with your privacy requirements."
+msgstr "Kies een kanaaltype met het door jou gewenste privacyniveau."
+
+#: ../../Zotlabs/Module/New_channel.php:132
+#: ../../Zotlabs/Module/Register.php:235
+msgid "Read more about roles"
+msgstr "Lees meer over kanaaltypes"
+
+#: ../../Zotlabs/Module/New_channel.php:135
+msgid "Create Channel"
+msgstr "Kanaal aanmaken"
+
+#: ../../Zotlabs/Module/New_channel.php:136
+msgid ""
+"A channel is your identity on this network. It can represent a person, a "
+"blog, or a forum to name a few. Channels can make connections with other "
+"channels to share information with highly detailed permissions."
+msgstr "Een kanaal is jouw identiteit in dit netwerk. Het kan bijvoorbeeld een persoon, een blog of een forum vertegenwoordigen. Door met elkaar te verbinden kunnen kanalen, met behulp van uitgebreide permissies, informatie uitwisselen."
+
+#: ../../Zotlabs/Module/New_channel.php:137
+msgid ""
+"or <a href=\"import\">import an existing channel</a> from another location."
+msgstr "Of <a href=\"import\">importeer een bestaand kanaal</a> vanaf een andere locatie"
+
+#: ../../Zotlabs/Module/Notifications.php:30
+msgid "Invalid request identifier."
+msgstr "Ongeldige verzoek identificator (request identifier)"
+
+#: ../../Zotlabs/Module/Notifications.php:39
+msgid "Discard"
+msgstr "Annuleren"
+
+#: ../../Zotlabs/Module/Notifications.php:98
+#: ../../Zotlabs/Module/Notify.php:57
+msgid "No more system notifications."
+msgstr "Geen systeemnotificaties meer."
+
+#: ../../Zotlabs/Module/Notifications.php:102
+#: ../../Zotlabs/Module/Notify.php:61
+msgid "System Notifications"
+msgstr "Systeemnotificaties"
+
+#: ../../Zotlabs/Module/Notifications.php:103 ../../include/nav.php:194
+msgid "Mark all system notifications seen"
+msgstr "Markeer alle systeemnotificaties als bekeken"
+
+#: ../../Zotlabs/Module/Oexchange.php:27
+msgid "Unable to find your hub."
+msgstr "Niet in staat om je hub te vinden"
+
+#: ../../Zotlabs/Module/Oexchange.php:41
+msgid "Post successful."
+msgstr "Verzenden bericht geslaagd."
+
+#: ../../Zotlabs/Module/Openid.php:30
+msgid "OpenID protocol error. No ID returned."
+msgstr "OpenID-protocolfout. Geen ID terugontvangen."
+
+#: ../../Zotlabs/Module/Openid.php:193 ../../include/auth.php:226
+msgid "Login failed."
+msgstr "Inloggen mislukt."
+
+#: ../../Zotlabs/Module/Page.php:133
+msgid ""
+"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod "
+"tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,"
+" quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo "
+"consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse "
+"cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat "
+"non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
+msgstr "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
+
+#: ../../Zotlabs/Module/Pconfig.php:26 ../../Zotlabs/Module/Pconfig.php:59
+msgid "This setting requires special processing and editing has been blocked."
+msgstr "Deze instelling vereist een speciaal proces en bewerken is geblokkeerd."
+
+#: ../../Zotlabs/Module/Pconfig.php:48
+msgid "Configuration Editor"
+msgstr "Configuratiebewerker"
+
+#: ../../Zotlabs/Module/Pconfig.php:49
+msgid ""
+"Warning: Changing some settings could render your channel inoperable. Please"
+" leave this page unless you are comfortable with and knowledgeable about how"
+" to correctly use this feature."
+msgstr "Waarschuwing: het veranderen van sommige instellingen kunnen jouw kanaal onklaar maken. Verlaat deze pagina, tenzij je weet waar je mee bezig bent en voldoende kennis bezit over hoe je deze functies moet gebruiken. "
+
+#: ../../Zotlabs/Module/Pdledit.php:18
+msgid "Layout updated."
+msgstr "Lay-out bijgewerkt."
+
+#: ../../Zotlabs/Module/Pdledit.php:34 ../../Zotlabs/Module/Pdledit.php:61
+msgid "Edit System Page Description"
+msgstr "Systeempagina's bewerken"
+
+#: ../../Zotlabs/Module/Pdledit.php:56
+msgid "Layout not found."
+msgstr "Lay-out niet gevonden."
+
+#: ../../Zotlabs/Module/Pdledit.php:62
+msgid "Module Name:"
+msgstr "Modulenaam:"
+
+#: ../../Zotlabs/Module/Pdledit.php:63
+msgid "Layout Help"
+msgstr "Lay-out-hulp"
+
+#: ../../Zotlabs/Module/Photos.php:83
+msgid "Page owner information could not be retrieved."
+msgstr "Informatie over de pagina-eigenaar werd niet ontvangen."
+
+#: ../../Zotlabs/Module/Photos.php:98 ../../Zotlabs/Module/Photos.php:742
+#: ../../Zotlabs/Module/Profile_photo.php:114
+#: ../../Zotlabs/Module/Profile_photo.php:206
+#: ../../Zotlabs/Module/Profile_photo.php:294
+#: ../../include/photo/photo_driver.php:722
+msgid "Profile Photos"
+msgstr "Profielfoto's"
+
+#: ../../Zotlabs/Module/Photos.php:104 ../../Zotlabs/Module/Photos.php:148
+msgid "Album not found."
+msgstr "Album niet gevonden."
+
+#: ../../Zotlabs/Module/Photos.php:131
+msgid "Delete Album"
+msgstr "Verwijder album"
+
+#: ../../Zotlabs/Module/Photos.php:152
+msgid ""
+"Multiple storage folders exist with this album name, but within different "
+"directories. Please remove the desired folder or folders using the Files "
+"manager"
+msgstr "Er bestaan meerdere submappen met deze albumnaam, maar verspreidt over verschillende mappen. Verwijder de gewenste map(pen) met de bestandsbeheerder."
+
+#: ../../Zotlabs/Module/Photos.php:209 ../../Zotlabs/Module/Photos.php:1052
+msgid "Delete Photo"
+msgstr "Verwijder foto"
+
+#: ../../Zotlabs/Module/Photos.php:532
+msgid "No photos selected"
+msgstr "Geen foto's geselecteerd"
+
+#: ../../Zotlabs/Module/Photos.php:581
+msgid "Access to this item is restricted."
+msgstr "Toegang tot dit item is beperkt."
+
+#: ../../Zotlabs/Module/Photos.php:620
+#, php-format
+msgid "%1$.2f MB of %2$.2f MB photo storage used."
+msgstr "%1$.2f MB van %2$.2f MB aan foto-opslag gebruikt."
+
+#: ../../Zotlabs/Module/Photos.php:623
+#, php-format
+msgid "%1$.2f MB photo storage used."
+msgstr "%1$.2f MB aan foto-opslag gebruikt."
+
+#: ../../Zotlabs/Module/Photos.php:659
+msgid "Upload Photos"
+msgstr "Foto's uploaden"
+
+#: ../../Zotlabs/Module/Photos.php:663
+msgid "Enter an album name"
+msgstr "Vul een albumnaam in"
+
+#: ../../Zotlabs/Module/Photos.php:664
+msgid "or select an existing album (doubleclick)"
+msgstr "of kies een bestaand album (dubbelklikken)"
+
+#: ../../Zotlabs/Module/Photos.php:665
+msgid "Create a status post for this upload"
+msgstr "Plaats een bericht voor deze upload."
+
+#: ../../Zotlabs/Module/Photos.php:666
+msgid "Caption (optional):"
+msgstr "Bijschrift (optioneel):"
+
+#: ../../Zotlabs/Module/Photos.php:667
+msgid "Description (optional):"
+msgstr "Omschrijving (optioneel):"
+
+#: ../../Zotlabs/Module/Photos.php:694
+msgid "Album name could not be decoded"
+msgstr "Albumnaam kon niet gedecodeerd worden"
+
+#: ../../Zotlabs/Module/Photos.php:742 ../../Zotlabs/Module/Photos.php:1282
+#: ../../Zotlabs/Module/Photos.php:1299
+msgid "Contact Photos"
+msgstr "Connectiefoto's"
+
+#: ../../Zotlabs/Module/Photos.php:765
+msgid "Show Newest First"
+msgstr "Nieuwste eerst weergeven"
+
+#: ../../Zotlabs/Module/Photos.php:767
+msgid "Show Oldest First"
+msgstr "Oudste eerst weergeven"
+
+#: ../../Zotlabs/Module/Photos.php:791 ../../Zotlabs/Module/Photos.php:1332
+#: ../../include/widgets.php:1451
+msgid "View Photo"
+msgstr "Foto weergeven"
+
+#: ../../Zotlabs/Module/Photos.php:822 ../../include/widgets.php:1468
+msgid "Edit Album"
+msgstr "Album bewerken"
+
+#: ../../Zotlabs/Module/Photos.php:869
+msgid "Permission denied. Access to this item may be restricted."
+msgstr "Toegang geweigerd. Toegang tot dit item kan zijn beperkt."
+
+#: ../../Zotlabs/Module/Photos.php:871
+msgid "Photo not available"
+msgstr "Foto niet aanwezig"
+
+#: ../../Zotlabs/Module/Photos.php:929
+msgid "Use as profile photo"
+msgstr "Als profielfoto gebruiken"
+
+#: ../../Zotlabs/Module/Photos.php:930
+msgid "Use as cover photo"
+msgstr "Als omslagfoto gebruiken"
+
+#: ../../Zotlabs/Module/Photos.php:937
+msgid "Private Photo"
+msgstr "Privéfoto"
+
+#: ../../Zotlabs/Module/Photos.php:952
+msgid "View Full Size"
+msgstr "Volledige grootte weergeven"
+
+#: ../../Zotlabs/Module/Photos.php:997 ../../Zotlabs/Module/Tagrm.php:137
+msgid "Remove"
+msgstr "Verwijderen"
+
+#: ../../Zotlabs/Module/Photos.php:1031
+msgid "Edit photo"
+msgstr "Foto bewerken"
+
+#: ../../Zotlabs/Module/Photos.php:1033
+msgid "Rotate CW (right)"
+msgstr "Draai met de klok mee (naar rechts)"
+
+#: ../../Zotlabs/Module/Photos.php:1034
+msgid "Rotate CCW (left)"
+msgstr "Draai tegen de klok in (naar links)"
+
+#: ../../Zotlabs/Module/Photos.php:1037
+msgid "Enter a new album name"
+msgstr "Vul een nieuwe albumnaam in"
+
+#: ../../Zotlabs/Module/Photos.php:1038
+msgid "or select an existing one (doubleclick)"
+msgstr "of kies een bestaand album (dubbelklikken)"
+
+#: ../../Zotlabs/Module/Photos.php:1041
+msgid "Caption"
+msgstr "Bijschrift"
+
+#: ../../Zotlabs/Module/Photos.php:1043
+msgid "Add a Tag"
+msgstr "Tag toevoegen"
+
+#: ../../Zotlabs/Module/Photos.php:1047
+msgid "Example: @bob, @Barbara_Jensen, @jim@example.com"
+msgstr "Voorbeeld: @bob, @Barbara_Jansen, @jan@voorbeeld.nl"
+
+#: ../../Zotlabs/Module/Photos.php:1050
+msgid "Flag as adult in album view"
+msgstr "Markeer als voor volwassenen in albumweergave"
+
+#: ../../Zotlabs/Module/Photos.php:1069 ../../include/ItemObject.php:254
+msgid "I like this (toggle)"
+msgstr "Vind ik leuk"
+
+#: ../../Zotlabs/Module/Photos.php:1070 ../../include/ItemObject.php:255
+msgid "I don't like this (toggle)"
+msgstr "Vind ik niet leuk"
+
+#: ../../Zotlabs/Module/Photos.php:1088 ../../Zotlabs/Module/Photos.php:1206
+#: ../../include/ItemObject.php:700
+msgid "This is you"
+msgstr "Dit ben jij"
+
+#: ../../Zotlabs/Module/Photos.php:1090 ../../Zotlabs/Module/Photos.php:1208
+#: ../../include/ItemObject.php:702 ../../include/js_strings.php:6
+msgid "Comment"
+msgstr "Reactie"
+
+#: ../../Zotlabs/Module/Photos.php:1106 ../../include/conversation.php:574
+msgctxt "title"
+msgid "Likes"
+msgstr "vinden dit leuk"
+
+#: ../../Zotlabs/Module/Photos.php:1106 ../../include/conversation.php:574
+msgctxt "title"
+msgid "Dislikes"
+msgstr "vinden dit niet leuk"
+
+#: ../../Zotlabs/Module/Photos.php:1107 ../../include/conversation.php:575
+msgctxt "title"
+msgid "Agree"
+msgstr "eens"
+
+#: ../../Zotlabs/Module/Photos.php:1107 ../../include/conversation.php:575
+msgctxt "title"
+msgid "Disagree"
+msgstr "oneens"
+
+#: ../../Zotlabs/Module/Photos.php:1107 ../../include/conversation.php:575
+msgctxt "title"
+msgid "Abstain"
+msgstr "onthoudingen"
+
+#: ../../Zotlabs/Module/Photos.php:1108 ../../include/conversation.php:576
+msgctxt "title"
+msgid "Attending"
+msgstr "aanwezig"
+
+#: ../../Zotlabs/Module/Photos.php:1108 ../../include/conversation.php:576
+msgctxt "title"
+msgid "Not attending"
+msgstr "niet aanwezig"
+
+#: ../../Zotlabs/Module/Photos.php:1108 ../../include/conversation.php:576
+msgctxt "title"
+msgid "Might attend"
+msgstr "mogelijk aanwezig"
+
+#: ../../Zotlabs/Module/Photos.php:1125 ../../Zotlabs/Module/Photos.php:1137
+#: ../../include/ItemObject.php:175 ../../include/ItemObject.php:187
+#: ../../include/conversation.php:1736
+msgid "View all"
+msgstr "Toon alles"
+
+#: ../../Zotlabs/Module/Photos.php:1129 ../../include/identity.php:1297
+#: ../../include/ItemObject.php:179 ../../include/conversation.php:1760
+#: ../../include/taxonomy.php:415
+msgctxt "noun"
+msgid "Like"
+msgid_plural "Likes"
+msgstr[0] "vindt dit leuk"
+msgstr[1] "vinden dit leuk"
+
+#: ../../Zotlabs/Module/Photos.php:1134 ../../include/ItemObject.php:184
+#: ../../include/conversation.php:1763
+msgctxt "noun"
+msgid "Dislike"
+msgid_plural "Dislikes"
+msgstr[0] "vindt dit niet leuk"
+msgstr[1] "vinden dit niet leuk"
+
+#: ../../Zotlabs/Module/Photos.php:1242
+msgid "In This Photo:"
+msgstr "Op deze foto:"
+
+#: ../../Zotlabs/Module/Photos.php:1247
+msgid "Map"
+msgstr "Kaart"
+
+#: ../../Zotlabs/Module/Photos.php:1255 ../../include/ItemObject.php:378
+msgctxt "noun"
+msgid "Likes"
+msgstr "vinden dit leuk"
+
+#: ../../Zotlabs/Module/Photos.php:1256 ../../include/ItemObject.php:379
+msgctxt "noun"
+msgid "Dislikes"
+msgstr "vinden dit niet leuk"
+
+#: ../../Zotlabs/Module/Photos.php:1261 ../../include/ItemObject.php:384
+#: ../../include/acl_selectors.php:252
+msgid "Close"
+msgstr "Sluiten"
+
+#: ../../Zotlabs/Module/Photos.php:1338
+msgid "View Album"
+msgstr "Album weergeven"
+
+#: ../../Zotlabs/Module/Photos.php:1349 ../../Zotlabs/Module/Photos.php:1362
+#: ../../Zotlabs/Module/Photos.php:1363
+msgid "Recent Photos"
+msgstr "Recente foto's"
+
+#: ../../Zotlabs/Module/Ping.php:264
+msgid "sent you a private message"
+msgstr "stuurde jou een privébericht"
+
+#: ../../Zotlabs/Module/Ping.php:312
+msgid "added your channel"
+msgstr "voegde jouw kanaal toe"
+
+#: ../../Zotlabs/Module/Ping.php:322 ../../include/identity.php:1116
+#: ../../include/identity.php:1192
+msgid "g A l F d"
+msgstr "G:i, l d F"
+
+#: ../../Zotlabs/Module/Ping.php:345 ../../include/identity.php:1162
+#: ../../include/identity.php:1232
+msgid "[today]"
+msgstr "[vandaag]"
+
+#: ../../Zotlabs/Module/Ping.php:354
+msgid "posted an event"
+msgstr "plaatste een gebeurtenis"
+
+#: ../../Zotlabs/Module/Poke.php:168 ../../include/apps.php:145
+#: ../../include/conversation.php:965
+msgid "Poke"
+msgstr "Aanstoten"
+
+#: ../../Zotlabs/Module/Poke.php:169
+msgid "Poke somebody"
+msgstr "Iemand aanstoten"
+
+#: ../../Zotlabs/Module/Poke.php:172
+msgid "Poke/Prod"
+msgstr "Aanstoten/porren"
+
+#: ../../Zotlabs/Module/Poke.php:173
+msgid "Poke, prod or do other things to somebody"
+msgstr "Iemand bijvoorbeeld aanstoten of poren"
+
+#: ../../Zotlabs/Module/Poke.php:180
+msgid "Recipient"
+msgstr "Ontvanger"
+
+#: ../../Zotlabs/Module/Poke.php:181
+msgid "Choose what you wish to do to recipient"
+msgstr "Kies wat je met de ontvanger wil doen"
+
+#: ../../Zotlabs/Module/Poke.php:184 ../../Zotlabs/Module/Poke.php:185
+msgid "Make this post private"
+msgstr "Maak dit bericht privé"
+
+#: ../../Zotlabs/Module/Probe.php:28 ../../Zotlabs/Module/Probe.php:34
+#, php-format
+msgid "Fetching URL returns error: %1$s"
+msgstr "Ophalen URL gaf een foutmelding terug: %1$s"
+
+#: ../../Zotlabs/Module/Profile_photo.php:179
+msgid ""
+"Shift-reload the page or clear browser cache if the new photo does not "
+"display immediately."
+msgstr "Vernieuw de pagina met shift+R of shift+F5, of leeg je browserbuffer, wanneer de nieuwe foto niet meteen wordt weergegeven."
+
+#: ../../Zotlabs/Module/Profile_photo.php:367
+msgid "Upload Profile Photo"
+msgstr "Profielfoto uploaden"
+
+#: ../../Zotlabs/Module/Profiles.php:23 ../../Zotlabs/Module/Profiles.php:188
+#: ../../Zotlabs/Module/Profiles.php:245 ../../Zotlabs/Module/Profiles.php:624
+msgid "Profile not found."
+msgstr "Profiel niet gevonden."
+
+#: ../../Zotlabs/Module/Profiles.php:43
+msgid "Profile deleted."
+msgstr "Profiel verwijderd."
+
+#: ../../Zotlabs/Module/Profiles.php:67 ../../Zotlabs/Module/Profiles.php:103
+msgid "Profile-"
+msgstr "Profiel-"
+
+#: ../../Zotlabs/Module/Profiles.php:88 ../../Zotlabs/Module/Profiles.php:131
+msgid "New profile created."
+msgstr "Nieuw profiel aangemaakt."
+
+#: ../../Zotlabs/Module/Profiles.php:109
+msgid "Profile unavailable to clone."
+msgstr "Profiel niet beschikbaar om te klonen"
+
+#: ../../Zotlabs/Module/Profiles.php:150
+msgid "Profile unavailable to export."
+msgstr "Geen profiel beschikbaar om te exporteren"
+
+#: ../../Zotlabs/Module/Profiles.php:255
+msgid "Profile Name is required."
+msgstr "Profielnaam is vereist"
+
+#: ../../Zotlabs/Module/Profiles.php:426
+msgid "Marital Status"
+msgstr "Huwelijke status"
+
+#: ../../Zotlabs/Module/Profiles.php:430
+msgid "Romantic Partner"
+msgstr "Romantische partner"
+
+#: ../../Zotlabs/Module/Profiles.php:434 ../../Zotlabs/Module/Profiles.php:739
+msgid "Likes"
+msgstr "Houdt van"
+
+#: ../../Zotlabs/Module/Profiles.php:438 ../../Zotlabs/Module/Profiles.php:740
+msgid "Dislikes"
+msgstr "Houdt niet van"
+
+#: ../../Zotlabs/Module/Profiles.php:442 ../../Zotlabs/Module/Profiles.php:747
+msgid "Work/Employment"
+msgstr "Werk/arbeid"
+
+#: ../../Zotlabs/Module/Profiles.php:445
+msgid "Religion"
+msgstr "Religie"
+
+#: ../../Zotlabs/Module/Profiles.php:449
+msgid "Political Views"
+msgstr "Politieke overtuigingen"
+
+#: ../../Zotlabs/Module/Profiles.php:457
+msgid "Sexual Preference"
+msgstr "Seksuele voorkeur"
+
+#: ../../Zotlabs/Module/Profiles.php:461
+msgid "Homepage"
+msgstr "Homepage"
+
+#: ../../Zotlabs/Module/Profiles.php:465
+msgid "Interests"
+msgstr "Interesses"
+
+#: ../../Zotlabs/Module/Profiles.php:559
+msgid "Profile updated."
+msgstr "Profiel bijgewerkt"
+
+#: ../../Zotlabs/Module/Profiles.php:648
+msgid "Hide your connections list from viewers of this profile"
+msgstr "Laat de lijst met connecties niet aan bezoekers van dit profiel zien."
+
+#: ../../Zotlabs/Module/Profiles.php:690
+msgid "Edit Profile Details"
+msgstr "Profiel bewerken"
+
+#: ../../Zotlabs/Module/Profiles.php:692
+msgid "View this profile"
+msgstr "Profiel weergeven"
+
+#: ../../Zotlabs/Module/Profiles.php:693 ../../Zotlabs/Module/Profiles.php:774
+#: ../../include/identity.php:952
+msgid "Edit visibility"
+msgstr "Zichtbaarheid bewerken"
+
+#: ../../Zotlabs/Module/Profiles.php:694
+msgid "Change cover photo"
+msgstr "Omslagfoto wijzigen"
+
+#: ../../Zotlabs/Module/Profiles.php:695 ../../include/identity.php:923
+msgid "Change profile photo"
+msgstr "Profielfoto veranderen"
+
+#: ../../Zotlabs/Module/Profiles.php:696
+msgid "Create a new profile using these settings"
+msgstr "Een nieuw profiel aanmaken met dit profiel als basis"
+
+#: ../../Zotlabs/Module/Profiles.php:697
+msgid "Clone this profile"
+msgstr "Dit profiel klonen"
+
+#: ../../Zotlabs/Module/Profiles.php:698
+msgid "Delete this profile"
+msgstr "Dit profiel verwijderen"
+
+#: ../../Zotlabs/Module/Profiles.php:699
+msgid "Add profile things"
+msgstr "Dingen aan je profiel toevoegen"
+
+#: ../../Zotlabs/Module/Profiles.php:700 ../../include/conversation.php:1544
+#: ../../include/widgets.php:105
+msgid "Personal"
+msgstr "Persoonlijk"
+
+#: ../../Zotlabs/Module/Profiles.php:702
+msgid "Relation"
+msgstr "Relatie"
+
+#: ../../Zotlabs/Module/Profiles.php:703 ../../include/datetime.php:48
+msgid "Miscellaneous"
+msgstr "Diversen"
+
+#: ../../Zotlabs/Module/Profiles.php:705
+msgid "Import profile from file"
+msgstr "Profiel vanuit bestand importeren"
+
+#: ../../Zotlabs/Module/Profiles.php:706
+msgid "Export profile to file"
+msgstr "Profiel naar bestand exporteren"
+
+#: ../../Zotlabs/Module/Profiles.php:707
+msgid "Your gender"
+msgstr "Jouw geslacht"
+
+#: ../../Zotlabs/Module/Profiles.php:708
+msgid "Marital status"
+msgstr "Burgerlijke staat"
+
+#: ../../Zotlabs/Module/Profiles.php:709
+msgid "Sexual preference"
+msgstr "Seksuele voorkeur"
+
+#: ../../Zotlabs/Module/Profiles.php:712
+msgid "Profile name"
+msgstr "Profielnaam"
+
+#: ../../Zotlabs/Module/Profiles.php:714
+msgid "This is your default profile."
+msgstr "Dit is jouw standaardprofiel"
+
+#: ../../Zotlabs/Module/Profiles.php:716
+msgid "Your full name"
+msgstr "Jouw volledige naam"
+
+#: ../../Zotlabs/Module/Profiles.php:717
+msgid "Title/Description"
+msgstr "Titel/omschrijving"
+
+#: ../../Zotlabs/Module/Profiles.php:720
+msgid "Street address"
+msgstr "Straat en huisnummer"
+
+#: ../../Zotlabs/Module/Profiles.php:721
+msgid "Locality/City"
+msgstr "Woonplaats"
+
+#: ../../Zotlabs/Module/Profiles.php:722
+msgid "Region/State"
+msgstr "Provincie/gewest/deelstaat"
+
+#: ../../Zotlabs/Module/Profiles.php:723
+msgid "Postal/Zip code"
+msgstr "Postcode"
+
+#: ../../Zotlabs/Module/Profiles.php:724
+msgid "Country"
+msgstr "Land"
+
+#: ../../Zotlabs/Module/Profiles.php:729
+msgid "Who (if applicable)"
+msgstr "Wie (wanneer van toepassing)"
+
+#: ../../Zotlabs/Module/Profiles.php:729
+msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
+msgstr "Voorbeelden: petra123, Petra Jansen, petra@voorbeeld.nl"
+
+#: ../../Zotlabs/Module/Profiles.php:730
+msgid "Since (date)"
+msgstr "Sinds (datum)"
+
+#: ../../Zotlabs/Module/Profiles.php:733
+msgid "Tell us about yourself"
+msgstr "Vertel ons iets over jezelf"
+
+#: ../../Zotlabs/Module/Profiles.php:735
+msgid "Hometown"
+msgstr "Oorspronkelijk uit"
+
+#: ../../Zotlabs/Module/Profiles.php:736
+msgid "Political views"
+msgstr "Politieke overtuigingen"
+
+#: ../../Zotlabs/Module/Profiles.php:737
+msgid "Religious views"
+msgstr "Religieuze overtuigingen"
+
+#: ../../Zotlabs/Module/Profiles.php:738
+msgid "Keywords used in directory listings"
+msgstr "Trefwoorden voor in de kanalengids"
+
+#: ../../Zotlabs/Module/Profiles.php:738
+msgid "Example: fishing photography software"
+msgstr "Voorbeeld: muziek, fotografie, software"
+
+#: ../../Zotlabs/Module/Profiles.php:741
+msgid "Musical interests"
+msgstr "Muzikale interesses"
+
+#: ../../Zotlabs/Module/Profiles.php:742
+msgid "Books, literature"
+msgstr "Boeken/literatuur"
+
+#: ../../Zotlabs/Module/Profiles.php:743
+msgid "Television"
+msgstr "Televisie"
+
+#: ../../Zotlabs/Module/Profiles.php:744
+msgid "Film/Dance/Culture/Entertainment"
+msgstr "Film/dans/cultuur/entertainment"
+
+#: ../../Zotlabs/Module/Profiles.php:745
+msgid "Hobbies/Interests"
+msgstr "Hobby's/interesses"
+
+#: ../../Zotlabs/Module/Profiles.php:746
+msgid "Love/Romance"
+msgstr "Liefde/romantiek"
+
+#: ../../Zotlabs/Module/Profiles.php:748
+msgid "School/Education"
+msgstr "School/opleiding"
+
+#: ../../Zotlabs/Module/Profiles.php:749
+msgid "Contact information and social networks"
+msgstr "Contactinformatie en sociale netwerken"
+
+#: ../../Zotlabs/Module/Profiles.php:750
+msgid "My other channels"
+msgstr "Mijn andere kanalen"
+
+#: ../../Zotlabs/Module/Profiles.php:770 ../../include/identity.php:948
+msgid "Profile Image"
+msgstr "Profielfoto"
+
+#: ../../Zotlabs/Module/Profiles.php:780 ../../include/identity.php:930
+#: ../../include/nav.php:88
+msgid "Edit Profiles"
+msgstr "Bewerk profielen"
+
+#: ../../Zotlabs/Module/Profperm.php:34 ../../Zotlabs/Module/Profperm.php:63
+msgid "Invalid profile identifier."
+msgstr "Ongeldige profiel-identificator"
+
+#: ../../Zotlabs/Module/Profperm.php:115
+msgid "Profile Visibility Editor"
+msgstr "Zichtbaarheid profiel "
+
+#: ../../Zotlabs/Module/Profperm.php:117 ../../include/identity.php:1388
+#: ../../include/apps.php:138
+msgid "Profile"
+msgstr "Profiel"
+
+#: ../../Zotlabs/Module/Profperm.php:119
+msgid "Click on a contact to add or remove."
+msgstr "Klik op een connectie om deze toe te voegen of te verwijderen"
+
+#: ../../Zotlabs/Module/Profperm.php:128
+msgid "Visible To"
+msgstr "Zichtbaar voor"
+
+#: ../../Zotlabs/Module/Pubsites.php:22 ../../include/widgets.php:1222
+msgid "Public Hubs"
+msgstr "Openbare hubs"
+
+#: ../../Zotlabs/Module/Pubsites.php:25
+msgid ""
+"The listed hubs allow public registration for the $Projectname network. All "
+"hubs in the network are interlinked so membership on any of them conveys "
+"membership in the network as a whole. Some hubs may require subscription or "
+"provide tiered service plans. The hub itself <strong>may</strong> provide "
+"additional details."
+msgstr "Op de hier weergegeven hubs kan iedereen zich voor het $Projectname-netwerk aanmelden. Alle hubs in het netwerk zijn met elkaar verbonden, dus maakt het qua lidmaatschap niet uit waar je je aanmeldt. Op sommige hubs heb je eerst goedkeuring nodig en sommige hubs vereisen een financiële tegemoetkoming voor bepaalde uitbreidingen. <strong>Mogelijk</strong> wordt hierover op de hub zelf meer informatie gegeven."
+
+#: ../../Zotlabs/Module/Pubsites.php:31
+msgid "Hub URL"
+msgstr "Hub-URL"
+
+#: ../../Zotlabs/Module/Pubsites.php:31
+msgid "Access Type"
+msgstr "Toegangs-<br/>&nbsp;type"
+
+#: ../../Zotlabs/Module/Pubsites.php:31
+msgid "Registration Policy"
+msgstr "Registratie-<br/>&nbsp;beleid"
+
+#: ../../Zotlabs/Module/Pubsites.php:31 ../../Zotlabs/Module/Ratings.php:103
+#: ../../include/conversation.php:964
+msgid "Ratings"
+msgstr "Beoordelingen"
+
+#: ../../Zotlabs/Module/Pubsites.php:37
+msgid "Rate"
+msgstr "Beoordeel"
+
+#: ../../Zotlabs/Module/Rate.php:162
+msgid "Website:"
+msgstr "Website:"
+
+#: ../../Zotlabs/Module/Rate.php:165
+#, php-format
+msgid "Remote Channel [%s] (not yet known on this site)"
+msgstr "Kanaal op afstand [%s] (nog niet op deze hub bekend)"
+
+#: ../../Zotlabs/Module/Rate.php:166
+msgid "Rating (this information is public)"
+msgstr "Beoordeling (deze informatie is openbaar)"
+
+#: ../../Zotlabs/Module/Rate.php:167
+msgid "Optionally explain your rating (this information is public)"
+msgstr "Verklaar jouw beoordeling (niet verplicht, deze informatie is openbaar)"
+
+#: ../../Zotlabs/Module/Ratings.php:73
+msgid "No ratings"
+msgstr "Geen beoordelingen"
+
+#: ../../Zotlabs/Module/Ratings.php:104
+msgid "Rating: "
+msgstr "Beoordeling: "
+
+#: ../../Zotlabs/Module/Ratings.php:105
+msgid "Website: "
+msgstr "Website: "
+
+#: ../../Zotlabs/Module/Ratings.php:107
+msgid "Description: "
+msgstr "Omschrijving: "
+
+#: ../../Zotlabs/Module/Rbmark.php:94
+msgid "Select a bookmark folder"
+msgstr "Kies een bladwijzermap"
+
+#: ../../Zotlabs/Module/Rbmark.php:99
+msgid "Save Bookmark"
+msgstr "Bladwijzer opslaan"
+
+#: ../../Zotlabs/Module/Rbmark.php:100
+msgid "URL of bookmark"
+msgstr "URL van bladwijzer"
+
+#: ../../Zotlabs/Module/Rbmark.php:105
+msgid "Or enter new bookmark folder name"
+msgstr "Of geef de naam op van een nieuwe bladwijzermap"
+
+#: ../../Zotlabs/Module/Register.php:49
+msgid "Maximum daily site registrations exceeded. Please try again tomorrow."
+msgstr "Maximum toegestane dagelijkse registraties op deze $Projectname-hub bereikt. Probeer het morgen (UTC) nogmaals."
+
+#: ../../Zotlabs/Module/Register.php:55
+msgid ""
+"Please indicate acceptance of the Terms of Service. Registration failed."
+msgstr "Registratie mislukt. De gebruiksvoorwaarden dienen wel geaccepteerd te worden."
+
+#: ../../Zotlabs/Module/Register.php:89
+msgid "Passwords do not match."
+msgstr "Wachtwoorden komen niet met elkaar overeen."
+
+#: ../../Zotlabs/Module/Register.php:131
+msgid ""
+"Registration successful. Please check your email for validation "
+"instructions."
+msgstr "Registratie geslaagd. Controleer je e-mail voor instructies."
+
+#: ../../Zotlabs/Module/Register.php:137
+msgid "Your registration is pending approval by the site owner."
+msgstr "Jouw accountregistratie wacht op goedkeuring van de beheerder van deze $Projectname-hub."
+
+#: ../../Zotlabs/Module/Register.php:140
+msgid "Your registration can not be processed."
+msgstr "Jouw registratie kan niet verwerkt worden."
+
+#: ../../Zotlabs/Module/Register.php:184
+msgid "Registration on this hub is disabled."
+msgstr "Registreren van nieuwe accounts is op deze hub uitgeschakeld."
+
+#: ../../Zotlabs/Module/Register.php:193
+msgid "Registration on this hub is by approval only."
+msgstr "Registraties op deze hub moeten eerst worden goedgekeurd."
+
+#: ../../Zotlabs/Module/Register.php:194
+msgid "<a href=\"pubsites\">Register at another affiliated hub.</a>"
+msgstr "<a href=\"pubsites\">Registreer op een andere hub</a>."
+
+#: ../../Zotlabs/Module/Register.php:204
+msgid ""
+"This site has exceeded the number of allowed daily account registrations. "
+"Please try again tomorrow."
+msgstr "Deze $Projectname-hub heeft het maximum aantal dagelijks toegestane registraties bereikt. Probeer het morgen (UTC) nogmaals."
+
+#: ../../Zotlabs/Module/Register.php:215
+msgid "Terms of Service"
+msgstr "Gebruiksvoorwaarden"
+
+#: ../../Zotlabs/Module/Register.php:221
+#, php-format
+msgid "I accept the %s for this website"
+msgstr "Ik accepteer de %s van deze $Projectname-hub"
+
+#: ../../Zotlabs/Module/Register.php:223
+#, php-format
+msgid "I am over 13 years of age and accept the %s for this website"
+msgstr "Ik ben 13 jaar of ouder en accepteer de %s van deze $Projectname-hub"
+
+#: ../../Zotlabs/Module/Register.php:227
+msgid "Your email address"
+msgstr "Jouw e-mailadres"
+
+#: ../../Zotlabs/Module/Register.php:228
+msgid "Choose a password"
+msgstr "Geef een wachtwoord op"
+
+#: ../../Zotlabs/Module/Register.php:229
+msgid "Please re-enter your password"
+msgstr "Geef het wachtwoord opnieuw op"
+
+#: ../../Zotlabs/Module/Register.php:230
+msgid "Please enter your invitation code"
+msgstr "Vul jouw uitnodigingscode in"
+
+#: ../../Zotlabs/Module/Register.php:236
+msgid "no"
+msgstr "Nee"
+
+#: ../../Zotlabs/Module/Register.php:236
+msgid "yes"
+msgstr "Ja"
+
+#: ../../Zotlabs/Module/Register.php:250
+msgid "Membership on this site is by invitation only."
+msgstr "Registreren op deze $Projectname-hub kan alleen op uitnodiging."
+
+#: ../../Zotlabs/Module/Register.php:262 ../../include/nav.php:148
+#: ../../boot.php:1584
+msgid "Register"
+msgstr "Registreren"
+
+#: ../../Zotlabs/Module/Register.php:262
+msgid "Proceed to create your first channel"
+msgstr "Volgende stap: aanmaken van jouw eerste kanaal"
+
+#: ../../Zotlabs/Module/Regmod.php:15
+msgid "Please login."
+msgstr "Inloggen."
+
+#: ../../Zotlabs/Module/Removeaccount.php:34
+msgid ""
+"Account removals are not allowed within 48 hours of changing the account "
+"password."
+msgstr "Het verwijderen van een account is niet toegestaan binnen 48 uur nadat het wachtwoord is veranderd."
+
+#: ../../Zotlabs/Module/Removeaccount.php:61
+msgid "Remove This Account"
+msgstr "Verwijder dit account"
+
+#: ../../Zotlabs/Module/Removeaccount.php:62
+#: ../../Zotlabs/Module/Removeme.php:62
+msgid "WARNING: "
+msgstr "WAARSCHUWING: "
+
+#: ../../Zotlabs/Module/Removeaccount.php:62
+msgid ""
+"This account and all its channels will be completely removed from the "
+"network. "
+msgstr "Dit account en al zijn kanalen worden volledig uit het $Projectname-netwerk verwijderd."
+
+#: ../../Zotlabs/Module/Removeaccount.php:62
+#: ../../Zotlabs/Module/Removeme.php:62
+msgid "This action is permanent and can not be undone!"
+msgstr "Deze handeling is van permanente aard en kan niet meer worden teruggedraaid!"
+
+#: ../../Zotlabs/Module/Removeaccount.php:63
+#: ../../Zotlabs/Module/Removeme.php:63
+msgid "Please enter your password for verification:"
+msgstr "Vul je wachtwoord in ter verificatie:"
+
+#: ../../Zotlabs/Module/Removeaccount.php:64
+msgid ""
+"Remove this account, all its channels and all its channel clones from the "
+"network"
+msgstr "Dit account, al zijn kanalen en alle klonen van zijn kanalen uit het $Projectname-netwerk verwijderen"
+
+#: ../../Zotlabs/Module/Removeaccount.php:64
+msgid ""
+"By default only the instances of the channels located on this hub will be "
+"removed from the network"
+msgstr "Standaard worden alleen de kanalen die zich op deze hub bevinden uit het $Projectname-netwerk verwijderd"
+
+#: ../../Zotlabs/Module/Removeaccount.php:65
+#: ../../Zotlabs/Module/Settings.php:703
+msgid "Remove Account"
+msgstr "Account verwijderen"
+
+#: ../../Zotlabs/Module/Removeme.php:33
+msgid ""
+"Channel removals are not allowed within 48 hours of changing the account "
+"password."
+msgstr "Het verwijderen van een kanaal is niet toegestaan binnen 48 uur nadat het wachtwoord van het account is veranderd."
+
+#: ../../Zotlabs/Module/Removeme.php:61
+msgid "Remove This Channel"
+msgstr "Verwijder dit kanaal"
+
+#: ../../Zotlabs/Module/Removeme.php:62
+msgid "This channel will be completely removed from the network. "
+msgstr "Dit kanaal wordt volledig uit het $Projectname-netwerk verwijderd."
+
+#: ../../Zotlabs/Module/Removeme.php:64
+msgid "Remove this channel and all its clones from the network"
+msgstr "Dit kanaal en alle klonen hiervan uit het $Projectname-netwerk verwijderen"
+
+#: ../../Zotlabs/Module/Removeme.php:64
+msgid ""
+"By default only the instance of the channel located on this hub will be "
+"removed from the network"
+msgstr "Standaard wordt alleen het kanaal dat zich op deze hub bevindt uit het $Projectname-netwerk verwijderd"
+
+#: ../../Zotlabs/Module/Removeme.php:65 ../../Zotlabs/Module/Settings.php:1122
+msgid "Remove Channel"
+msgstr "Kanaal verwijderen"
+
+#: ../../Zotlabs/Module/Rmagic.php:44
+msgid ""
+"We encountered a problem while logging in with the OpenID you provided. "
+"Please check the correct spelling of the ID."
+msgstr "We hebben een probleem ontdekt tijdens het inloggen met de OpenID die je hebt verstrekt. Controleer de ID op typefouten."
+
+#: ../../Zotlabs/Module/Rmagic.php:44
+msgid "The error message was:"
+msgstr "Het foutbericht was:"
+
+#: ../../Zotlabs/Module/Rmagic.php:48
+msgid "Authentication failed."
+msgstr "Authenticatie mislukt."
+
+#: ../../Zotlabs/Module/Rmagic.php:88
+msgid "Remote Authentication"
+msgstr "Authenticatie op afstand"
+
+#: ../../Zotlabs/Module/Rmagic.php:89
+msgid "Enter your channel address (e.g. channel@example.com)"
+msgstr "Vul jouw kanaaladres in (bijv. channel@example.com)"
+
+#: ../../Zotlabs/Module/Rmagic.php:90
+msgid "Authenticate"
+msgstr "Authenticeren"
+
+#: ../../Zotlabs/Module/Search.php:216
+#, php-format
+msgid "Items tagged with: %s"
+msgstr "Items getagd met %s"
+
+#: ../../Zotlabs/Module/Search.php:218
+#, php-format
+msgid "Search results for: %s"
+msgstr "Zoekresultaten voor %s"
+
+#: ../../Zotlabs/Module/Service_limits.php:23
+msgid "No service class restrictions found."
+msgstr "Geen abonnementsbeperkingen gevonden."
+
+#: ../../Zotlabs/Module/Settings.php:67
+msgid "Name is required"
+msgstr "Naam is vereist"
+
+#: ../../Zotlabs/Module/Settings.php:71
+msgid "Key and Secret are required"
+msgstr "Key en secret zijn vereist"
+
+#: ../../Zotlabs/Module/Settings.php:75 ../../Zotlabs/Module/Settings.php:614
+#: ../../include/apps.php:252
+msgid "Update"
+msgstr "Bijwerken"
+
+#: ../../Zotlabs/Module/Settings.php:223
+msgid "Not valid email."
+msgstr "Geen geldig e-mailadres."
+
+#: ../../Zotlabs/Module/Settings.php:226
+msgid "Protected email address. Cannot change to that email."
+msgstr "Beschermd e-mailadres. Kan dat e-mailadres niet gebruiken."
+
+#: ../../Zotlabs/Module/Settings.php:235
+msgid "System failure storing new email. Please try again."
+msgstr "Systeemfout opslaan van nieuwe e-mail. Probeer het nog een keer."
+
+#: ../../Zotlabs/Module/Settings.php:252
+msgid "Password verification failed."
+msgstr "Wachtwoordverificatie mislukt"
+
+#: ../../Zotlabs/Module/Settings.php:259
+msgid "Passwords do not match. Password unchanged."
+msgstr "Wachtwoorden komen niet overeen. Wachtwoord onveranderd."
+
+#: ../../Zotlabs/Module/Settings.php:263
+msgid "Empty passwords are not allowed. Password unchanged."
+msgstr "Lege wachtwoorden zijn niet toegestaan. Wachtwoord onveranderd."
+
+#: ../../Zotlabs/Module/Settings.php:277
+msgid "Password changed."
+msgstr "Wachtwoord veranderd."
+
+#: ../../Zotlabs/Module/Settings.php:279
+msgid "Password update failed. Please try again."
+msgstr "Bijwerken wachtwoord mislukt. Probeer opnieuw."
+
+#: ../../Zotlabs/Module/Settings.php:523
+msgid "Settings updated."
+msgstr "Instellingen bijgewerkt."
+
+#: ../../Zotlabs/Module/Settings.php:587 ../../Zotlabs/Module/Settings.php:613
+#: ../../Zotlabs/Module/Settings.php:649
+msgid "Add application"
+msgstr "Applicatie toevoegen"
+
+#: ../../Zotlabs/Module/Settings.php:590
+msgid "Name of application"
+msgstr "Naam van applicatie"
+
+#: ../../Zotlabs/Module/Settings.php:591 ../../Zotlabs/Module/Settings.php:617
+msgid "Consumer Key"
+msgstr "Consumer key"
+
+#: ../../Zotlabs/Module/Settings.php:591 ../../Zotlabs/Module/Settings.php:592
+msgid "Automatically generated - change if desired. Max length 20"
+msgstr "Automatische gegenereerd - verander wanneer gewenst. Maximale lengte is 20"
+
+#: ../../Zotlabs/Module/Settings.php:592 ../../Zotlabs/Module/Settings.php:618
+msgid "Consumer Secret"
+msgstr "Consumer secret"
+
+#: ../../Zotlabs/Module/Settings.php:593 ../../Zotlabs/Module/Settings.php:619
+msgid "Redirect"
+msgstr "Redirect/doorverwijzing"
+
+#: ../../Zotlabs/Module/Settings.php:593
+msgid ""
+"Redirect URI - leave blank unless your application specifically requires "
+"this"
+msgstr "URI voor redirect - laat leeg, behalve wanneer de applicatie dit vereist"
+
+#: ../../Zotlabs/Module/Settings.php:594 ../../Zotlabs/Module/Settings.php:620
+msgid "Icon url"
+msgstr "Pictogram-URL"
+
+#: ../../Zotlabs/Module/Settings.php:594
+msgid "Optional"
+msgstr "Optioneel"
+
+#: ../../Zotlabs/Module/Settings.php:605
+msgid "Application not found."
+msgstr "Applicatie niet gevonden."
+
+#: ../../Zotlabs/Module/Settings.php:648
+msgid "Connected Apps"
+msgstr "Verbonden applicaties"
+
+#: ../../Zotlabs/Module/Settings.php:652
+msgid "Client key starts with"
+msgstr "Client key begint met"
+
+#: ../../Zotlabs/Module/Settings.php:653
+msgid "No name"
+msgstr "Geen naam"
+
+#: ../../Zotlabs/Module/Settings.php:654
+msgid "Remove authorization"
+msgstr "Autorisatie verwijderen"
+
+#: ../../Zotlabs/Module/Settings.php:667
+msgid "No feature settings configured"
+msgstr "Geen plugin-instellingen aanwezig"
+
+#: ../../Zotlabs/Module/Settings.php:674
+msgid "Feature/Addon Settings"
+msgstr "Plugin-instellingen"
+
+#: ../../Zotlabs/Module/Settings.php:697
+msgid "Account Settings"
+msgstr "Account-instellingen"
+
+#: ../../Zotlabs/Module/Settings.php:698
+msgid "Current Password"
+msgstr "Huidig wachtwoord"
+
+#: ../../Zotlabs/Module/Settings.php:699
+msgid "Enter New Password"
+msgstr "Nieuw wachtwoord invoeren"
+
+#: ../../Zotlabs/Module/Settings.php:700
+msgid "Confirm New Password"
+msgstr "Nieuw wachtwoord bevestigen"
+
+#: ../../Zotlabs/Module/Settings.php:700
+msgid "Leave password fields blank unless changing"
+msgstr "Laat de wachtwoordvelden leeg, behalve wanneer je deze wil veranderen"
+
+#: ../../Zotlabs/Module/Settings.php:702
+#: ../../Zotlabs/Module/Settings.php:1039
+msgid "Email Address:"
+msgstr "E-mailadres:"
+
+#: ../../Zotlabs/Module/Settings.php:704
+msgid "Remove this account including all its channels"
+msgstr "Dit account en al zijn kanalen verwijderen"
+
+#: ../../Zotlabs/Module/Settings.php:727
+msgid "Additional Features"
+msgstr "Extra functies"
+
+#: ../../Zotlabs/Module/Settings.php:751
+msgid "Connector Settings"
+msgstr "Instellingen externe koppelingen"
+
+#: ../../Zotlabs/Module/Settings.php:790
+msgid "No special theme for mobile devices"
+msgstr "Geen speciaal thema voor mobiele apparaten"
+
+#: ../../Zotlabs/Module/Settings.php:793
+#, php-format
+msgid "%s - (Experimental)"
+msgstr "%s - (experimenteel)"
+
+#: ../../Zotlabs/Module/Settings.php:835
+msgid "Display Settings"
+msgstr "Weergave-instellingen"
+
+#: ../../Zotlabs/Module/Settings.php:836
+msgid "Theme Settings"
+msgstr "Thema-instellingen"
+
+#: ../../Zotlabs/Module/Settings.php:837
+msgid "Custom Theme Settings"
+msgstr "Handmatige thema-instellingen"
+
+#: ../../Zotlabs/Module/Settings.php:838
+msgid "Content Settings"
+msgstr "Inhoudsinstellingen"
+
+#: ../../Zotlabs/Module/Settings.php:844
+msgid "Display Theme:"
+msgstr "Gebruik thema:"
+
+#: ../../Zotlabs/Module/Settings.php:845
+msgid "Mobile Theme:"
+msgstr "Mobiel thema:"
+
+#: ../../Zotlabs/Module/Settings.php:846
+msgid "Preload images before rendering the page"
+msgstr "Afbeeldingen laden voordat de pagina wordt weergegeven"
+
+#: ../../Zotlabs/Module/Settings.php:846
+msgid ""
+"The subjective page load time will be longer but the page will be ready when"
+" displayed"
+msgstr "De laadtijd van een pagina lijkt langer, maar de pagina is wel meteen helemaal geladen wanneer deze wordt weergeven"
+
+#: ../../Zotlabs/Module/Settings.php:847
+msgid "Enable user zoom on mobile devices"
+msgstr "Inzoomen op smartphones en tablets toestaan"
+
+#: ../../Zotlabs/Module/Settings.php:848
+msgid "Update browser every xx seconds"
+msgstr "Ververs de webbrowser om de zoveel seconde"
+
+#: ../../Zotlabs/Module/Settings.php:848
+msgid "Minimum of 10 seconds, no maximum"
+msgstr "Minimaal 10 seconde, geen maximum"
+
+#: ../../Zotlabs/Module/Settings.php:849
+msgid "Maximum number of conversations to load at any time:"
+msgstr "Maximaal aantal conversaties die per keer geladen worden:"
+
+#: ../../Zotlabs/Module/Settings.php:849
+msgid "Maximum of 100 items"
+msgstr "Maximaal 100 conversaties"
+
+#: ../../Zotlabs/Module/Settings.php:850
+msgid "Show emoticons (smilies) as images"
+msgstr "Toon emoticons (smilies) als afbeeldingen"
+
+#: ../../Zotlabs/Module/Settings.php:851
+msgid "Link post titles to source"
+msgstr "Berichtkoppen naar originele locatie linken"
+
+#: ../../Zotlabs/Module/Settings.php:852
+msgid "System Page Layout Editor - (advanced)"
+msgstr "Lay-out bewerken van systeempagina's (geavanceerd)"
+
+#: ../../Zotlabs/Module/Settings.php:855
+msgid "Use blog/list mode on channel page"
+msgstr "Gebruik blog/lijst-modus op kanaalpagina"
+
+#: ../../Zotlabs/Module/Settings.php:855 ../../Zotlabs/Module/Settings.php:856
+msgid "(comments displayed separately)"
+msgstr "(reacties worden afzonderlijk weergeven)"
+
+#: ../../Zotlabs/Module/Settings.php:856
+msgid "Use blog/list mode on grid page"
+msgstr "Gebruik blog/lijst-modus op gridpagina"
+
+#: ../../Zotlabs/Module/Settings.php:857
+msgid "Channel page max height of content (in pixels)"
+msgstr "Maximale hoogte berichtinhoud op kanaalpagina (in pixels)"
+
+#: ../../Zotlabs/Module/Settings.php:857 ../../Zotlabs/Module/Settings.php:858
+msgid "click to expand content exceeding this height"
+msgstr "klik om inhoud uit te klappen die deze hoogte overschrijdt"
+
+#: ../../Zotlabs/Module/Settings.php:858
+msgid "Grid page max height of content (in pixels)"
+msgstr "Maximale hoogte berichtinhoud op gridpagina (in pixels)"
+
+#: ../../Zotlabs/Module/Settings.php:892
+msgid "Nobody except yourself"
+msgstr "Niemand, behalve jezelf"
+
+#: ../../Zotlabs/Module/Settings.php:893
+msgid "Only those you specifically allow"
+msgstr "Alleen connecties met uitdrukkelijke toestemming"
+
+#: ../../Zotlabs/Module/Settings.php:894
+msgid "Approved connections"
+msgstr "Geaccepteerde connecties"
+
+#: ../../Zotlabs/Module/Settings.php:895
+msgid "Any connections"
+msgstr "Alle connecties"
+
+#: ../../Zotlabs/Module/Settings.php:896
+msgid "Anybody on this website"
+msgstr "Iedereen op deze hub"
+
+#: ../../Zotlabs/Module/Settings.php:897
+msgid "Anybody in this network"
+msgstr "Iedereen in dit netwerk"
+
+#: ../../Zotlabs/Module/Settings.php:898
+msgid "Anybody authenticated"
+msgstr "Geauthenticeerd"
+
+#: ../../Zotlabs/Module/Settings.php:899
+msgid "Anybody on the internet"
+msgstr "Iedereen op het internet"
+
+#: ../../Zotlabs/Module/Settings.php:974
+msgid "Publish your default profile in the network directory"
+msgstr "Publiceer je standaardprofiel in de kanalengids"
+
+#: ../../Zotlabs/Module/Settings.php:979
+msgid "Allow us to suggest you as a potential friend to new members?"
+msgstr "Sta ons toe om jouw kanaal als mogelijke connectie voor te stellen aan nieuwe kanalen"
+
+#: ../../Zotlabs/Module/Settings.php:988
+msgid "Your channel address is"
+msgstr "Jouw kanaaladres is"
+
+#: ../../Zotlabs/Module/Settings.php:1030
+msgid "Channel Settings"
+msgstr "Kanaal-instellingen"
+
+#: ../../Zotlabs/Module/Settings.php:1037
+msgid "Basic Settings"
+msgstr "Basis-instellingen"
+
+#: ../../Zotlabs/Module/Settings.php:1038 ../../include/identity.php:1279
+msgid "Full Name:"
+msgstr "Volledige naam:"
+
+#: ../../Zotlabs/Module/Settings.php:1040
+msgid "Your Timezone:"
+msgstr "Jouw tijdzone:"
+
+#: ../../Zotlabs/Module/Settings.php:1041
+msgid "Default Post Location:"
+msgstr "Standaardlocatie bericht:"
+
+#: ../../Zotlabs/Module/Settings.php:1041
+msgid "Geographical location to display on your posts"
+msgstr "Geografische locatie die bij het bericht moet worden vermeld"
+
+#: ../../Zotlabs/Module/Settings.php:1042
+msgid "Use Browser Location:"
+msgstr "Locatie van webbrowser gebruiken:"
+
+#: ../../Zotlabs/Module/Settings.php:1044
+msgid "Adult Content"
+msgstr "Inhoud voor volwassenen"
+
+#: ../../Zotlabs/Module/Settings.php:1044
+msgid ""
+"This channel frequently or regularly publishes adult content. (Please tag "
+"any adult material and/or nudity with #NSFW)"
+msgstr "Dit kanaal publiceert regelmatig of vaak materiaal dat alleen geschikt is voor volwassenen. (Gebruik de tag #NSFW in berichten met een seksueel getinte inhoud of ander voor minderjarigen ongeschikt materiaal)"
+
+#: ../../Zotlabs/Module/Settings.php:1046
+msgid "Security and Privacy Settings"
+msgstr "Veiligheids- en privacy-instellingen"
+
+#: ../../Zotlabs/Module/Settings.php:1049
+msgid "Your permissions are already configured. Click to view/adjust"
+msgstr "Jouw permissies zijn al ingesteld. Klik om ze te bekijken of aan te passen."
+
+#: ../../Zotlabs/Module/Settings.php:1051
+msgid "Hide my online presence"
+msgstr "Verberg mijn aanwezigheid"
+
+#: ../../Zotlabs/Module/Settings.php:1051
+msgid "Prevents displaying in your profile that you are online"
+msgstr "Voorkomt dat op je kanaalpagina te zien valt dat je momenteel op $Projectname aanwezig bent"
+
+#: ../../Zotlabs/Module/Settings.php:1053
+msgid "Simple Privacy Settings:"
+msgstr "Eenvoudige privacy-instellingen:"
+
+#: ../../Zotlabs/Module/Settings.php:1054
+msgid ""
+"Very Public - <em>extremely permissive (should be used with caution)</em>"
+msgstr "Zeer openbaar <em>(kanaal staat volledig open - moet met grote zorgvuldigheid gebruikt worden)</em>"
+
+#: ../../Zotlabs/Module/Settings.php:1055
+msgid ""
+"Typical - <em>default public, privacy when desired (similar to social "
+"network permissions but with improved privacy)</em>"
+msgstr "Normaal <em>(standaard openbaar, maar privacy wanneer noodzakelijk - vergelijkbaar met die van sociale netwerken, maar met verbeterde privacy)</em>"
+
+#: ../../Zotlabs/Module/Settings.php:1056
+msgid "Private - <em>default private, never open or public</em>"
+msgstr "Privé <em>(standaard privé en nooit openbaar)</em>"
+
+#: ../../Zotlabs/Module/Settings.php:1057
+msgid "Blocked - <em>default blocked to/from everybody</em>"
+msgstr "Geblokkeerd <em>(standaard geblokkeerd naar/van iedereen)</em>"
+
+#: ../../Zotlabs/Module/Settings.php:1059
+msgid "Allow others to tag your posts"
+msgstr "Anderen toestaan om je berichten te taggen"
+
+#: ../../Zotlabs/Module/Settings.php:1059
+msgid ""
+"Often used by the community to retro-actively flag inappropriate content"
+msgstr "Vaak in groepen/forums gebruikt om met terugwerkende kracht ongepast materiaal te markeren"
+
+#: ../../Zotlabs/Module/Settings.php:1061
+msgid "Advanced Privacy Settings"
+msgstr "Geavanceerde privacy-instellingen"
+
+#: ../../Zotlabs/Module/Settings.php:1063
+msgid "Expire other channel content after this many days"
+msgstr "Inhoud van andere kanalen na zoveel aantal dagen laten verlopen:"
+
+#: ../../Zotlabs/Module/Settings.php:1063
+#, php-format
+msgid ""
+"0 or blank to use the website limit. The website expires after %d days."
+msgstr "0 of leeg om het standaard aantal dagen van deze hub te gebruiken. Deze hub laat de inhoud van andere kanalen na %d dagen verlopen."
+
+#: ../../Zotlabs/Module/Settings.php:1064
+msgid "Maximum Friend Requests/Day:"
+msgstr "Maximum aantal connectieverzoeken per dag:"
+
+#: ../../Zotlabs/Module/Settings.php:1064
+msgid "May reduce spam activity"
+msgstr "Kan eventuele spam verminderen"
+
+#: ../../Zotlabs/Module/Settings.php:1065
+msgid "Default Post Permissions"
+msgstr "Standaard permissies voor nieuwe berichten"
+
+#: ../../Zotlabs/Module/Settings.php:1070
+msgid "Channel permissions category:"
+msgstr "Kanaaltype en -permissies:"
+
+#: ../../Zotlabs/Module/Settings.php:1076
+msgid "Maximum private messages per day from unknown people:"
+msgstr "Maximum aantal privé-berichten per dag van onbekende personen:"
+
+#: ../../Zotlabs/Module/Settings.php:1076
+msgid "Useful to reduce spamming"
+msgstr "Kan eventuele spam verminderen"
+
+#: ../../Zotlabs/Module/Settings.php:1079
+msgid "Notification Settings"
+msgstr "Notificatie-instellingen"
+
+#: ../../Zotlabs/Module/Settings.php:1080
+msgid "By default post a status message when:"
+msgstr "Plaats automatisch een statusbericht wanneer:"
+
+#: ../../Zotlabs/Module/Settings.php:1081
+msgid "accepting a friend request"
+msgstr "Een connectieverzoek wordt geaccepteerd"
+
+#: ../../Zotlabs/Module/Settings.php:1082
+msgid "joining a forum/community"
+msgstr "Je lid wordt van een forum/groep"
+
+#: ../../Zotlabs/Module/Settings.php:1083
+msgid "making an <em>interesting</em> profile change"
+msgstr "Er sprake is van een <em>interessante</em> profielwijziging"
+
+#: ../../Zotlabs/Module/Settings.php:1084
+msgid "Send a notification email when:"
+msgstr "Verzend een notificatie per e-mail wanneer:"
+
+#: ../../Zotlabs/Module/Settings.php:1085
+msgid "You receive a connection request"
+msgstr "Je een connectieverzoek ontvangt"
+
+#: ../../Zotlabs/Module/Settings.php:1086
+msgid "Your connections are confirmed"
+msgstr "Jouw connecties zijn bevestigd"
+
+#: ../../Zotlabs/Module/Settings.php:1087
+msgid "Someone writes on your profile wall"
+msgstr "Iemand iets op jouw kanaal heeft geschreven"
+
+#: ../../Zotlabs/Module/Settings.php:1088
+msgid "Someone writes a followup comment"
+msgstr "Iemand een reactie schrijft"
+
+#: ../../Zotlabs/Module/Settings.php:1089
+msgid "You receive a private message"
+msgstr "Je een privé-bericht ontvangt"
+
+#: ../../Zotlabs/Module/Settings.php:1090
+msgid "You receive a friend suggestion"
+msgstr "Je een kanaalvoorstel ontvangt"
+
+#: ../../Zotlabs/Module/Settings.php:1091
+msgid "You are tagged in a post"
+msgstr "Je expliciet in een bericht bent genoemd"
+
+#: ../../Zotlabs/Module/Settings.php:1092
+msgid "You are poked/prodded/etc. in a post"
+msgstr "Je bent in een bericht aangestoten/gepord/etc."
+
+#: ../../Zotlabs/Module/Settings.php:1095
+msgid "Show visual notifications including:"
+msgstr "Toon de volgende zichtbare notificaties:"
+
+#: ../../Zotlabs/Module/Settings.php:1097
+msgid "Unseen grid activity"
+msgstr "Niet bekeken grid-activiteit"
+
+#: ../../Zotlabs/Module/Settings.php:1098
+msgid "Unseen channel activity"
+msgstr "Niet bekeken kanaal-activiteit"
+
+#: ../../Zotlabs/Module/Settings.php:1099
+msgid "Unseen private messages"
+msgstr "Niet bekeken privéberichten"
+
+#: ../../Zotlabs/Module/Settings.php:1099
+#: ../../Zotlabs/Module/Settings.php:1104
+#: ../../Zotlabs/Module/Settings.php:1105
+#: ../../Zotlabs/Module/Settings.php:1106
+msgid "Recommended"
+msgstr "Aanbevolen"
+
+#: ../../Zotlabs/Module/Settings.php:1100
+msgid "Upcoming events"
+msgstr "Aankomende gebeurtenissen"
+
+#: ../../Zotlabs/Module/Settings.php:1101
+msgid "Events today"
+msgstr "Gebeurtenissen van vandaag"
+
+#: ../../Zotlabs/Module/Settings.php:1102
+msgid "Upcoming birthdays"
+msgstr "Aankomende verjaardagen"
+
+#: ../../Zotlabs/Module/Settings.php:1102
+msgid "Not available in all themes"
+msgstr "Niet in alle thema's beschikbaar"
+
+#: ../../Zotlabs/Module/Settings.php:1103
+msgid "System (personal) notifications"
+msgstr "(Persoonlijke) systeemnotificaties"
+
+#: ../../Zotlabs/Module/Settings.php:1104
+msgid "System info messages"
+msgstr "Systeemmededelingen"
+
+#: ../../Zotlabs/Module/Settings.php:1105
+msgid "System critical alerts"
+msgstr "Kritische systeemwaarschuwingen"
+
+#: ../../Zotlabs/Module/Settings.php:1106
+msgid "New connections"
+msgstr "Nieuwe connecties"
+
+#: ../../Zotlabs/Module/Settings.php:1107
+msgid "System Registrations"
+msgstr "Nieuwe accountregistraties op deze hub"
+
+#: ../../Zotlabs/Module/Settings.php:1108
+msgid ""
+"Also show new wall posts, private messages and connections under Notices"
+msgstr "Toon tevens nieuwe kanaalberichten, privéberichten en connecties onder Notificaties"
+
+#: ../../Zotlabs/Module/Settings.php:1110
+msgid "Notify me of events this many days in advance"
+msgstr "Herinner mij zoveel dagen van te voren aan gebeurtenissen"
+
+#: ../../Zotlabs/Module/Settings.php:1110
+msgid "Must be greater than 0"
+msgstr "Moet hoger dan 0 zijn"
+
+#: ../../Zotlabs/Module/Settings.php:1112
+msgid "Advanced Account/Page Type Settings"
+msgstr "Instellingen geavanceerd account/paginatype"
+
+#: ../../Zotlabs/Module/Settings.php:1113
+msgid "Change the behaviour of this account for special situations"
+msgstr "Verander het gedrag van dit account voor speciale situaties"
+
+#: ../../Zotlabs/Module/Settings.php:1116
+msgid ""
+"Please enable expert mode (in <a href=\"settings/features\">Settings > "
+"Additional features</a>) to adjust!"
+msgstr "Schakel de expertmodus in (in <a href=\"settings/features\">Instellingen > Extra functies</a>) om aan te kunnen passen!"
+
+#: ../../Zotlabs/Module/Settings.php:1117
+msgid "Miscellaneous Settings"
+msgstr "Diverse instellingen"
+
+#: ../../Zotlabs/Module/Settings.php:1118
+msgid "Default photo upload folder"
+msgstr "Standaard fotoalbum voor uploads"
+
+#: ../../Zotlabs/Module/Settings.php:1118
+#: ../../Zotlabs/Module/Settings.php:1119
+msgid "%Y - current year, %m - current month"
+msgstr "%Y - dit jaar, %m - deze maand"
+
+#: ../../Zotlabs/Module/Settings.php:1119
+msgid "Default file upload folder"
+msgstr "Standaard bestandsmap voor uploads"
+
+#: ../../Zotlabs/Module/Settings.php:1121
+msgid "Personal menu to display in your channel pages"
+msgstr "Persoonlijk menu om op je kanaalpagina's weer te geven"
+
+#: ../../Zotlabs/Module/Settings.php:1123
+msgid "Remove this channel."
+msgstr "Verwijder dit kanaal."
+
+#: ../../Zotlabs/Module/Settings.php:1124
+msgid "Firefox Share $Projectname provider"
+msgstr "$Projectname-service voor Firefox Share"
+
+#: ../../Zotlabs/Module/Settings.php:1125
+msgid "Start calendar week on monday"
+msgstr "Begin in de agenda de week op maandag"
+
+#: ../../Zotlabs/Module/Setup.php:202
+msgid "$Projectname Server - Setup"
+msgstr "$Projectname Hub - Setup"
+
+#: ../../Zotlabs/Module/Setup.php:206
+msgid "Could not connect to database."
+msgstr "Could not connect to database."
+
+#: ../../Zotlabs/Module/Setup.php:210
+msgid ""
+"Could not connect to specified site URL. Possible SSL certificate or DNS "
+"issue."
+msgstr "Could not connect to specified hub URL. Possible SSL certificate or DNS issue."
+
+#: ../../Zotlabs/Module/Setup.php:217
+msgid "Could not create table."
+msgstr "Could not create table."
+
+#: ../../Zotlabs/Module/Setup.php:222
+msgid "Your site database has been installed."
+msgstr "Your hub database has been installed."
+
+#: ../../Zotlabs/Module/Setup.php:226
+msgid ""
+"You may need to import the file \"install/schema_xxx.sql\" manually using a "
+"database client."
+msgstr "You may need to import the file \"install/schema_xxx.sql\" manually using a database client."
+
+#: ../../Zotlabs/Module/Setup.php:227 ../../Zotlabs/Module/Setup.php:289
+#: ../../Zotlabs/Module/Setup.php:739
+msgid "Please see the file \"install/INSTALL.txt\"."
+msgstr "Please see the file \"install/INSTALL.txt\"."
+
+#: ../../Zotlabs/Module/Setup.php:286
+msgid "System check"
+msgstr "System check"
+
+#: ../../Zotlabs/Module/Setup.php:291
+msgid "Check again"
+msgstr "Check again"
+
+#: ../../Zotlabs/Module/Setup.php:313
+msgid "Database connection"
+msgstr "Database connection"
+
+#: ../../Zotlabs/Module/Setup.php:314
+msgid ""
+"In order to install $Projectname we need to know how to connect to your "
+"database."
+msgstr "In order to install $Projectname we need to know how to connect to your database."
+
+#: ../../Zotlabs/Module/Setup.php:315
+msgid ""
+"Please contact your hosting provider or site administrator if you have "
+"questions about these settings."
+msgstr "Please contact your hosting provider or server administrator if you have questions about these settings."
+
+#: ../../Zotlabs/Module/Setup.php:316
+msgid ""
+"The database you specify below should already exist. If it does not, please "
+"create it before continuing."
+msgstr "The database you specify below should already exist. If it does not, please create it before continuing."
+
+#: ../../Zotlabs/Module/Setup.php:320
+msgid "Database Server Name"
+msgstr "Database Server Name"
+
+#: ../../Zotlabs/Module/Setup.php:320
+msgid "Default is 127.0.0.1"
+msgstr "Default is 127.0.0.1"
+
+#: ../../Zotlabs/Module/Setup.php:321
+msgid "Database Port"
+msgstr "Database Port"
+
+#: ../../Zotlabs/Module/Setup.php:321
+msgid "Communication port number - use 0 for default"
+msgstr "Communication port number - use 0 for default"
+
+#: ../../Zotlabs/Module/Setup.php:322
+msgid "Database Login Name"
+msgstr "Database Login Name"
+
+#: ../../Zotlabs/Module/Setup.php:323
+msgid "Database Login Password"
+msgstr "Database Login Password"
+
+#: ../../Zotlabs/Module/Setup.php:324
+msgid "Database Name"
+msgstr "Database Name"
+
+#: ../../Zotlabs/Module/Setup.php:325
+msgid "Database Type"
+msgstr "Database Type"
+
+#: ../../Zotlabs/Module/Setup.php:327 ../../Zotlabs/Module/Setup.php:367
+msgid "Site administrator email address"
+msgstr "Hub administrator email address"
+
+#: ../../Zotlabs/Module/Setup.php:327 ../../Zotlabs/Module/Setup.php:367
+msgid ""
+"Your account email address must match this in order to use the web admin "
+"panel."
+msgstr "Your account email address must match this in order to use the web admin panel."
+
+#: ../../Zotlabs/Module/Setup.php:328 ../../Zotlabs/Module/Setup.php:369
+msgid "Website URL"
+msgstr "Hub URL"
+
+#: ../../Zotlabs/Module/Setup.php:328 ../../Zotlabs/Module/Setup.php:369
+msgid "Please use SSL (https) URL if available."
+msgstr "Please use SSL (https) URL if available."
+
+#: ../../Zotlabs/Module/Setup.php:329 ../../Zotlabs/Module/Setup.php:372
+msgid "Please select a default timezone for your website"
+msgstr "Please select a default timezone for your hub"
+
+#: ../../Zotlabs/Module/Setup.php:356
+msgid "Site settings"
+msgstr "Hub settings"
+
+#: ../../Zotlabs/Module/Setup.php:370
+msgid "Enable $Projectname <strong>advanced</strong> features?"
+msgstr "Enable $Projectname <strong>advanced</strong> features?"
+
+#: ../../Zotlabs/Module/Setup.php:370
+msgid ""
+"Some advanced features, while useful - may be best suited for technically "
+"proficient audiences"
+msgstr "Some advanced features, while useful - may be best suited for technically proficient audiences"
+
+#: ../../Zotlabs/Module/Setup.php:422
+msgid "Could not find a command line version of PHP in the web server PATH."
+msgstr "Could not find a command line version of PHP in the web server PATH."
+
+#: ../../Zotlabs/Module/Setup.php:423
+msgid ""
+"If you don't have a command line version of PHP installed on server, you "
+"will not be able to run background polling via cron."
+msgstr "If you don't have a command line version of PHP installed on server, you will not be able to run background polling via cron."
+
+#: ../../Zotlabs/Module/Setup.php:427
+msgid "PHP executable path"
+msgstr "PHP executable path"
+
+#: ../../Zotlabs/Module/Setup.php:427
+msgid ""
+"Enter full path to php executable. You can leave this blank to continue the "
+"installation."
+msgstr "Enter full path to php executable. You can leave this blank to continue the installation."
+
+#: ../../Zotlabs/Module/Setup.php:432
+msgid "Command line PHP"
+msgstr "Command line PHP"
+
+#: ../../Zotlabs/Module/Setup.php:441
+msgid ""
+"The command line version of PHP on your system does not have "
+"\"register_argc_argv\" enabled."
+msgstr "The command line version of PHP on your system does not have \"register_argc_argv\" enabled."
+
+#: ../../Zotlabs/Module/Setup.php:442
+msgid "This is required for message delivery to work."
+msgstr "This is required for message delivery to work."
+
+#: ../../Zotlabs/Module/Setup.php:445
+msgid "PHP register_argc_argv"
+msgstr "PHP register_argc_argv"
+
+#: ../../Zotlabs/Module/Setup.php:463
+#, php-format
+msgid ""
+"Your max allowed total upload size is set to %s. Maximum size of one file to"
+" upload is set to %s. You are allowed to upload up to %d files at once."
+msgstr "Your max allowed total upload size is set to %s. Maximum size of one file to upload is set to %s. You are allowed to upload up to %d files at once."
+
+#: ../../Zotlabs/Module/Setup.php:468
+msgid "You can adjust these settings in the servers php.ini."
+msgstr "You can adjust these settings in the servers php.ini."
+
+#: ../../Zotlabs/Module/Setup.php:470
+msgid "PHP upload limits"
+msgstr "PHP upload limits"
+
+#: ../../Zotlabs/Module/Setup.php:493
+msgid ""
+"Error: the \"openssl_pkey_new\" function on this system is not able to "
+"generate encryption keys"
+msgstr "Error: the \"openssl_pkey_new\" function on this system is not able to generate encryption keys"
+
+#: ../../Zotlabs/Module/Setup.php:494
+msgid ""
+"If running under Windows, please see "
+"\"http://www.php.net/manual/en/openssl.installation.php\"."
+msgstr "If running under Windows, please see \"http://www.php.net/manual/en/openssl.installation.php\"."
+
+#: ../../Zotlabs/Module/Setup.php:497
+msgid "Generate encryption keys"
+msgstr "Generate encryption keys"
+
+#: ../../Zotlabs/Module/Setup.php:509
+msgid "libCurl PHP module"
+msgstr "libCurl PHP module"
+
+#: ../../Zotlabs/Module/Setup.php:510
+msgid "GD graphics PHP module"
+msgstr "GD graphics PHP module"
+
+#: ../../Zotlabs/Module/Setup.php:511
+msgid "OpenSSL PHP module"
+msgstr "OpenSSL PHP module"
+
+#: ../../Zotlabs/Module/Setup.php:512
+msgid "mysqli or postgres PHP module"
+msgstr "mysqli or postgres PHP module"
+
+#: ../../Zotlabs/Module/Setup.php:513
+msgid "mb_string PHP module"
+msgstr "mb_string PHP module"
+
+#: ../../Zotlabs/Module/Setup.php:514
+msgid "mcrypt PHP module"
+msgstr "mcrypt PHP module"
+
+#: ../../Zotlabs/Module/Setup.php:515
+msgid "xml PHP module"
+msgstr "xml PHP module"
+
+#: ../../Zotlabs/Module/Setup.php:519 ../../Zotlabs/Module/Setup.php:521
+msgid "Apache mod_rewrite module"
+msgstr "Apache mod_rewrite module"
+
+#: ../../Zotlabs/Module/Setup.php:519
+msgid ""
+"Error: Apache webserver mod-rewrite module is required but not installed."
+msgstr "Error: Apache webserver mod-rewrite module is required but not installed."
+
+#: ../../Zotlabs/Module/Setup.php:525 ../../Zotlabs/Module/Setup.php:528
+msgid "proc_open"
+msgstr "proc_open"
+
+#: ../../Zotlabs/Module/Setup.php:525
+msgid ""
+"Error: proc_open is required but is either not installed or has been "
+"disabled in php.ini"
+msgstr "Error: proc_open is required but is either not installed or has been disabled in php.ini"
+
+#: ../../Zotlabs/Module/Setup.php:533
+msgid "Error: libCURL PHP module required but not installed."
+msgstr "Error: libCURL PHP module required but not installed."
+
+#: ../../Zotlabs/Module/Setup.php:537
+msgid ""
+"Error: GD graphics PHP module with JPEG support required but not installed."
+msgstr "Error: GD graphics PHP module with JPEG support required but not installed."
+
+#: ../../Zotlabs/Module/Setup.php:541
+msgid "Error: openssl PHP module required but not installed."
+msgstr "Error: openssl PHP module required but not installed."
+
+#: ../../Zotlabs/Module/Setup.php:545
+msgid ""
+"Error: mysqli or postgres PHP module required but neither are installed."
+msgstr "Error: mysqli or postgres PHP module required but neither are installed."
+
+#: ../../Zotlabs/Module/Setup.php:549
+msgid "Error: mb_string PHP module required but not installed."
+msgstr "Error: mb_string PHP module required but not installed."
+
+#: ../../Zotlabs/Module/Setup.php:553
+msgid "Error: mcrypt PHP module required but not installed."
+msgstr "Error: mcrypt PHP module required but not installed."
+
+#: ../../Zotlabs/Module/Setup.php:557
+msgid "Error: xml PHP module required for DAV but not installed."
+msgstr "Error: xml PHP module required for DAV but not installed."
+
+#: ../../Zotlabs/Module/Setup.php:575
+msgid ""
+"The web installer needs to be able to create a file called \".htconfig.php\""
+" in the top folder of your web server and it is unable to do so."
+msgstr "The web installer needs to be able to create a file called \".htconfig.php\" in the top folder of your web server and it is unable to do so."
+
+#: ../../Zotlabs/Module/Setup.php:576
+msgid ""
+"This is most often a permission setting, as the web server may not be able "
+"to write files in your folder - even if you can."
+msgstr "This is most often a permission setting, as the web server may not be able to write files in your folder - even if you can."
+
+#: ../../Zotlabs/Module/Setup.php:577
+msgid ""
+"At the end of this procedure, we will give you a text to save in a file "
+"named .htconfig.php in your Red top folder."
+msgstr "At the end of this procedure, we will give you a text to save in a file named .htconfig.php in your Red top folder."
+
+#: ../../Zotlabs/Module/Setup.php:578
+msgid ""
+"You can alternatively skip this procedure and perform a manual installation."
+" Please see the file \"install/INSTALL.txt\" for instructions."
+msgstr "You can alternatively skip this procedure and perform a manual installation. Please see the file \"install/INSTALL.txt\" for instructions."
+
+#: ../../Zotlabs/Module/Setup.php:581
+msgid ".htconfig.php is writable"
+msgstr ".htconfig.php is writable"
+
+#: ../../Zotlabs/Module/Setup.php:595
+msgid ""
+"Red uses the Smarty3 template engine to render its web views. Smarty3 "
+"compiles templates to PHP to speed up rendering."
+msgstr "Red uses the Smarty3 template engine to render its web views. Smarty3 compiles templates to PHP to speed up rendering."
+
+#: ../../Zotlabs/Module/Setup.php:596
+#, php-format
+msgid ""
+"In order to store these compiled templates, the web server needs to have "
+"write access to the directory %s under the Red top level folder."
+msgstr "In order to store these compiled templates, the web server needs to have write access to the directory %s under the Red top level folder."
+
+#: ../../Zotlabs/Module/Setup.php:597 ../../Zotlabs/Module/Setup.php:618
+msgid ""
+"Please ensure that the user that your web server runs as (e.g. www-data) has"
+" write access to this folder."
+msgstr "Please ensure that the user that your web server runs as (e.g. www-data) has write access to this folder."
+
+#: ../../Zotlabs/Module/Setup.php:598
+#, php-format
+msgid ""
+"Note: as a security measure, you should give the web server write access to "
+"%s only--not the template files (.tpl) that it contains."
+msgstr "Note: as a security measure, you should give the web server write access to %s only--not the template files (.tpl) that it contains."
+
+#: ../../Zotlabs/Module/Setup.php:601
+#, php-format
+msgid "%s is writable"
+msgstr "%s is writable"
+
+#: ../../Zotlabs/Module/Setup.php:617
+msgid ""
+"Red uses the store directory to save uploaded files. The web server needs to"
+" have write access to the store directory under the Red top level folder"
+msgstr "Red uses the store directory to save uploaded files. The web server needs to have write access to the store directory under the Red top level folder"
+
+#: ../../Zotlabs/Module/Setup.php:621
+msgid "store is writable"
+msgstr "store is writable"
+
+#: ../../Zotlabs/Module/Setup.php:654
+msgid ""
+"SSL certificate cannot be validated. Fix certificate or disable https access"
+" to this site."
+msgstr "SSL certificate cannot be validated. Fix certificate or disable https access to this hub."
+
+#: ../../Zotlabs/Module/Setup.php:655
+msgid ""
+"If you have https access to your website or allow connections to TCP port "
+"443 (the https: port), you MUST use a browser-valid certificate. You MUST "
+"NOT use self-signed certificates!"
+msgstr "If you have https access to your hub or allow connections to TCP port 443 (the https: port), you MUST use a browser-valid certificate. You MUST NOT use self-signed certificates!"
+
+#: ../../Zotlabs/Module/Setup.php:656
+msgid ""
+"This restriction is incorporated because public posts from you may for "
+"example contain references to images on your own hub."
+msgstr "This restriction is incorporated because public posts from you may for example contain references to images on your own hub."
+
+#: ../../Zotlabs/Module/Setup.php:657
+msgid ""
+"If your certificate is not recognized, members of other sites (who may "
+"themselves have valid certificates) will get a warning message on their own "
+"site complaining about security issues."
+msgstr "If your certificate is not recognized, members of other hubs (who may themselves have valid certificates) will get a warning message on their own hub complaining about security issues."
+
+#: ../../Zotlabs/Module/Setup.php:658
+msgid ""
+"This can cause usability issues elsewhere (not just on your own site) so we "
+"must insist on this requirement."
+msgstr "This can cause usability issues elsewhere (not just on your own hub) so we must insist on this requirement."
+
+#: ../../Zotlabs/Module/Setup.php:659
+msgid ""
+"Providers are available that issue free certificates which are browser-"
+"valid."
+msgstr "Providers are available that issue free certificates which are browser-valid."
+
+#: ../../Zotlabs/Module/Setup.php:661
+msgid "SSL certificate validation"
+msgstr "SSL certificate validation"
+
+#: ../../Zotlabs/Module/Setup.php:667
+msgid ""
+"Url rewrite in .htaccess is not working. Check your server "
+"configuration.Test: "
+msgstr "Url rewrite in .htaccess is not working. Check your server configuration.Test: "
+
+#: ../../Zotlabs/Module/Setup.php:670
+msgid "Url rewrite is working"
+msgstr "Url rewrite is working"
+
+#: ../../Zotlabs/Module/Setup.php:679
+msgid ""
+"The database configuration file \".htconfig.php\" could not be written. "
+"Please use the enclosed text to create a configuration file in your web "
+"server root."
+msgstr "The database configuration file \".htconfig.php\" could not be written. Please use the enclosed text to create a configuration file in your web server root."
+
+#: ../../Zotlabs/Module/Setup.php:703
+msgid "Errors encountered creating database tables."
+msgstr "Errors encountered creating database tables."
+
+#: ../../Zotlabs/Module/Setup.php:737
+msgid "<h1>What next</h1>"
+msgstr "<h1>What next</h1>"
+
+#: ../../Zotlabs/Module/Setup.php:738
+msgid ""
+"IMPORTANT: You will need to [manually] setup a scheduled task for the "
+"poller."
+msgstr "IMPORTANT: You will need to [manually] setup a scheduled task for the poller."
+
+#: ../../Zotlabs/Module/Sharedwithme.php:98
+msgid "Files: shared with me"
+msgstr "Bestanden: met mij gedeeld"
+
+#: ../../Zotlabs/Module/Sharedwithme.php:100
+msgid "NEW"
+msgstr "NIEUW"
+
+#: ../../Zotlabs/Module/Sharedwithme.php:103
+msgid "Remove all files"
+msgstr "Verwijder alle bestanden"
+
+#: ../../Zotlabs/Module/Sharedwithme.php:104
+msgid "Remove this file"
+msgstr "Verwijder dit bestand"
+
+#: ../../Zotlabs/Module/Siteinfo.php:19
+#, php-format
+msgid "Version %s"
+msgstr "Versie %s"
+
+#: ../../Zotlabs/Module/Siteinfo.php:40
+msgid "Installed plugins/addons/apps:"
+msgstr "Ingeschakelde plugins en apps:"
+
+#: ../../Zotlabs/Module/Siteinfo.php:53
+msgid "No installed plugins/addons/apps"
+msgstr "Geen ingeschakelde plugins en apps"
+
+#: ../../Zotlabs/Module/Siteinfo.php:66
+msgid ""
+"This is a hub of $Projectname - a global cooperative network of "
+"decentralized privacy enhanced websites."
+msgstr "Dit is een $Projectname-hub - $Projectname is een wereldwijd coöperatief netwerk van gedecentraliseerde websites (hubs) met verbeterde privacy."
+
+#: ../../Zotlabs/Module/Siteinfo.php:68
+msgid "Tag: "
+msgstr "Tag: "
+
+#: ../../Zotlabs/Module/Siteinfo.php:70
+msgid "Last background fetch: "
+msgstr "Meest recente achtergrond-fetch:"
+
+#: ../../Zotlabs/Module/Siteinfo.php:72
+msgid "Current load average: "
+msgstr "Gemiddelde systeembelasting is nu:"
+
+#: ../../Zotlabs/Module/Siteinfo.php:75
+msgid "Running at web location"
+msgstr "Draaiend op weblocatie"
+
+#: ../../Zotlabs/Module/Siteinfo.php:76
+msgid ""
+"Please visit <a href=\"http://hubzilla.org\">hubzilla.org</a> to learn more "
+"about $Projectname."
+msgstr "Bezoek <a href=\"http://hubzilla.org\">hubzilla.org</a> "
+
+#: ../../Zotlabs/Module/Siteinfo.php:77
+msgid "Bug reports and issues: please visit"
+msgstr "Bugrapporten en andere kwesties: bezoek"
+
+#: ../../Zotlabs/Module/Siteinfo.php:79
+msgid "$projectname issues"
+msgstr "$projectname-issues"
+
+#: ../../Zotlabs/Module/Siteinfo.php:80
+msgid ""
+"Suggestions, praise, etc. - please email \"redmatrix\" at librelist - dot "
+"com"
+msgstr "Voorstellen, lofbetuigingen, enz. - e-mail \"redmatrix\" at librelist - dot com"
+
+#: ../../Zotlabs/Module/Siteinfo.php:82
+msgid "Site Administrators"
+msgstr "Hubbeheerders: "
+
+#: ../../Zotlabs/Module/Sources.php:36
+msgid "Failed to create source. No channel selected."
+msgstr "Aanmaken bron mislukt. Geen kanaal geselecteerd."
+
+#: ../../Zotlabs/Module/Sources.php:49
+msgid "Source created."
+msgstr "Bron aangemaakt."
+
+#: ../../Zotlabs/Module/Sources.php:61
+msgid "Source updated."
+msgstr "Bron aangemaakt."
+
+#: ../../Zotlabs/Module/Sources.php:86
+msgid "*"
+msgstr "*"
+
+#: ../../Zotlabs/Module/Sources.php:92 ../../include/features.php:71
+#: ../../include/widgets.php:581
+msgid "Channel Sources"
+msgstr "Kanaalbronnen"
+
+#: ../../Zotlabs/Module/Sources.php:93
+msgid "Manage remote sources of content for your channel."
+msgstr "Beheer externe bronnen met inhoud voor jouw kanaal"
+
+#: ../../Zotlabs/Module/Sources.php:94 ../../Zotlabs/Module/Sources.php:104
+msgid "New Source"
+msgstr "Nieuwe bron"
+
+#: ../../Zotlabs/Module/Sources.php:105 ../../Zotlabs/Module/Sources.php:137
+msgid ""
+"Import all or selected content from the following channel into this channel "
+"and distribute it according to your channel settings."
+msgstr "Importeer complete of gedeelde inhoud vanuit het volgende kanaal naar dit kanaal, en verdeel het vervolgens volgens jouw kanaalinstellingen."
+
+#: ../../Zotlabs/Module/Sources.php:106 ../../Zotlabs/Module/Sources.php:138
+msgid "Only import content with these words (one per line)"
+msgstr "Importeer alleen inhoud met deze woorden (één per regel)"
+
+#: ../../Zotlabs/Module/Sources.php:106 ../../Zotlabs/Module/Sources.php:138
+msgid "Leave blank to import all public content"
+msgstr "Laat leeg om alle openbare inhoud te importeren"
+
+#: ../../Zotlabs/Module/Sources.php:107 ../../Zotlabs/Module/Sources.php:141
+msgid "Channel Name"
+msgstr "Kanaalnaam"
+
+#: ../../Zotlabs/Module/Sources.php:127 ../../Zotlabs/Module/Sources.php:154
+msgid "Source not found."
+msgstr "Bron niet gevonden"
+
+#: ../../Zotlabs/Module/Sources.php:134
+msgid "Edit Source"
+msgstr "Bron bewerken"
+
+#: ../../Zotlabs/Module/Sources.php:135
+msgid "Delete Source"
+msgstr "Bron verwijderen"
+
+#: ../../Zotlabs/Module/Sources.php:162
+msgid "Source removed"
+msgstr "Bron verwijderd"
+
+#: ../../Zotlabs/Module/Sources.php:164
+msgid "Unable to remove source."
+msgstr "Verwijderen bron mislukt."
+
+#: ../../Zotlabs/Module/Subthread.php:118
+#, php-format
+msgid "%1$s is following %2$s's %3$s"
+msgstr "%1$s volgt het %3$s van %2$s"
+
+#: ../../Zotlabs/Module/Subthread.php:120
+#, php-format
+msgid "%1$s stopped following %2$s's %3$s"
+msgstr "%1$s volgt het %3$s van %2$s niet meer"
+
+#: ../../Zotlabs/Module/Suggest.php:39
+msgid ""
+"No suggestions available. If this is a new site, please try again in 24 "
+"hours."
+msgstr "Geen voorgestelde kanalen gevonden. Wanneer dit een nieuwe hub is, probeer het dan over 24 uur weer."
+
+#: ../../Zotlabs/Module/Suggest.php:58 ../../include/widgets.php:149
+msgid "Ignore/Hide"
+msgstr "Negeren/Verbergen"
+
+#: ../../Zotlabs/Module/Tagger.php:55 ../../include/bbcode.php:257
+msgid "post"
+msgstr "bericht"
+
+#: ../../Zotlabs/Module/Tagger.php:57 ../../include/conversation.php:150
+#: ../../include/text.php:1975
+msgid "comment"
+msgstr "reactie"
+
+#: ../../Zotlabs/Module/Tagger.php:100
+#, php-format
+msgid "%1$s tagged %2$s's %3$s with %4$s"
+msgstr "%1$s heeft het %3$s van %2$s getagd met %4$s"
+
+#: ../../Zotlabs/Module/Tagrm.php:48 ../../Zotlabs/Module/Tagrm.php:98
+msgid "Tag removed"
+msgstr "Tag verwijderd"
+
+#: ../../Zotlabs/Module/Tagrm.php:123
+msgid "Remove Item Tag"
+msgstr "Verwijder item-tag"
+
+#: ../../Zotlabs/Module/Tagrm.php:125
+msgid "Select a tag to remove: "
+msgstr "Kies een tag om te verwijderen"
+
+#: ../../Zotlabs/Module/Thing.php:114
+msgid "Thing updated"
+msgstr "Ding bijgewerkt"
+
+#: ../../Zotlabs/Module/Thing.php:166
+msgid "Object store: failed"
+msgstr "Opslaan van ding mislukt"
+
+#: ../../Zotlabs/Module/Thing.php:170
+msgid "Thing added"
+msgstr "Ding toegevoegd"
+
+#: ../../Zotlabs/Module/Thing.php:196
+#, php-format
+msgid "OBJ: %1$s %2$s %3$s"
+msgstr "OBJ: %1$s %2$s %3$s"
+
+#: ../../Zotlabs/Module/Thing.php:259
+msgid "Show Thing"
+msgstr "Ding weergeven"
+
+#: ../../Zotlabs/Module/Thing.php:266
+msgid "item not found."
+msgstr "Item niet gevonden"
+
+#: ../../Zotlabs/Module/Thing.php:299
+msgid "Edit Thing"
+msgstr "Ding bewerken"
+
+#: ../../Zotlabs/Module/Thing.php:301 ../../Zotlabs/Module/Thing.php:351
+msgid "Select a profile"
+msgstr "Kies een profiel"
+
+#: ../../Zotlabs/Module/Thing.php:305 ../../Zotlabs/Module/Thing.php:354
+msgid "Post an activity"
+msgstr "Plaats een bericht"
+
+#: ../../Zotlabs/Module/Thing.php:305 ../../Zotlabs/Module/Thing.php:354
+msgid "Only sends to viewers of the applicable profile"
+msgstr "Toont dit alleen aan diegene die het gekozen profiel mogen zien."
+
+#: ../../Zotlabs/Module/Thing.php:307 ../../Zotlabs/Module/Thing.php:356
+msgid "Name of thing e.g. something"
+msgstr "Naam van ding"
+
+#: ../../Zotlabs/Module/Thing.php:309 ../../Zotlabs/Module/Thing.php:357
+msgid "URL of thing (optional)"
+msgstr "URL van ding (optioneel)"
+
+#: ../../Zotlabs/Module/Thing.php:311 ../../Zotlabs/Module/Thing.php:358
+msgid "URL for photo of thing (optional)"
+msgstr "URL voor foto van ding (optioneel)"
+
+#: ../../Zotlabs/Module/Thing.php:349
+msgid "Add Thing to your Profile"
+msgstr "Ding aan je profiel toevoegen"
+
+#: ../../Zotlabs/Module/Uexport.php:55 ../../Zotlabs/Module/Uexport.php:56
+msgid "Export Channel"
+msgstr "Kanaal exporteren"
+
+#: ../../Zotlabs/Module/Uexport.php:57
+msgid ""
+"Export your basic channel information to a file. This acts as a backup of "
+"your connections, permissions, profile and basic data, which can be used to "
+"import your data to a new server hub, but does not contain your content."
+msgstr "Exporteer de basisinformatie van jouw kanaal naar een bestand. Dit fungeert als een back-up van jouw connecties, permissies, profiel en basisgegevens, die gebruikt kan worden om op een nieuwe hub jouw gegevens te importeren. Deze back-up bevat echter niet de inhoud van jouw kanaal."
+
+#: ../../Zotlabs/Module/Uexport.php:58
+msgid "Export Content"
+msgstr "Inhoud exporteren"
+
+#: ../../Zotlabs/Module/Uexport.php:59
+msgid ""
+"Export your channel information and recent content to a JSON backup that can"
+" be restored or imported to another server hub. This backs up all of your "
+"connections, permissions, profile data and several months of posts. This "
+"file may be VERY large. Please be patient - it may take several minutes for"
+" this download to begin."
+msgstr "Exporteer informatie en recente inhoud van jouw kanaal naar een JSON-back-up, wat kan worden gebruikt om jouw kanaal te herstellen of te importeren op een andere hub. Dit slaat al jouw connecties, permissies, profielgegevens en enkele maanden aan inhoud van jouw kanaal op. Dit bestand kan ZEER groot worden. Wees geduldig - het kan enkele minuten duren voordat de download begint."
+
+#: ../../Zotlabs/Module/Uexport.php:60
+msgid "Export your posts from a given year."
+msgstr "Exporteer jouw berichten uit een bepaald jaar."
+
+#: ../../Zotlabs/Module/Uexport.php:62
+msgid ""
+"You may also export your posts and conversations for a particular year or "
+"month. Adjust the date in your browser location bar to select other dates. "
+"If the export fails (possibly due to memory exhaustion on your server hub), "
+"please try again selecting a more limited date range."
+msgstr "Je kan ook berichten en conversaties uit een bepaald jaar of van een bepaalde maand exporteren. Verander de datum in de adresbalk van jouw webbrowser om andere jaren en maanden te selecteren. Wanneer het exporteren mislukt (waarschijnlijk door een gebrek aan beschikbaar servergeheugen), probeer het dan nogmaals met een beperkter tijdvak."
+
+#: ../../Zotlabs/Module/Uexport.php:63
+#, php-format
+msgid ""
+"To select all posts for a given year, such as this year, visit <a "
+"href=\"%1$s\">%2$s</a>"
+msgstr "Bezoek <a href=\"%1$s\">%2$s</a> om alle berichten van bijvoorbeeld dit jaar te selecteren. "
+
+#: ../../Zotlabs/Module/Uexport.php:64
+#, php-format
+msgid ""
+"To select all posts for a given month, such as January of this year, visit "
+"<a href=\"%1$s\">%2$s</a>"
+msgstr "Bezoek <a href=\"%1$s\">%2$s</a> om alle berichten van bijvoorbeeld januari dit jaar te selecteren."
+
+#: ../../Zotlabs/Module/Uexport.php:65
+#, php-format
+msgid ""
+"These content files may be imported or restored by visiting <a "
+"href=\"%1$s\">%2$s</a> on any site containing your channel. For best results"
+" please import or restore these in date order (oldest first)."
+msgstr "Deze back-up-bestanden kunnen geïmporteerd of hersteld worden door op jouw hub en met jouw kanaal <a href=\"%1$s\">%2$s</a> te bezoeken. Voor het beste resultaat kan je de bestanden in chronologische volgorde importeren of herstellen."
+
+#: ../../Zotlabs/Module/Viewconnections.php:63
+msgid "No connections."
+msgstr "Geen connecties."
+
+#: ../../Zotlabs/Module/Viewconnections.php:76
+#, php-format
+msgid "Visit %s's profile [%s]"
+msgstr "Bezoek het profiel van %s [%s]"
+
+#: ../../Zotlabs/Module/Viewconnections.php:105
+msgid "View Connections"
+msgstr "Connecties weergeven"
+
+#: ../../Zotlabs/Module/Viewsrc.php:44
+msgid "Source of Item"
+msgstr "Bron van item"
+
+#: ../../Zotlabs/Module/Webpages.php:186 ../../include/apps.php:136
+#: ../../include/conversation.php:1704 ../../include/nav.php:106
+msgid "Webpages"
+msgstr "Webpagina's"
+
+#: ../../Zotlabs/Module/Webpages.php:197 ../../include/page_widgets.php:41
+msgid "Actions"
+msgstr "Acties"
+
+#: ../../Zotlabs/Module/Webpages.php:198 ../../include/page_widgets.php:42
+msgid "Page Link"
+msgstr "Paginalink"
+
+#: ../../Zotlabs/Module/Webpages.php:199
+msgid "Page Title"
+msgstr "Paginatitel"
+
+#: ../../Zotlabs/Module/Xchan.php:10
+msgid "Xchan Lookup"
+msgstr "Xchan opzoeken"
+
+#: ../../Zotlabs/Module/Xchan.php:13
+msgid "Lookup xchan beginning with (or webbie): "
+msgstr "Zoek een xchan (of webbie) die begint met:"
+
#: ../../include/Import/import_diaspora.php:17
msgid "No username found in import file."
msgstr "Geen gebruikersnaam in het importbestand gevonden."
@@ -220,21 +6322,11 @@ msgstr "Geen gebruikersnaam in het importbestand gevonden."
msgid "Unable to create a unique channel address. Import failed."
msgstr "Niet in staat om een uniek kanaaladres aan te maken. Importeren is mislukt."
-#: ../../include/Import/import_diaspora.php:143 ../../mod/import.php:502
-msgid "Import completed."
-msgstr "Import voltooid."
-
#: ../../include/dba/dba_driver.php:141
#, php-format
msgid "Cannot locate DNS info for database server '%s'"
msgstr "Kan DNS-informatie voor databaseserver '%s' niet vinden"
-#: ../../include/photo/photo_driver.php:722 ../../mod/photos.php:94
-#: ../../mod/photos.php:738 ../../mod/profile_photo.php:147
-#: ../../mod/profile_photo.php:239 ../../mod/profile_photo.php:327
-msgid "Profile Photos"
-msgstr "Profielfoto's"
-
#: ../../include/identity.php:32
msgid "Unable to obtain identity information from database"
msgstr "Niet in staat om identiteitsinformatie uit de database te verkrijgen"
@@ -272,37 +6364,10 @@ msgstr "Niet in staat om aangemaakte identiteit te vinden"
msgid "Default Profile"
msgstr "Standaardprofiel"
-#: ../../include/identity.php:389 ../../include/identity.php:390
-#: ../../include/identity.php:397 ../../include/profile_selectors.php:80
-#: ../../include/widgets.php:446 ../../mod/connedit.php:591
-#: ../../mod/settings.php:349 ../../mod/settings.php:353
-#: ../../mod/settings.php:354 ../../mod/settings.php:357
-#: ../../mod/settings.php:368
-msgid "Friends"
-msgstr "Vrienden"
-
#: ../../include/identity.php:784
msgid "Requested channel is not available."
msgstr "Opgevraagd kanaal is niet beschikbaar."
-#: ../../include/identity.php:830 ../../mod/achievements.php:11
-#: ../../mod/profile.php:16 ../../mod/connect.php:13
-#: ../../mod/editblock.php:29 ../../mod/editlayout.php:27
-#: ../../mod/webpages.php:29 ../../mod/editwebpage.php:28
-#: ../../mod/blocks.php:29 ../../mod/filestorage.php:54 ../../mod/hcard.php:8
-#: ../../mod/layouts.php:29
-msgid "Requested profile is not available."
-msgstr "Opgevraagd profiel is niet beschikbaar"
-
-#: ../../include/identity.php:923 ../../mod/profiles.php:691
-msgid "Change profile photo"
-msgstr "Profielfoto veranderen"
-
-#: ../../include/identity.php:930 ../../include/nav.php:88
-#: ../../mod/profiles.php:776
-msgid "Edit Profiles"
-msgstr "Bewerk profielen"
-
#: ../../include/identity.php:931
msgid "Create New Profile"
msgstr "Nieuw profiel aanmaken"
@@ -311,32 +6376,10 @@ msgstr "Nieuw profiel aanmaken"
msgid "Edit Profile"
msgstr "Profiel bewerken"
-#: ../../include/identity.php:948 ../../mod/profiles.php:766
-msgid "Profile Image"
-msgstr "Profielfoto"
-
#: ../../include/identity.php:951
msgid "Visible to everybody"
msgstr "Voor iedereen zichtbaar"
-#: ../../include/identity.php:952 ../../mod/profiles.php:689
-#: ../../mod/profiles.php:770
-msgid "Edit visibility"
-msgstr "Zichtbaarheid bewerken"
-
-#: ../../include/identity.php:1007 ../../include/conversation.php:961
-#: ../../include/Contact.php:101 ../../include/widgets.php:147
-#: ../../include/widgets.php:184 ../../mod/directory.php:321
-#: ../../mod/suggest.php:52 ../../mod/match.php:64
-msgid "Connect"
-msgstr "Verbinden"
-
-#: ../../include/identity.php:1022 ../../include/bb2diaspora.php:487
-#: ../../include/event.php:52 ../../include/text.php:1452
-#: ../../mod/directory.php:307
-msgid "Location:"
-msgstr "Plaats:"
-
#: ../../include/identity.php:1026 ../../include/identity.php:1281
msgid "Gender:"
msgstr "Geslacht:"
@@ -353,20 +6396,10 @@ msgstr "Homepagina:"
msgid "Online Now"
msgstr "Nu online"
-#: ../../include/identity.php:1116 ../../include/identity.php:1192
-#: ../../mod/ping.php:318
-msgid "g A l F d"
-msgstr "G:i, l d F"
-
#: ../../include/identity.php:1117 ../../include/identity.php:1193
msgid "F d"
msgstr "d F"
-#: ../../include/identity.php:1162 ../../include/identity.php:1232
-#: ../../mod/ping.php:341
-msgid "[today]"
-msgstr "[vandaag]"
-
#: ../../include/identity.php:1173
msgid "Birthday Reminders"
msgstr "Verjaardagsherinneringen"
@@ -387,23 +6420,10 @@ msgstr "Herinneringen"
msgid "Events this week:"
msgstr "Gebeurtenissen deze week:"
-#: ../../include/identity.php:1279 ../../mod/settings.php:1047
-msgid "Full Name:"
-msgstr "Volledige naam:"
-
#: ../../include/identity.php:1286
msgid "Like this channel"
msgstr "Vind dit kanaal leuk"
-#: ../../include/identity.php:1297 ../../include/ItemObject.php:179
-#: ../../include/conversation.php:1760 ../../include/taxonomy.php:415
-#: ../../mod/photos.php:1125
-msgctxt "noun"
-msgid "Like"
-msgid_plural "Likes"
-msgstr[0] "vindt dit leuk"
-msgstr[1] "vinden dit leuk"
-
#: ../../include/identity.php:1310
msgid "j F, Y"
msgstr "F j Y"
@@ -416,10 +6436,6 @@ msgstr "F j"
msgid "Birthday:"
msgstr "Geboortedatum:"
-#: ../../include/identity.php:1322 ../../mod/directory.php:302
-msgid "Age:"
-msgstr "Leeftijd:"
-
#: ../../include/identity.php:1331
#, php-format
msgid "for %1$d %2$s"
@@ -429,10 +6445,6 @@ msgstr "voor %1$d %2$s"
msgid "Sexual Preference:"
msgstr "Seksuele voorkeur:"
-#: ../../include/identity.php:1338 ../../mod/directory.php:318
-msgid "Hometown:"
-msgstr "Oorspronkelijk uit:"
-
#: ../../include/identity.php:1340
msgid "Tags:"
msgstr "Tags:"
@@ -445,10 +6457,6 @@ msgstr "Politieke overtuigingen:"
msgid "Religion:"
msgstr "Religie:"
-#: ../../include/identity.php:1346 ../../mod/directory.php:320
-msgid "About:"
-msgstr "Over:"
-
#: ../../include/identity.php:1348
msgid "Hobbies/Interests:"
msgstr "Hobby's/interesses:"
@@ -497,19 +6505,10 @@ msgstr "Werk/beroep:"
msgid "School/education:"
msgstr "School/opleiding:"
-#: ../../include/identity.php:1388 ../../include/apps.php:138
-#: ../../mod/profperm.php:112
-msgid "Profile"
-msgstr "Profiel"
-
#: ../../include/identity.php:1390
msgid "Like this thing"
msgstr "Vind dit ding leuk"
-#: ../../include/identity.php:1800 ../../mod/cover_photo.php:236
-msgid "cover photo"
-msgstr "omslagfoto"
-
#: ../../include/notify.php:20
msgid "created a new post"
msgstr "maakte een nieuw bericht aan"
@@ -555,20 +6554,6 @@ msgstr "Oneens"
msgid "I abstain"
msgstr "Onthouding"
-#: ../../include/ItemObject.php:175 ../../include/ItemObject.php:187
-#: ../../include/conversation.php:1736 ../../mod/photos.php:1121
-#: ../../mod/photos.php:1133
-msgid "View all"
-msgstr "Toon alles"
-
-#: ../../include/ItemObject.php:184 ../../include/conversation.php:1763
-#: ../../mod/photos.php:1130
-msgctxt "noun"
-msgid "Dislike"
-msgid_plural "Dislikes"
-msgstr[0] "vindt dit niet leuk"
-msgstr[1] "vinden dit niet leuk"
-
#: ../../include/ItemObject.php:212
msgid "Add Star"
msgstr "Ster toevoegen"
@@ -597,18 +6582,10 @@ msgstr "Berichtkenmerk onjuist"
msgid "Add Tag"
msgstr "Tag toevoegen"
-#: ../../include/ItemObject.php:254 ../../mod/photos.php:1065
-msgid "I like this (toggle)"
-msgstr "Vind ik leuk"
-
#: ../../include/ItemObject.php:254 ../../include/taxonomy.php:328
msgid "like"
msgstr "vind dit leuk"
-#: ../../include/ItemObject.php:255 ../../mod/photos.php:1066
-msgid "I don't like this (toggle)"
-msgstr "Vind ik niet leuk"
-
#: ../../include/ItemObject.php:255 ../../include/taxonomy.php:329
msgid "dislike"
msgstr "vind dit niet leuk"
@@ -668,7 +6645,7 @@ msgstr "laatst bewerkt: %s"
msgid "Expires: %s"
msgstr "Verloopt: %s"
-#: ../../include/ItemObject.php:362
+#: ../../include/ItemObject.php:362 ../../bookmarker/bookmarker.php:45
msgid "Save Bookmarks"
msgstr "Bladwijzers opslaan"
@@ -680,97 +6657,10 @@ msgstr "Aan agenda toevoegen"
msgid "Mark all seen"
msgstr "Markeer alles als bekeken"
-#: ../../include/ItemObject.php:378 ../../mod/photos.php:1251
-msgctxt "noun"
-msgid "Likes"
-msgstr "vinden dit leuk"
-
-#: ../../include/ItemObject.php:379 ../../mod/photos.php:1252
-msgctxt "noun"
-msgid "Dislikes"
-msgstr "vinden dit niet leuk"
-
-#: ../../include/ItemObject.php:384 ../../include/acl_selectors.php:252
-#: ../../mod/photos.php:1257
-msgid "Close"
-msgstr "Sluiten"
-
-#: ../../include/ItemObject.php:389 ../../include/conversation.php:740
-#: ../../include/conversation.php:1244 ../../mod/editpost.php:131
-#: ../../mod/photos.php:1068 ../../mod/editblock.php:151
-#: ../../mod/editlayout.php:149 ../../mod/editwebpage.php:191
-msgid "Please wait"
-msgstr "Even wachten"
-
#: ../../include/ItemObject.php:413 ../../include/js_strings.php:7
msgid "[+] show all"
msgstr "[+] alle"
-#: ../../include/ItemObject.php:700 ../../mod/photos.php:1084
-#: ../../mod/photos.php:1202
-msgid "This is you"
-msgstr "Dit ben jij"
-
-#: ../../include/ItemObject.php:702 ../../include/js_strings.php:6
-#: ../../mod/photos.php:1086 ../../mod/photos.php:1204
-msgid "Comment"
-msgstr "Reactie"
-
-#: ../../include/ItemObject.php:703 ../../include/widgets.php:708
-#: ../../include/widgets.php:720 ../../include/js_strings.php:22
-#: ../../mod/admin.php:457 ../../mod/admin.php:646 ../../mod/admin.php:721
-#: ../../mod/admin.php:986 ../../mod/admin.php:1150 ../../mod/admin.php:1326
-#: ../../mod/admin.php:1521 ../../mod/admin.php:1606 ../../mod/admin.php:1770
-#: ../../mod/appman.php:99 ../../mod/pconfig.php:108 ../../mod/pdledit.php:62
-#: ../../mod/photos.php:672 ../../mod/photos.php:1047
-#: ../../mod/photos.php:1087 ../../mod/photos.php:1205 ../../mod/mitem.php:231
-#: ../../mod/cal.php:337 ../../mod/poke.php:182 ../../mod/chat.php:190
-#: ../../mod/chat.php:232 ../../mod/connect.php:93 ../../mod/mood.php:135
-#: ../../mod/connedit.php:729 ../../mod/profiles.php:687
-#: ../../mod/rate.php:168 ../../mod/events.php:468 ../../mod/events.php:665
-#: ../../mod/filestorage.php:156 ../../mod/fsuggest.php:108
-#: ../../mod/group.php:81 ../../mod/settings.php:597
-#: ../../mod/settings.php:710 ../../mod/settings.php:738
-#: ../../mod/settings.php:761 ../../mod/settings.php:849
-#: ../../mod/settings.php:1041 ../../mod/setup.php:336 ../../mod/setup.php:377
-#: ../../mod/import.php:542 ../../mod/import_items.php:116
-#: ../../mod/invite.php:142 ../../mod/locs.php:117 ../../mod/sources.php:104
-#: ../../mod/sources.php:138 ../../mod/mail.php:380 ../../mod/thing.php:312
-#: ../../mod/thing.php:358 ../../mod/xchan.php:11
-#: ../../view/theme/redbasic/php/config.php:99
-msgid "Submit"
-msgstr "Opslaan"
-
-#: ../../include/ItemObject.php:704 ../../include/conversation.php:1216
-#: ../../mod/editpost.php:115 ../../mod/editblock.php:137
-#: ../../mod/editlayout.php:136 ../../mod/editwebpage.php:178
-msgid "Bold"
-msgstr "Vet"
-
-#: ../../include/ItemObject.php:705 ../../include/conversation.php:1217
-#: ../../mod/editpost.php:116 ../../mod/editblock.php:138
-#: ../../mod/editlayout.php:137 ../../mod/editwebpage.php:179
-msgid "Italic"
-msgstr "Cursief"
-
-#: ../../include/ItemObject.php:706 ../../include/conversation.php:1218
-#: ../../mod/editpost.php:117 ../../mod/editblock.php:139
-#: ../../mod/editlayout.php:138 ../../mod/editwebpage.php:180
-msgid "Underline"
-msgstr "Onderstrepen"
-
-#: ../../include/ItemObject.php:707 ../../include/conversation.php:1219
-#: ../../mod/editpost.php:118 ../../mod/editblock.php:140
-#: ../../mod/editlayout.php:139 ../../mod/editwebpage.php:181
-msgid "Quote"
-msgstr "Citeren"
-
-#: ../../include/ItemObject.php:708 ../../include/conversation.php:1220
-#: ../../mod/editpost.php:119 ../../mod/editblock.php:141
-#: ../../mod/editlayout.php:140 ../../mod/editwebpage.php:182
-msgid "Code"
-msgstr "Broncode"
-
#: ../../include/ItemObject.php:709
msgid "Image"
msgstr "Afbeelding"
@@ -783,20 +6673,6 @@ msgstr "Link invoegen"
msgid "Video"
msgstr "Video"
-#: ../../include/ItemObject.php:712 ../../include/conversation.php:1186
-#: ../../include/page_widgets.php:40 ../../mod/editpost.php:151
-#: ../../mod/photos.php:1088 ../../mod/editblock.php:172
-#: ../../mod/webpages.php:192 ../../mod/editwebpage.php:213
-#: ../../mod/events.php:465
-msgid "Preview"
-msgstr "Voorvertoning"
-
-#: ../../include/ItemObject.php:715 ../../include/conversation.php:1274
-#: ../../mod/editpost.php:159 ../../mod/chat.php:200 ../../mod/mail.php:255
-#: ../../mod/mail.php:385
-msgid "Encrypt text"
-msgstr "Tekst versleutelen"
-
#: ../../include/account.php:28
msgid "Not a valid email address"
msgstr "Geen geldig e-mailadres"
@@ -875,16 +6751,6 @@ msgid "This action is not available under your subscription plan."
msgstr "Deze handeling is niet mogelijk met jouw abonnement."
#: ../../include/profile_selectors.php:6
-#: ../../include/profile_selectors.php:23 ../../mod/id.php:103
-msgid "Male"
-msgstr "Man"
-
-#: ../../include/profile_selectors.php:6
-#: ../../include/profile_selectors.php:23 ../../mod/id.php:105
-msgid "Female"
-msgstr "Vrouw"
-
-#: ../../include/profile_selectors.php:6
msgid "Currently Male"
msgstr "Momenteel man"
@@ -1133,13 +6999,6 @@ msgstr "Niet tonen"
msgid "Other networks and post services"
msgstr "Andere netwerken en diensten"
-#: ../../include/acl_selectors.php:251 ../../mod/photos.php:666
-#: ../../mod/photos.php:1040 ../../mod/chat.php:229
-#: ../../mod/filestorage.php:147 ../../mod/thing.php:309
-#: ../../mod/thing.php:355
-msgid "Permissions"
-msgstr "Permissies"
-
#: ../../include/activities.php:42
msgid " and "
msgstr " en "
@@ -1163,6 +7022,10 @@ msgstr "Bezoek het %2$s van %1$s"
msgid "%1$s has an updated %2$s, changing %3$s."
msgstr "%1$s heeft een aangepaste %2$s, %3$s veranderd."
+#: ../../include/api.php:1338
+msgid "Public Timeline"
+msgstr "Openbare tijdlijn"
+
#: ../../include/apps.php:128
msgid "Site Admin"
msgstr "Hubbeheerder"
@@ -1176,76 +7039,35 @@ msgstr "Bladwijzers"
msgid "Address Book"
msgstr "Connecties"
-#: ../../include/apps.php:131 ../../include/nav.php:110 ../../boot.php:1600
+#: ../../include/apps.php:131 ../../include/nav.php:110 ../../boot.php:1602
msgid "Login"
msgstr "Inloggen"
-#: ../../include/apps.php:132 ../../include/nav.php:203
-#: ../../mod/manage.php:158
-msgid "Channel Manager"
-msgstr "Kanaalbeheer"
-
-#: ../../include/apps.php:133 ../../include/nav.php:176
+#: ../../include/apps.php:133 ../../include/nav.php:182
msgid "Grid"
msgstr "Grid"
-#: ../../include/apps.php:134 ../../include/nav.php:205
-#: ../../include/widgets.php:589 ../../mod/admin.php:1266
-#: ../../mod/admin.php:1488
-msgid "Settings"
-msgstr "Instellingen"
-
-#: ../../include/apps.php:136 ../../include/conversation.php:1704
-#: ../../include/nav.php:106 ../../mod/webpages.php:182
-msgid "Webpages"
-msgstr "Webpagina's"
-
-#: ../../include/apps.php:137 ../../include/nav.php:179
+#: ../../include/apps.php:137 ../../include/nav.php:185
msgid "Channel Home"
msgstr "Jouw kanaal"
-#: ../../include/apps.php:139 ../../include/conversation.php:1650
-#: ../../include/nav.php:92 ../../mod/fbrowser.php:25
-msgid "Photos"
-msgstr "Foto's"
-
#: ../../include/apps.php:140 ../../include/conversation.php:1667
-#: ../../include/conversation.php:1670 ../../include/nav.php:198
+#: ../../include/conversation.php:1670 ../../include/nav.php:204
msgid "Events"
msgstr "Agenda"
-#: ../../include/apps.php:141 ../../include/nav.php:164
+#: ../../include/apps.php:141 ../../include/nav.php:170
msgid "Directory"
msgstr "Kanalengids"
-#: ../../include/apps.php:142 ../../include/nav.php:155 ../../mod/help.php:222
-#: ../../mod/help.php:227 ../../mod/layouts.php:177
-msgid "Help"
-msgstr "Hulp"
-
-#: ../../include/apps.php:143 ../../include/nav.php:190
+#: ../../include/apps.php:143 ../../include/nav.php:196
msgid "Mail"
msgstr "Privéberichten"
-#: ../../include/apps.php:144 ../../mod/mood.php:131
-msgid "Mood"
-msgstr "Stemming"
-
-#: ../../include/apps.php:145 ../../include/conversation.php:965
-#: ../../mod/poke.php:164
-msgid "Poke"
-msgstr "Aanstoten"
-
#: ../../include/apps.php:146 ../../include/nav.php:96
msgid "Chat"
msgstr "Chatten"
-#: ../../include/apps.php:147 ../../include/nav.php:161
-#: ../../include/text.php:904 ../../include/text.php:916
-#: ../../mod/connections.php:302 ../../mod/search.php:40
-msgid "Search"
-msgstr "Zoeken"
-
#: ../../include/apps.php:148
msgid "Probe"
msgstr "Onderzoeken"
@@ -1266,24 +7088,10 @@ msgstr "Uitnodigen "
msgid "Features"
msgstr "Extra functies"
-#: ../../include/apps.php:153 ../../mod/id.php:28
-msgid "Language"
-msgstr "Taal"
-
#: ../../include/apps.php:154
msgid "Post"
msgstr "Bericht"
-#: ../../include/apps.php:155 ../../mod/id.php:17 ../../mod/id.php:18
-#: ../../mod/id.php:19
-msgid "Profile Photo"
-msgstr "Profielfoto"
-
-#: ../../include/apps.php:252 ../../mod/settings.php:84
-#: ../../mod/settings.php:623
-msgid "Update"
-msgstr "Bijwerken"
-
#: ../../include/apps.php:252
msgid "Install"
msgstr "Installeren"
@@ -1292,106 +7100,6 @@ msgstr "Installeren"
msgid "Purchase"
msgstr "Aanschaffen"
-#: ../../include/items.php:423 ../../mod/profperm.php:23
-#: ../../mod/dreport.php:6 ../../mod/dreport.php:45 ../../mod/group.php:68
-#: ../../mod/import_items.php:108 ../../mod/like.php:280
-#: ../../mod/subthread.php:58 ../../index.php:173
-msgid "Permission denied"
-msgstr "Toegang geweigerd"
-
-#: ../../include/items.php:1138 ../../include/items.php:1183
-msgid "(Unknown)"
-msgstr "(Onbekend)"
-
-#: ../../include/items.php:1382
-msgid "Visible to anybody on the internet."
-msgstr "Voor iedereen op het internet zichtbaar."
-
-#: ../../include/items.php:1384
-msgid "Visible to you only."
-msgstr "Alleen voor jou zichtbaar."
-
-#: ../../include/items.php:1386
-msgid "Visible to anybody in this network."
-msgstr "Voor iedereen in dit netwerk zichtbaar."
-
-#: ../../include/items.php:1388
-msgid "Visible to anybody authenticated."
-msgstr "Voor iedereen die geauthenticeerd is zichtbaar."
-
-#: ../../include/items.php:1390
-#, php-format
-msgid "Visible to anybody on %s."
-msgstr "Voor iedereen op %s zichtbaar."
-
-#: ../../include/items.php:1392
-msgid "Visible to all connections."
-msgstr "Voor alle connecties zichtbaar."
-
-#: ../../include/items.php:1394
-msgid "Visible to approved connections."
-msgstr "Voor alle geaccepteerde connecties zichtbaar."
-
-#: ../../include/items.php:1396
-msgid "Visible to specific connections."
-msgstr "Voor specifieke connecties zichtbaar."
-
-#: ../../include/items.php:4592 ../../mod/admin.php:141
-#: ../../mod/admin.php:1189 ../../mod/admin.php:1434 ../../mod/display.php:40
-#: ../../mod/filestorage.php:27 ../../mod/thing.php:85
-#: ../../mod/viewsrc.php:20
-msgid "Item not found."
-msgstr "Item niet gevonden."
-
-#: ../../include/items.php:5126 ../../mod/group.php:38 ../../mod/group.php:137
-msgid "Privacy group not found."
-msgstr "Privacygroep niet gevonden"
-
-#: ../../include/items.php:5142
-msgid "Privacy group is empty."
-msgstr "Privacygroep is leeg"
-
-#: ../../include/items.php:5149
-#, php-format
-msgid "Privacy group: %s"
-msgstr "Privacygroep: %s"
-
-#: ../../include/items.php:5159 ../../mod/connedit.php:701
-#, php-format
-msgid "Connection: %s"
-msgstr "Connectie: %s"
-
-#: ../../include/items.php:5161
-msgid "Connection not found."
-msgstr "Connectie niet gevonden."
-
-#: ../../include/items.php:5587 ../../mod/cover_photo.php:229
-msgid "female"
-msgstr "vrouw"
-
-#: ../../include/items.php:5588 ../../mod/cover_photo.php:230
-#, php-format
-msgid "%1$s updated her %2$s"
-msgstr "%1$s heeft haar %2$s bijgewerkt"
-
-#: ../../include/items.php:5589 ../../mod/cover_photo.php:231
-msgid "male"
-msgstr "man"
-
-#: ../../include/items.php:5590 ../../mod/cover_photo.php:232
-#, php-format
-msgid "%1$s updated his %2$s"
-msgstr "%1$s heeft zijn %2$s bijgewerkt"
-
-#: ../../include/items.php:5592 ../../mod/cover_photo.php:234
-#, php-format
-msgid "%1$s updated their %2$s"
-msgstr "De %2$s van %1$s is bijgewerkt"
-
-#: ../../include/items.php:5594
-msgid "profile photo"
-msgstr "profielfoto"
-
#: ../../include/network.php:659
msgid "view full size"
msgstr "volledige grootte tonen"
@@ -1417,61 +7125,25 @@ msgstr "Beheerder %s"
msgid "No Subject"
msgstr "Geen onderwerp"
-#: ../../include/photos.php:112
-#, php-format
-msgid "Image exceeds website size limit of %lu bytes"
-msgstr "Afbeelding is groter dan op deze hub toegestane limiet van %lu bytes"
-
-#: ../../include/photos.php:119
-msgid "Image file is empty."
-msgstr "Afbeeldingsbestand is leeg"
-
-#: ../../include/photos.php:146 ../../mod/profile_photo.php:225
-#: ../../mod/cover_photo.php:164
-msgid "Unable to process image"
-msgstr "Afbeelding kan niet verwerkt worden"
-
-#: ../../include/photos.php:257
-msgid "Photo storage failed."
-msgstr "Foto kan niet worden opgeslagen"
-
-#: ../../include/photos.php:297
-msgid "a new photo"
-msgstr "een nieuwe foto"
-
-#: ../../include/photos.php:301
-#, php-format
-msgctxt "photo_upload"
-msgid "%1$s posted %2$s to %3$s"
-msgstr "%1$s plaatste %2$s op %3$s"
-
-#: ../../include/photos.php:506 ../../include/conversation.php:1653
-msgid "Photo Albums"
-msgstr "Fotoalbums"
-
-#: ../../include/photos.php:510
-msgid "Upload New Photos"
-msgstr "Nieuwe foto's uploaden"
-
-#: ../../include/bb2diaspora.php:376
+#: ../../include/bb2diaspora.php:398
msgid "Attachments:"
msgstr "Bijlagen:"
-#: ../../include/bb2diaspora.php:465 ../../include/event.php:22
+#: ../../include/bb2diaspora.php:487 ../../include/event.php:22
#: ../../include/text.php:1437
msgid "l F d, Y \\@ g:i A"
msgstr "l d F Y \\@ G:i"
-#: ../../include/bb2diaspora.php:467
+#: ../../include/bb2diaspora.php:489
msgid "$Projectname event notification:"
msgstr "Notificatie $Projectname-gebeurtenis:"
-#: ../../include/bb2diaspora.php:471 ../../include/event.php:30
+#: ../../include/bb2diaspora.php:493 ../../include/event.php:30
#: ../../include/text.php:1441
msgid "Starts:"
msgstr "Start:"
-#: ../../include/bb2diaspora.php:479 ../../include/event.php:40
+#: ../../include/bb2diaspora.php:501 ../../include/event.php:40
#: ../../include/text.php:1445
msgid "Finishes:"
msgstr "Einde:"
@@ -1502,31 +7174,11 @@ msgid ""
"to install it on this site."
msgstr "Dit bericht heeft een te installeren %s-element, maar je hebt geen permissies om het op deze hub te installeren."
-#: ../../include/bbcode.php:193 ../../mod/impel.php:37
-msgid "webpage"
-msgstr "Webpagina"
-
-#: ../../include/bbcode.php:196 ../../mod/impel.php:47
-msgid "layout"
-msgstr "lay-out"
-
-#: ../../include/bbcode.php:199 ../../mod/impel.php:42
-msgid "block"
-msgstr "blok"
-
-#: ../../include/bbcode.php:202 ../../mod/impel.php:54
-msgid "menu"
-msgstr "menu"
-
#: ../../include/bbcode.php:255
#, php-format
msgid "%1$s wrote the following %2$s %3$s"
msgstr "%1$s schreef het volgende %2$s %3$s"
-#: ../../include/bbcode.php:257 ../../mod/tagger.php:51
-msgid "post"
-msgstr "bericht"
-
#: ../../include/bbcode.php:545
msgid "Different viewers will see this text differently"
msgstr "Deze tekst wordt per persoon anders weergeven."
@@ -1539,41 +7191,6 @@ msgstr "$1 spoiler"
msgid "$1 wrote:"
msgstr "$1 schreef:"
-#: ../../include/conversation.php:120 ../../include/text.php:1967
-#: ../../mod/like.php:367 ../../mod/subthread.php:83 ../../mod/tagger.php:43
-msgid "photo"
-msgstr "foto"
-
-#: ../../include/conversation.php:123 ../../include/event.php:915
-#: ../../include/text.php:1970 ../../mod/events.php:249 ../../mod/like.php:369
-#: ../../mod/tagger.php:47
-msgid "event"
-msgstr "gebeurtenis"
-
-#: ../../include/conversation.php:126 ../../mod/like.php:113
-msgid "channel"
-msgstr "kanaal"
-
-#: ../../include/conversation.php:148 ../../include/text.php:1973
-#: ../../mod/like.php:367 ../../mod/subthread.php:83
-msgid "status"
-msgstr "bericht"
-
-#: ../../include/conversation.php:150 ../../include/text.php:1975
-#: ../../mod/tagger.php:53
-msgid "comment"
-msgstr "reactie"
-
-#: ../../include/conversation.php:164 ../../mod/like.php:416
-#, php-format
-msgid "%1$s likes %2$s's %3$s"
-msgstr "%1$s vindt %3$s van %2$s leuk"
-
-#: ../../include/conversation.php:167 ../../mod/like.php:418
-#, php-format
-msgid "%1$s doesn't like %2$s's %3$s"
-msgstr "%1$s vindt %3$s van %2$s niet leuk"
-
#: ../../include/conversation.php:204
#, php-format
msgid "%1$s is now connected with %2$s"
@@ -1589,52 +7206,6 @@ msgstr "%1$s heeft %2$s aangestoten"
msgid "poked"
msgstr "aangestoten"
-#: ../../include/conversation.php:260 ../../mod/mood.php:63
-#, php-format
-msgctxt "mood"
-msgid "%1$s is %2$s"
-msgstr "%1$s is %2$s"
-
-#: ../../include/conversation.php:574 ../../mod/photos.php:1102
-msgctxt "title"
-msgid "Likes"
-msgstr "vinden dit leuk"
-
-#: ../../include/conversation.php:574 ../../mod/photos.php:1102
-msgctxt "title"
-msgid "Dislikes"
-msgstr "vinden dit niet leuk"
-
-#: ../../include/conversation.php:575 ../../mod/photos.php:1103
-msgctxt "title"
-msgid "Agree"
-msgstr "eens"
-
-#: ../../include/conversation.php:575 ../../mod/photos.php:1103
-msgctxt "title"
-msgid "Disagree"
-msgstr "oneens"
-
-#: ../../include/conversation.php:575 ../../mod/photos.php:1103
-msgctxt "title"
-msgid "Abstain"
-msgstr "onthoudingen"
-
-#: ../../include/conversation.php:576 ../../mod/photos.php:1104
-msgctxt "title"
-msgid "Attending"
-msgstr "aanwezig"
-
-#: ../../include/conversation.php:576 ../../mod/photos.php:1104
-msgctxt "title"
-msgid "Not attending"
-msgstr "niet aanwezig"
-
-#: ../../include/conversation.php:576 ../../mod/photos.php:1104
-msgctxt "title"
-msgid "Might attend"
-msgstr "mogelijk aanwezig"
-
#: ../../include/conversation.php:691
#, php-format
msgid "View %s's profile @ %s"
@@ -1656,7 +7227,7 @@ msgstr "In context bekijken"
msgid "remove"
msgstr "verwijderen"
-#: ../../include/conversation.php:854 ../../include/nav.php:244
+#: ../../include/conversation.php:854 ../../include/nav.php:256
msgid "Loading..."
msgstr "Aan het laden..."
@@ -1676,11 +7247,6 @@ msgstr "Conversatie volgen"
msgid "Unfollow Thread"
msgstr "Conversatie niet meer volgen"
-#: ../../include/conversation.php:959 ../../include/nav.php:86
-#: ../../mod/connedit.php:516
-msgid "View Profile"
-msgstr "Profiel weergeven"
-
#: ../../include/conversation.php:960
msgid "Activity/Posts"
msgstr "Activiteit/berichten connectie"
@@ -1693,11 +7259,6 @@ msgstr "Connectie bewerken"
msgid "Message"
msgstr "Bericht"
-#: ../../include/conversation.php:964 ../../mod/pubsites.php:27
-#: ../../mod/ratings.php:99
-msgid "Ratings"
-msgstr "Beoordelingen"
-
#: ../../include/conversation.php:1080
#, php-format
msgid "%s likes this."
@@ -1747,11 +7308,6 @@ msgstr "%s vinden dit niet leuk."
msgid "Visible to <strong>everybody</strong>"
msgstr "Voor <strong>iedereen</strong> zichtbaar"
-#: ../../include/conversation.php:1170 ../../mod/chat.php:199
-#: ../../mod/mail.php:202 ../../mod/mail.php:316
-msgid "Please enter a link URL:"
-msgstr "Vul een URL in:"
-
#: ../../include/conversation.php:1171
msgid "Please enter a video link/URL:"
msgstr "Vul een videolink/URL in:"
@@ -1764,25 +7320,10 @@ msgstr "Vul een audiolink/URL in:"
msgid "Tag term:"
msgstr "Tag:"
-#: ../../include/conversation.php:1174 ../../mod/filer.php:48
-msgid "Save to Folder:"
-msgstr "Bewaar in map: "
-
#: ../../include/conversation.php:1175
msgid "Where are you right now?"
msgstr "Waar bevind je je op dit moment?"
-#: ../../include/conversation.php:1176 ../../mod/editpost.php:56
-#: ../../mod/mail.php:203 ../../mod/mail.php:317
-msgid "Expires YYYY-MM-DD HH:MM"
-msgstr "Verloopt op DD-MM-YYYY om HH:MM"
-
-#: ../../include/conversation.php:1209 ../../mod/photos.php:1067
-#: ../../mod/webpages.php:186 ../../mod/blocks.php:156
-#: ../../mod/layouts.php:185
-msgid "Share"
-msgstr "Delen"
-
#: ../../include/conversation.php:1211
msgid "Page link name"
msgstr "Linknaam pagina"
@@ -1791,33 +7332,14 @@ msgstr "Linknaam pagina"
msgid "Post as"
msgstr "Bericht plaatsen als"
-#: ../../include/conversation.php:1221 ../../mod/editpost.php:120
-#: ../../mod/editblock.php:143 ../../mod/editlayout.php:141
-#: ../../mod/editwebpage.php:183
-msgid "Upload photo"
-msgstr "Foto uploaden"
-
#: ../../include/conversation.php:1222
msgid "upload photo"
msgstr "foto uploaden"
-#: ../../include/conversation.php:1223 ../../mod/editpost.php:121
-#: ../../mod/editblock.php:144 ../../mod/editlayout.php:142
-#: ../../mod/editwebpage.php:184 ../../mod/mail.php:248 ../../mod/mail.php:378
-msgid "Attach file"
-msgstr "Bestand toevoegen"
-
#: ../../include/conversation.php:1224
msgid "attach file"
msgstr "bestand toevoegen"
-#: ../../include/conversation.php:1225 ../../mod/editpost.php:122
-#: ../../mod/chat.php:201 ../../mod/editblock.php:145
-#: ../../mod/editlayout.php:143 ../../mod/editwebpage.php:185
-#: ../../mod/mail.php:249 ../../mod/mail.php:379
-msgid "Insert web link"
-msgstr "Weblink invoegen"
-
#: ../../include/conversation.php:1226
msgid "web link"
msgstr "Weblink"
@@ -1838,84 +7360,22 @@ msgstr "Audiolink invoegen"
msgid "audio link"
msgstr "audiolink"
-#: ../../include/conversation.php:1231 ../../mod/editpost.php:126
-#: ../../mod/editblock.php:149 ../../mod/editlayout.php:147
-#: ../../mod/editwebpage.php:189
-msgid "Set your location"
-msgstr "Locatie instellen"
-
#: ../../include/conversation.php:1232
msgid "set location"
msgstr "locatie instellen"
-#: ../../include/conversation.php:1233 ../../mod/editpost.php:128
-msgid "Toggle voting"
-msgstr "Peiling in- of uitschakelen"
-
-#: ../../include/conversation.php:1236 ../../mod/editpost.php:127
-#: ../../mod/editblock.php:150 ../../mod/editlayout.php:148
-#: ../../mod/editwebpage.php:190
-msgid "Clear browser location"
-msgstr "Locatie van webbrowser wissen"
-
#: ../../include/conversation.php:1237
msgid "clear location"
msgstr "locatie wissen"
-#: ../../include/conversation.php:1239 ../../mod/editpost.php:143
-#: ../../mod/editblock.php:163 ../../mod/editwebpage.php:206
-msgid "Title (optional)"
-msgstr "Titel (optioneel)"
-
-#: ../../include/conversation.php:1243 ../../mod/editpost.php:145
-#: ../../mod/editblock.php:166 ../../mod/editlayout.php:164
-#: ../../mod/editwebpage.php:208
-msgid "Categories (optional, comma-separated list)"
-msgstr "Categorieën (optioneel, door komma's gescheiden lijst)"
-
-#: ../../include/conversation.php:1245 ../../mod/editpost.php:132
-#: ../../mod/editblock.php:152 ../../mod/editlayout.php:150
-#: ../../mod/editwebpage.php:192 ../../mod/events.php:466
-msgid "Permission settings"
-msgstr "Permissies"
-
#: ../../include/conversation.php:1246
msgid "permissions"
msgstr "permissies"
-#: ../../include/conversation.php:1254 ../../mod/editpost.php:140
-#: ../../mod/editblock.php:160 ../../mod/editlayout.php:157
-#: ../../mod/editwebpage.php:201
-msgid "Public post"
-msgstr "Openbaar bericht"
-
-#: ../../include/conversation.php:1256 ../../mod/editpost.php:146
-#: ../../mod/editblock.php:167 ../../mod/editlayout.php:165
-#: ../../mod/editwebpage.php:209
-msgid "Example: bob@example.com, mary@example.com"
-msgstr "Voorbeeld: bob@voorbeeld.nl, mary@voorbeeld.be"
-
-#: ../../include/conversation.php:1269 ../../mod/editpost.php:157
-#: ../../mod/editblock.php:177 ../../mod/editlayout.php:174
-#: ../../mod/editwebpage.php:218 ../../mod/mail.php:253 ../../mod/mail.php:383
-msgid "Set expiration date"
-msgstr "Verloopdatum instellen"
-
#: ../../include/conversation.php:1272
msgid "Set publish date"
msgstr "Publicatiedatum instellen"
-#: ../../include/conversation.php:1276 ../../mod/editpost.php:161
-msgid "OK"
-msgstr "OK"
-
-#: ../../include/conversation.php:1277 ../../mod/editpost.php:162
-#: ../../mod/fbrowser.php:77 ../../mod/fbrowser.php:112
-#: ../../mod/settings.php:598 ../../mod/settings.php:624
-#: ../../mod/tagrm.php:11 ../../mod/tagrm.php:134
-msgid "Cancel"
-msgstr "Annuleren"
-
#: ../../include/conversation.php:1521
msgid "Discover"
msgstr "Ontdekken"
@@ -1940,20 +7400,10 @@ msgstr "Nieuwe berichten bovenaan"
msgid "Sort by Post Date"
msgstr "Nieuwe berichten bovenaan"
-#: ../../include/conversation.php:1544 ../../include/widgets.php:105
-#: ../../mod/profiles.php:696
-msgid "Personal"
-msgstr "Persoonlijk"
-
#: ../../include/conversation.php:1547
msgid "Posts that mention or involve you"
msgstr "Alleen berichten die jou vermelden of waar je op een andere manier bij betrokken bent"
-#: ../../include/conversation.php:1553 ../../mod/connections.php:72
-#: ../../mod/connections.php:82 ../../mod/menu.php:112
-msgid "New"
-msgstr "Nieuw"
-
#: ../../include/conversation.php:1556
msgid "Activity Stream - by date"
msgstr "Activiteitenstroom - volgens datum"
@@ -1974,10 +7424,6 @@ msgstr "Spam"
msgid "Posts flagged as SPAM"
msgstr "Berichten gemarkeerd als SPAM"
-#: ../../include/conversation.php:1629 ../../mod/admin.php:1157
-msgid "Channel"
-msgstr "Kanaal"
-
#: ../../include/conversation.php:1632
msgid "Status Messages and Posts"
msgstr "Berichten in dit kanaal"
@@ -1990,6 +7436,10 @@ msgstr "Over"
msgid "Profile Details"
msgstr "Profiel"
+#: ../../include/conversation.php:1653 ../../include/photos.php:506
+msgid "Photo Albums"
+msgstr "Fotoalbums"
+
#: ../../include/conversation.php:1660
msgid "Files and Storage"
msgstr "Bestanden en opslagruimte"
@@ -2095,20 +7545,12 @@ msgstr "Uitgelogd."
msgid "Failed authentication"
msgstr "Mislukte authenticatie"
-#: ../../include/auth.php:226 ../../mod/openid.php:189
-msgid "Login failed."
-msgstr "Inloggen mislukt."
-
#: ../../include/security.php:383
msgid ""
"The form security token was not correct. This probably happened because the "
"form has been opened for too long (>3 hours) before submitting it."
msgstr "De beveiligings-token van het tekstvak was ongeldig. Dit is mogelijk het gevolg van dat er te lang (meer dan 3 uur) gewacht is om de tekst op te slaan. "
-#: ../../include/comanche.php:34 ../../mod/admin.php:366
-msgid "Default"
-msgstr "Standaard"
-
#: ../../include/contact_selectors.php:56
msgid "Frequently"
msgstr "Regelmatig"
@@ -2150,12 +7592,6 @@ msgstr "GNU social"
msgid "RSS/Atom"
msgstr "RSS/Atom"
-#: ../../include/contact_selectors.php:81 ../../mod/admin.php:989
-#: ../../mod/admin.php:998 ../../mod/id.php:15 ../../mod/id.php:16
-#: ../../boot.php:1602
-msgid "Email"
-msgstr "E-mail"
-
#: ../../include/contact_selectors.php:82
msgid "Diaspora"
msgstr "Diaspora"
@@ -2187,10 +7623,6 @@ msgid_plural "%d invitations available"
msgstr[0] "%d uitnodiging beschikbaar"
msgstr[1] "%d uitnodigingen beschikbaar"
-#: ../../include/contact_widgets.php:19 ../../mod/admin.php:461
-msgid "Advanced"
-msgstr "Geavanceerd"
-
#: ../../include/contact_widgets.php:22
msgid "Find Channels"
msgstr "Kanalen vinden"
@@ -2207,16 +7639,6 @@ msgstr "Verbinden/volgen"
msgid "Examples: Robert Morgenstein, Fishing"
msgstr "Voorbeeld: Robert Morgenstein, vissen"
-#: ../../include/contact_widgets.php:26 ../../mod/connections.php:305
-#: ../../mod/directory.php:384 ../../mod/directory.php:389
-msgid "Find"
-msgstr "Vinden"
-
-#: ../../include/contact_widgets.php:27 ../../mod/directory.php:388
-#: ../../mod/suggest.php:60
-msgid "Channel Suggestions"
-msgstr "Voorgestelde kanalen"
-
#: ../../include/contact_widgets.php:29
msgid "Random Profile"
msgstr "Willekeurig profiel"
@@ -2317,10 +7739,6 @@ msgstr "opslag in database mislukt."
msgid "Empty path"
msgstr "Ontbrekend bestandspad"
-#: ../../include/datetime.php:48 ../../mod/profiles.php:699
-msgid "Miscellaneous"
-msgstr "Diversen"
-
#: ../../include/datetime.php:136
msgid "Birthday"
msgstr "Verjaardag of geboortedatum"
@@ -2333,14 +7751,7 @@ msgstr "Leeftijd:"
msgid "YYYY-MM-DD or MM-DD"
msgstr "JJJJ-MM-DD of MM-DD"
-#: ../../include/datetime.php:246 ../../mod/appman.php:91
-#: ../../mod/appman.php:92 ../../mod/profiles.php:708
-#: ../../mod/profiles.php:712 ../../mod/events.php:444
-#: ../../mod/events.php:449
-msgid "Required"
-msgstr "Vereist"
-
-#: ../../include/datetime.php:273 ../../boot.php:2430
+#: ../../include/datetime.php:273 ../../boot.php:2432
msgid "never"
msgstr "nooit"
@@ -2421,32 +7832,6 @@ msgstr "Opties kanalengids"
msgid "Safe Mode"
msgstr "Veilig zoeken"
-#: ../../include/dir_fns.php:141 ../../include/dir_fns.php:142
-#: ../../include/dir_fns.php:143 ../../mod/admin.php:425 ../../mod/api.php:102
-#: ../../mod/photos.php:661 ../../mod/mitem.php:154 ../../mod/mitem.php:155
-#: ../../mod/mitem.php:228 ../../mod/mitem.php:229 ../../mod/connedit.php:375
-#: ../../mod/connedit.php:653 ../../mod/profiles.php:647
-#: ../../mod/events.php:454 ../../mod/events.php:455 ../../mod/events.php:464
-#: ../../mod/filestorage.php:151 ../../mod/filestorage.php:159
-#: ../../mod/removeme.php:60 ../../mod/settings.php:588 ../../mod/menu.php:96
-#: ../../mod/menu.php:153 ../../view/theme/redbasic/php/config.php:105
-#: ../../view/theme/redbasic/php/config.php:130 ../../boot.php:1604
-msgid "No"
-msgstr "Nee"
-
-#: ../../include/dir_fns.php:141 ../../include/dir_fns.php:142
-#: ../../include/dir_fns.php:143 ../../mod/admin.php:427 ../../mod/api.php:101
-#: ../../mod/photos.php:661 ../../mod/mitem.php:154 ../../mod/mitem.php:155
-#: ../../mod/mitem.php:228 ../../mod/mitem.php:229 ../../mod/connedit.php:375
-#: ../../mod/profiles.php:647 ../../mod/events.php:454
-#: ../../mod/events.php:455 ../../mod/events.php:464
-#: ../../mod/filestorage.php:151 ../../mod/filestorage.php:159
-#: ../../mod/removeme.php:60 ../../mod/settings.php:588 ../../mod/menu.php:96
-#: ../../mod/menu.php:153 ../../view/theme/redbasic/php/config.php:105
-#: ../../view/theme/redbasic/php/config.php:130 ../../boot.php:1604
-msgid "Yes"
-msgstr "Ja"
-
#: ../../include/dir_fns.php:142
msgid "Public Forums Only"
msgstr "Alleen openbare forums"
@@ -2786,11 +8171,6 @@ msgid ""
"(640px) photo thumbnails"
msgstr "Gebruik grotere foto's (1024px) in berichten. Wanneer dit is uitgeschakeld worden er kleinere foto's (640px) gebruikt."
-#: ../../include/features.php:71 ../../include/widgets.php:581
-#: ../../mod/sources.php:88
-msgid "Channel Sources"
-msgstr "Kanaalbronnen"
-
#: ../../include/features.php:71
msgid "Automatically import channel content from other channels or feeds"
msgstr "Automatisch inhoud uit andere kanalen of feeds importeren."
@@ -2985,10 +8365,6 @@ msgstr "Een verwijderde collectie met deze naam is gereactiveerd. Bestaande item
msgid "Add new connections to this privacy group"
msgstr "Voeg nieuwe connecties aan deze privacygroep toe"
-#: ../../include/group.php:267 ../../mod/admin.php:998
-msgid "All Channels"
-msgstr "Alle kanalen"
-
#: ../../include/group.php:289
msgid "edit"
msgstr "bewerken"
@@ -3009,217 +8385,86 @@ msgstr "Kanalen die zich in geen enkele privacygroep bevinden"
msgid "add"
msgstr "toevoegen"
-#: ../../include/zot.php:680
-msgid "Invalid data packet"
-msgstr "Datapakket ongeldig"
-
-#: ../../include/zot.php:696
-msgid "Unable to verify channel signature"
-msgstr "Kanaalkenmerk kon niet worden geverifieerd. "
-
-#: ../../include/zot.php:2332
-#, php-format
-msgid "Unable to verify site signature for %s"
-msgstr "Hubkenmerk voor %s kon niet worden geverifieerd"
-
-#: ../../include/zot.php:3670
-msgid "invalid target signature"
-msgstr "ongeldig doelkenmerk"
-
-#: ../../include/nav.php:82 ../../include/nav.php:113 ../../boot.php:1599
-msgid "Logout"
-msgstr "Uitloggen"
-
-#: ../../include/nav.php:82 ../../include/nav.php:113
-msgid "End this session"
-msgstr "Beëindig deze sessie"
-
-#: ../../include/nav.php:85 ../../include/nav.php:144
-msgid "Home"
-msgstr "Home"
-
-#: ../../include/nav.php:85
-msgid "Your posts and conversations"
-msgstr "Jouw kanaal"
-
-#: ../../include/nav.php:86
-msgid "Your profile page"
-msgstr "Jouw profielpagina"
-
-#: ../../include/nav.php:88
-msgid "Manage/Edit profiles"
-msgstr "Beheer/wijzig profielen"
-
-#: ../../include/nav.php:90
-msgid "Edit your profile"
-msgstr "Jouw profiel bewerken"
-
-#: ../../include/nav.php:92
-msgid "Your photos"
-msgstr "Jouw foto's"
-
-#: ../../include/nav.php:93
-msgid "Your files"
-msgstr "Jouw bestanden"
+#: ../../include/items.php:1138 ../../include/items.php:1183
+msgid "(Unknown)"
+msgstr "(Onbekend)"
-#: ../../include/nav.php:96
-msgid "Your chatrooms"
-msgstr "Jouw chatkanalen"
+#: ../../include/items.php:1382
+msgid "Visible to anybody on the internet."
+msgstr "Voor iedereen op het internet zichtbaar."
-#: ../../include/nav.php:102
-msgid "Your bookmarks"
-msgstr "Jouw bladwijzers"
+#: ../../include/items.php:1384
+msgid "Visible to you only."
+msgstr "Alleen voor jou zichtbaar."
-#: ../../include/nav.php:106
-msgid "Your webpages"
-msgstr "Jouw webpagina's"
+#: ../../include/items.php:1386
+msgid "Visible to anybody in this network."
+msgstr "Voor iedereen in dit netwerk zichtbaar."
-#: ../../include/nav.php:110
-msgid "Sign in"
-msgstr "Inloggen"
+#: ../../include/items.php:1388
+msgid "Visible to anybody authenticated."
+msgstr "Voor iedereen die geauthenticeerd is zichtbaar."
-#: ../../include/nav.php:127
+#: ../../include/items.php:1390
#, php-format
-msgid "%s - click to logout"
-msgstr "%s - klik om uit te loggen"
-
-#: ../../include/nav.php:130
-msgid "Remote authentication"
-msgstr "Authenticatie op afstand"
-
-#: ../../include/nav.php:130
-msgid "Click to authenticate to your home hub"
-msgstr "Authenticeer jezelf via (bijvoorbeeld) jouw hub"
-
-#: ../../include/nav.php:144
-msgid "Home Page"
-msgstr "Homepage"
-
-#: ../../include/nav.php:148 ../../mod/register.php:258 ../../boot.php:1582
-msgid "Register"
-msgstr "Registreren"
-
-#: ../../include/nav.php:148
-msgid "Create an account"
-msgstr "Maak een account aan"
-
-#: ../../include/nav.php:155
-msgid "Help and documentation"
-msgstr "Hulp en documentatie"
-
-#: ../../include/nav.php:159 ../../include/widgets.php:102
-#: ../../mod/apps.php:36
-msgid "Apps"
-msgstr "Apps"
-
-#: ../../include/nav.php:159
-msgid "Applications, utilities, links, games"
-msgstr "Apps"
-
-#: ../../include/nav.php:161
-msgid "Search site @name, #tag, ?docs, content"
-msgstr "Zoek een @kanaal, doorzoek inhoud hub met tekst en #tags, of doorzoek ?documentatie "
-
-#: ../../include/nav.php:164
-msgid "Channel Directory"
-msgstr "Kanalengids"
-
-#: ../../include/nav.php:176
-msgid "Your grid"
-msgstr "Jouw grid"
-
-#: ../../include/nav.php:177
-msgid "Mark all grid notifications seen"
-msgstr "Markeer alle gridnotificaties als bekeken"
-
-#: ../../include/nav.php:179
-msgid "Channel home"
-msgstr "Jouw kanaal"
-
-#: ../../include/nav.php:180
-msgid "Mark all channel notifications seen"
-msgstr "Alle kanaalnotificaties als gelezen markeren"
-
-#: ../../include/nav.php:183 ../../include/text.php:834
-#: ../../mod/connections.php:298
-msgid "Connections"
-msgstr "Connecties"
-
-#: ../../include/nav.php:186
-msgid "Notices"
-msgstr "Notificaties"
-
-#: ../../include/nav.php:186
-msgid "Notifications"
-msgstr "Notificaties"
-
-#: ../../include/nav.php:187
-msgid "See all notifications"
-msgstr "Alle notificaties weergeven"
-
-#: ../../include/nav.php:188 ../../mod/notifications.php:99
-msgid "Mark all system notifications seen"
-msgstr "Markeer alle systeemnotificaties als bekeken"
-
-#: ../../include/nav.php:190
-msgid "Private mail"
-msgstr "Privéberichten"
-
-#: ../../include/nav.php:191
-msgid "See all private messages"
-msgstr "Alle privéberichten weergeven"
+msgid "Visible to anybody on %s."
+msgstr "Voor iedereen op %s zichtbaar."
-#: ../../include/nav.php:192
-msgid "Mark all private messages seen"
-msgstr "Markeer alle privéberichten als bekeken"
+#: ../../include/items.php:1392
+msgid "Visible to all connections."
+msgstr "Voor alle connecties zichtbaar."
-#: ../../include/nav.php:193 ../../include/widgets.php:609
-msgid "Inbox"
-msgstr "Postvak IN"
+#: ../../include/items.php:1394
+msgid "Visible to approved connections."
+msgstr "Voor alle geaccepteerde connecties zichtbaar."
-#: ../../include/nav.php:194 ../../include/widgets.php:614
-msgid "Outbox"
-msgstr "Postvak UIT"
+#: ../../include/items.php:1396
+msgid "Visible to specific connections."
+msgstr "Voor specifieke connecties zichtbaar."
-#: ../../include/nav.php:195 ../../include/widgets.php:619
-msgid "New Message"
-msgstr "Nieuw bericht"
+#: ../../include/items.php:5142
+msgid "Privacy group is empty."
+msgstr "Privacygroep is leeg"
-#: ../../include/nav.php:198
-msgid "Event Calendar"
-msgstr "Agenda"
+#: ../../include/items.php:5149
+#, php-format
+msgid "Privacy group: %s"
+msgstr "Privacygroep: %s"
-#: ../../include/nav.php:199
-msgid "See all events"
-msgstr "Alle gebeurtenissen weergeven"
+#: ../../include/items.php:5161
+msgid "Connection not found."
+msgstr "Connectie niet gevonden."
-#: ../../include/nav.php:200
-msgid "Mark all events seen"
-msgstr "Markeer alle gebeurtenissen als bekeken"
+#: ../../include/items.php:5594
+msgid "profile photo"
+msgstr "profielfoto"
-#: ../../include/nav.php:203
-msgid "Manage Your Channels"
-msgstr "Beheer je kanalen"
+#: ../../include/photos.php:112
+#, php-format
+msgid "Image exceeds website size limit of %lu bytes"
+msgstr "Afbeelding is groter dan op deze hub toegestane limiet van %lu bytes"
-#: ../../include/nav.php:205
-msgid "Account/Channel Settings"
-msgstr "Account-/kanaal-instellingen"
+#: ../../include/photos.php:119
+msgid "Image file is empty."
+msgstr "Afbeeldingsbestand is leeg"
-#: ../../include/nav.php:213 ../../include/widgets.php:1368
-msgid "Admin"
-msgstr "Beheer"
+#: ../../include/photos.php:257
+msgid "Photo storage failed."
+msgstr "Foto kan niet worden opgeslagen"
-#: ../../include/nav.php:213
-msgid "Site Setup and Configuration"
-msgstr "Hub instellen en beheren"
+#: ../../include/photos.php:297
+msgid "a new photo"
+msgstr "een nieuwe foto"
-#: ../../include/nav.php:249
-msgid "@name, #tag, ?doc, content"
-msgstr "@kanaal, #tag, inhoud, ?hulp"
+#: ../../include/photos.php:301
+#, php-format
+msgctxt "photo_upload"
+msgid "%1$s posted %2$s to %3$s"
+msgstr "%1$s plaatste %2$s op %3$s"
-#: ../../include/nav.php:250
-msgid "Please wait..."
-msgstr "Wachten aub..."
+#: ../../include/photos.php:510
+msgid "Upload New Photos"
+msgstr "Nieuwe foto's uploaden"
#: ../../include/widgets.php:103
msgid "System"
@@ -3233,10 +8478,6 @@ msgstr "Persoonlijke app maken"
msgid "Edit Personal App"
msgstr "Persoonlijke app bewerken"
-#: ../../include/widgets.php:149 ../../mod/suggest.php:54
-msgid "Ignore/Hide"
-msgstr "Negeren/Verbergen"
-
#: ../../include/widgets.php:154
msgid "Suggestions"
msgstr "Voorgestelde kanalen"
@@ -3266,13 +8507,6 @@ msgstr "Voorbeelden: bob@example.com, http://example.com/barbara"
msgid "Notes"
msgstr "Aantekeningen"
-#: ../../include/widgets.php:201 ../../include/text.php:905
-#: ../../include/text.php:917 ../../mod/admin.php:1687
-#: ../../mod/admin.php:1707 ../../mod/rbmark.php:28 ../../mod/rbmark.php:100
-#: ../../mod/filer.php:49
-msgid "Save"
-msgstr "Opslaan"
-
#: ../../include/widgets.php:273
msgid "Remove term"
msgstr "Verwijder zoekterm"
@@ -3281,23 +8515,6 @@ msgstr "Verwijder zoekterm"
msgid "Archives"
msgstr "Archieven"
-#: ../../include/widgets.php:444 ../../mod/connedit.php:589
-msgid "Me"
-msgstr "Ik"
-
-#: ../../include/widgets.php:445 ../../mod/connedit.php:590
-msgid "Family"
-msgstr "Familie"
-
-#: ../../include/widgets.php:447 ../../mod/connedit.php:592
-msgid "Acquaintances"
-msgstr "Kennissen"
-
-#: ../../include/widgets.php:448 ../../mod/connections.php:88
-#: ../../mod/connections.php:103 ../../mod/connedit.php:593
-msgid "All"
-msgstr "Alles"
-
#: ../../include/widgets.php:467
msgid "Refresh"
msgstr "Vernieuwen"
@@ -3334,10 +8551,6 @@ msgstr "Kanaal exporteren"
msgid "Connected apps"
msgstr "Verbonden applicaties"
-#: ../../include/widgets.php:565 ../../mod/connedit.php:701
-msgid "Connection Default Permissions"
-msgstr "Standaard permissies voor connecties"
-
#: ../../include/widgets.php:573
msgid "Premium Channel Settings"
msgstr "Instellingen premiumkanaal"
@@ -3350,6 +8563,18 @@ msgstr "Privéberichten"
msgid "Combined View"
msgstr "Gecombineerd postvak"
+#: ../../include/widgets.php:609 ../../include/nav.php:199
+msgid "Inbox"
+msgstr "Postvak IN"
+
+#: ../../include/widgets.php:614 ../../include/nav.php:200
+msgid "Outbox"
+msgstr "Postvak UIT"
+
+#: ../../include/widgets.php:619 ../../include/nav.php:201
+msgid "New Message"
+msgstr "Nieuw bericht"
+
#: ../../include/widgets.php:636 ../../include/widgets.php:648
msgid "Conversations"
msgstr "Conversaties"
@@ -3386,16 +8611,6 @@ msgstr "Week tonen"
msgid "Month View"
msgstr "Maand tonen"
-#: ../../include/widgets.php:706 ../../mod/cal.php:333
-#: ../../mod/events.php:661
-msgid "Export"
-msgstr "Exporteren"
-
-#: ../../include/widgets.php:707 ../../mod/cal.php:336
-#: ../../mod/events.php:664
-msgid "Import"
-msgstr "Importeren"
-
#: ../../include/widgets.php:717
msgid "Events Tools"
msgstr "Agenda-hulpmiddelen"
@@ -3444,10 +8659,6 @@ msgstr "Beoordeel mij"
msgid "View Ratings"
msgstr "Bekijk beoordelingen"
-#: ../../include/widgets.php:1222 ../../mod/pubsites.php:18
-msgid "Public Hubs"
-msgstr "Openbare hubs"
-
#: ../../include/widgets.php:1268
msgid "Forums"
msgstr "Forums"
@@ -3476,10 +8687,6 @@ msgstr "Voor beheerders"
msgid "For Developers"
msgstr "Voor ontwikkelaars"
-#: ../../include/widgets.php:1334 ../../mod/admin.php:456
-msgid "Site"
-msgstr "Hub-instellingen"
-
#: ../../include/widgets.php:1335
msgid "Accounts"
msgstr "Accounts"
@@ -3488,54 +8695,22 @@ msgstr "Accounts"
msgid "Member registrations waiting for confirmation"
msgstr "Accounts die op goedkeuring wachten"
-#: ../../include/widgets.php:1336 ../../mod/admin.php:1149
-msgid "Channels"
-msgstr "Kanalen"
-
-#: ../../include/widgets.php:1337 ../../mod/admin.php:710
-msgid "Security"
-msgstr "Beveiliging"
-
-#: ../../include/widgets.php:1339 ../../mod/admin.php:1264
-#: ../../mod/admin.php:1325
-msgid "Plugins"
-msgstr "Plugins"
-
-#: ../../include/widgets.php:1340 ../../mod/admin.php:1486
-#: ../../mod/admin.php:1520
-msgid "Themes"
-msgstr "Thema's"
-
#: ../../include/widgets.php:1341
msgid "Inspect queue"
msgstr "Inspecteer berichtenwachtrij"
-#: ../../include/widgets.php:1342 ../../mod/admin.php:1760
-msgid "Profile Fields"
-msgstr "Profielvelden"
-
#: ../../include/widgets.php:1343
msgid "DB updates"
msgstr "Database-updates"
-#: ../../include/widgets.php:1361 ../../include/widgets.php:1371
-#: ../../mod/admin.php:1605
-msgid "Logs"
-msgstr "Logboeken"
+#: ../../include/widgets.php:1368 ../../include/nav.php:219
+msgid "Admin"
+msgstr "Beheer"
#: ../../include/widgets.php:1369
msgid "Plugin Features"
msgstr "Plugin-opties"
-#: ../../include/widgets.php:1451 ../../mod/photos.php:787
-#: ../../mod/photos.php:1328
-msgid "View Photo"
-msgstr "Foto weergeven"
-
-#: ../../include/widgets.php:1468 ../../mod/photos.php:818
-msgid "Edit Album"
-msgstr "Album bewerken"
-
#: ../../include/taxonomy.php:240 ../../include/taxonomy.php:261
msgid "Tags"
msgstr "Tags"
@@ -3592,11 +8767,6 @@ msgstr "Wachtwoord te kort"
msgid "Passwords do not match"
msgstr "Wachtwoorden komen niet overeen"
-#: ../../include/js_strings.php:13 ../../mod/photos.php:41
-#: ../../mod/cal.php:37
-msgid "everybody"
-msgstr "iedereen"
-
#: ../../include/js_strings.php:14
msgid "Secret Passphrase"
msgstr "Geheim wachtwoord"
@@ -3621,11 +8791,6 @@ msgstr "Niets nieuw hier"
msgid "Rate This Channel (this is public)"
msgstr "Beoordeel dit kanaal (dit is openbaar)"
-#: ../../include/js_strings.php:20 ../../mod/connedit.php:712
-#: ../../mod/rate.php:157
-msgid "Rating"
-msgstr "Beoordeling"
-
#: ../../include/js_strings.php:21
msgid "Describe (optional)"
msgstr "Omschrijving (optioneel)"
@@ -3638,12 +8803,6 @@ msgstr "Vul een URL in:"
msgid "Unsaved changes. Are you sure you wish to leave this page?"
msgstr "Niet opgeslagen wijzigingen. Ben je er zeker van dat je deze pagina wil verlaten?"
-#: ../../include/js_strings.php:25 ../../mod/profiles.php:472
-#: ../../mod/profiles.php:697 ../../mod/pubsites.php:36
-#: ../../mod/events.php:459 ../../mod/locs.php:113
-msgid "Location"
-msgstr "Locatie"
-
#: ../../include/js_strings.php:27
msgid "timeago.prefixAgo"
msgstr "timeago.prefixAgo"
@@ -3921,10 +9080,6 @@ msgstr "Kan geen dubbele kanaal-identificator op deze hub aanmaken. Importeren m
msgid "Channel clone failed. Import failed."
msgstr "Het klonen van het kanaal is mislukt. Importeren mislukt."
-#: ../../include/import.php:80 ../../mod/import.php:146
-msgid "Cloned channel not found. Import failed."
-msgstr "Gekloond kanaal niet gevonden. Importeren mislukt."
-
#: ../../include/oembed.php:267
msgid "Embedded content"
msgstr "Ingesloten (embedded) inhoud"
@@ -3937,34 +9092,10 @@ msgstr "Insluiten (embedding) uitgeschakeld"
msgid "New Page"
msgstr "Nieuwe pagina"
-#: ../../include/page_widgets.php:39 ../../mod/pubsites.php:42
-#: ../../mod/webpages.php:191 ../../mod/blocks.php:161
-#: ../../mod/layouts.php:189
-msgid "View"
-msgstr "Weergeven"
-
-#: ../../include/page_widgets.php:41 ../../mod/webpages.php:193
-msgid "Actions"
-msgstr "Acties"
-
-#: ../../include/page_widgets.php:42 ../../mod/webpages.php:194
-msgid "Page Link"
-msgstr "Paginalink"
-
#: ../../include/page_widgets.php:43
msgid "Title"
msgstr "Titel"
-#: ../../include/page_widgets.php:44 ../../mod/webpages.php:196
-#: ../../mod/blocks.php:152 ../../mod/layouts.php:182 ../../mod/menu.php:110
-msgid "Created"
-msgstr "Aangemaakt"
-
-#: ../../include/page_widgets.php:45 ../../mod/webpages.php:197
-#: ../../mod/blocks.php:153 ../../mod/layouts.php:183 ../../mod/menu.php:111
-msgid "Edited"
-msgstr "Bewerkt"
-
#: ../../include/permissions.php:26
msgid "Can view my normal stream and posts"
msgstr "Kan mijn normale kanaalstream en berichten bekijken"
@@ -4291,10 +9422,6 @@ msgstr "uit map verwijderen"
msgid "Click to open/close"
msgstr "Klik om te openen of te sluiten"
-#: ../../include/text.php:1743 ../../mod/cal.php:307 ../../mod/events.php:630
-msgid "Link to Source"
-msgstr "Originele locatie"
-
#: ../../include/text.php:1764 ../../include/text.php:1836
msgid "default"
msgstr "standaard"
@@ -4323,5143 +9450,187 @@ msgstr "activiteit"
msgid "Design Tools"
msgstr "Ontwerp-hulpmiddelen"
-#: ../../include/text.php:2278 ../../mod/blocks.php:149
-msgid "Blocks"
-msgstr "Blokken"
-
-#: ../../include/text.php:2279 ../../mod/menu.php:103
-msgid "Menus"
-msgstr "Menu's"
-
-#: ../../include/text.php:2280 ../../mod/layouts.php:175
-msgid "Layouts"
-msgstr "Lay-outs"
-
#: ../../include/text.php:2281
msgid "Pages"
msgstr "Pagina's"
-#: ../../include/api.php:1336
-msgid "Public Timeline"
-msgstr "Openbare tijdlijn"
-
-#: ../../mod/lockview.php:57
-msgid "Remote privacy information not available."
-msgstr "Privacy-informatie op afstand niet beschikbaar."
-
-#: ../../mod/lockview.php:78
-msgid "Visible to:"
-msgstr "Zichtbaar voor:"
-
-#: ../../mod/achievements.php:34
-msgid "Some blurb about what to do when you're new here"
-msgstr "Welkom op $Projectname. Klik op de tab ontdekken of klik rechtsboven op de <a href=\"directory\">kanalengids</a>, om kanalen te vinden. Rechtsboven vind je ook <a href=\"directory\">apps</a>, waar je vrijwel alle functies van $Projectname kunt vinden. Voor <a href=\"directory\">hulp</a> met $Projectname klik je op het vraagteken."
-
-#: ../../mod/acl.php:221
-msgid "network"
-msgstr "netwerk"
-
-#: ../../mod/acl.php:231
-msgid "RSS"
-msgstr "RSS"
-
-#: ../../mod/oexchange.php:23
-msgid "Unable to find your hub."
-msgstr "Niet in staat om je hub te vinden"
-
-#: ../../mod/oexchange.php:37
-msgid "Post successful."
-msgstr "Verzenden bericht geslaagd."
-
-#: ../../mod/admin.php:54
-msgid "Theme settings updated."
-msgstr "Thema-instellingen bijgewerkt."
-
-#: ../../mod/admin.php:174
-msgid "# Accounts"
-msgstr "# accounts"
-
-#: ../../mod/admin.php:175
-msgid "# blocked accounts"
-msgstr "# geblokkeerde accounts"
-
-#: ../../mod/admin.php:176
-msgid "# expired accounts"
-msgstr "# verlopen accounts"
-
-#: ../../mod/admin.php:177
-msgid "# expiring accounts"
-msgstr "# accounts die nog moeten verlopen"
-
-#: ../../mod/admin.php:188
-msgid "# Channels"
-msgstr "# Kanalen"
-
-#: ../../mod/admin.php:189
-msgid "# primary"
-msgstr "# primair"
-
-#: ../../mod/admin.php:190
-msgid "# clones"
-msgstr "# klonen"
-
-#: ../../mod/admin.php:196
-msgid "Message queues"
-msgstr "Berichtenwachtrij"
-
-#: ../../mod/admin.php:212 ../../mod/admin.php:455 ../../mod/admin.php:669
-#: ../../mod/admin.php:709 ../../mod/admin.php:984 ../../mod/admin.php:1148
-#: ../../mod/admin.php:1263 ../../mod/admin.php:1324 ../../mod/admin.php:1485
-#: ../../mod/admin.php:1519 ../../mod/admin.php:1604
-msgid "Administration"
-msgstr "Beheer"
-
-#: ../../mod/admin.php:213
-msgid "Summary"
-msgstr "Samenvatting"
-
-#: ../../mod/admin.php:216
-msgid "Registered accounts"
-msgstr "Geregistreerde accounts"
-
-#: ../../mod/admin.php:217 ../../mod/admin.php:673
-msgid "Pending registrations"
-msgstr "Accounts die op goedkeuring wachten"
-
-#: ../../mod/admin.php:218
-msgid "Registered channels"
-msgstr "Geregistreerde kanalen"
-
-#: ../../mod/admin.php:219 ../../mod/admin.php:674
-msgid "Active plugins"
-msgstr "Ingeschakelde plugins"
-
-#: ../../mod/admin.php:220
-msgid "Version"
-msgstr "Versie"
-
-#: ../../mod/admin.php:339
-msgid "Site settings updated."
-msgstr "Hub-instellingen bijgewerkt."
-
-#: ../../mod/admin.php:376 ../../mod/settings.php:805
-msgid "mobile"
-msgstr "mobiel"
-
-#: ../../mod/admin.php:378
-msgid "experimental"
-msgstr "experimenteel"
-
-#: ../../mod/admin.php:380
-msgid "unsupported"
-msgstr "Niet ondersteund"
-
-#: ../../mod/admin.php:426
-msgid "Yes - with approval"
-msgstr "Ja - met goedkeuring"
-
-#: ../../mod/admin.php:432
-msgid "My site is not a public server"
-msgstr "Mijn $Projectname-hub is niet openbaar"
-
-#: ../../mod/admin.php:433
-msgid "My site has paid access only"
-msgstr "Mijn $Projectname-hub kent alleen betaalde toegang"
-
-#: ../../mod/admin.php:434
-msgid "My site has free access only"
-msgstr "Mijn $Projectname-hub kent alleen gratis toegang"
-
-#: ../../mod/admin.php:435
-msgid "My site offers free accounts with optional paid upgrades"
-msgstr "Mijn $Projectname-hub biedt gratis accounts aan met betaalde uitbreidingen als optie"
-
-#: ../../mod/admin.php:458 ../../mod/register.php:241
-msgid "Registration"
-msgstr "Registratie"
-
-#: ../../mod/admin.php:459
-msgid "File upload"
-msgstr "Bestand uploaden"
-
-#: ../../mod/admin.php:460
-msgid "Policies"
-msgstr "Beleid"
-
-#: ../../mod/admin.php:465
-msgid "Site name"
-msgstr "Naam van deze $Projectname-hub"
-
-#: ../../mod/admin.php:466
-msgid "Banner/Logo"
-msgstr "Banner/logo"
-
-#: ../../mod/admin.php:467
-msgid "Administrator Information"
-msgstr "Informatie over de beheerder van deze hub"
-
-#: ../../mod/admin.php:467
-msgid ""
-"Contact information for site administrators. Displayed on siteinfo page. "
-"BBCode can be used here"
-msgstr "Contactinformatie voor hub-beheerders. Getoond op pagina met hub-informatie. Er kan hier bbcode gebruikt worden."
-
-#: ../../mod/admin.php:468
-msgid "System language"
-msgstr "Standaardtaal"
-
-#: ../../mod/admin.php:469
-msgid "System theme"
-msgstr "Standaardthema"
-
-#: ../../mod/admin.php:469
-msgid ""
-"Default system theme - may be over-ridden by user profiles - <a href='#' "
-"id='cnftheme'>change theme settings</a>"
-msgstr "Standaardthema voor $Projectname-hub (kan door lid veranderd worden) - <a href='#' id='cnftheme'>verander thema-instellingen</a>"
-
-#: ../../mod/admin.php:470
-msgid "Mobile system theme"
-msgstr "Standaardthema voor mobiel"
-
-#: ../../mod/admin.php:470
-msgid "Theme for mobile devices"
-msgstr "Thema voor mobiele apparaten"
-
-#: ../../mod/admin.php:472
-msgid "Allow Feeds as Connections"
-msgstr "Sta feeds toe als connecties"
-
-#: ../../mod/admin.php:472
-msgid "(Heavy system resource usage)"
-msgstr "(sterk negatieve invloed op systeembronnen hub)"
-
-#: ../../mod/admin.php:473
-msgid "Maximum image size"
-msgstr "Maximale grootte van afbeeldingen"
-
-#: ../../mod/admin.php:473
-msgid ""
-"Maximum size in bytes of uploaded images. Default is 0, which means no "
-"limits."
-msgstr "Maximale grootte in bytes voor afbeeldingen die worden geüpload. Standaard is 0, wat geen limiet betekend."
-
-#: ../../mod/admin.php:474
-msgid "Does this site allow new member registration?"
-msgstr "Staat deze hub nieuwe accounts toe?"
-
-#: ../../mod/admin.php:475
-msgid "Invitation only"
-msgstr "Alleen op uitnodiging"
-
-#: ../../mod/admin.php:475
-msgid ""
-"Only allow new member registrations with an invitation code. Above register "
-"policy must be set to Yes."
-msgstr "Sta alleen nieuwe registraties toe van mensen die een uitnodigingscode hebben. Bovenstaand accountbeleid moet op Ja staan."
-
-#: ../../mod/admin.php:476
-msgid "Which best describes the types of account offered by this hub?"
-msgstr "Wat voor soort accounts biedt deze $Projectname-hub aan? Kies wat het meest in de buurt komt."
-
-#: ../../mod/admin.php:477
-msgid "Register text"
-msgstr "Tekst tijdens registratie"
-
-#: ../../mod/admin.php:477
-msgid "Will be displayed prominently on the registration page."
-msgstr "Tekst dat op de pagina voor het registreren van nieuwe accounts wordt getoond."
-
-#: ../../mod/admin.php:478
-msgid "Site homepage to show visitors (default: login box)"
-msgstr "Homepagina van deze hub die aan bezoekers wordt getoond (standaard: inlogformulier)"
-
-#: ../../mod/admin.php:478
-msgid ""
-"example: 'public' to show public stream, 'page/sys/home' to show a system "
-"webpage called 'home' or 'include:home.html' to include a file."
-msgstr "voorbeeld: 'public' om de openbare stream te tonen, 'page/sys/home' om de webpagina 'home' van het systeemkanaal te tonen of 'include:home.html' om een gewoon bestand te gebruiken."
-
-#: ../../mod/admin.php:479
-msgid "Preserve site homepage URL"
-msgstr "Behoudt de URL van de hub (/)"
-
-#: ../../mod/admin.php:479
-msgid ""
-"Present the site homepage in a frame at the original location instead of "
-"redirecting"
-msgstr "Toon de homepagina van de hub in een frame op de oorspronkelijke locatie (/), i.p.v. een doorverwijzing naar een andere locatie (bv. .../home.html)"
-
-#: ../../mod/admin.php:480
-msgid "Accounts abandoned after x days"
-msgstr "Accounts als verlaten beschouwen na zoveel aantal dagen:"
-
-#: ../../mod/admin.php:480
-msgid ""
-"Will not waste system resources polling external sites for abandonded "
-"accounts. Enter 0 for no time limit."
-msgstr "Zal geen systeembronnen verspillen door polling van externe hubs voor verlaten accounts. Vul 0 in voor geen tijdslimiet."
-
-#: ../../mod/admin.php:481
-msgid "Allowed friend domains"
-msgstr "Toegestane domeinen"
-
-#: ../../mod/admin.php:481
-msgid ""
-"Comma separated list of domains which are allowed to establish friendships "
-"with this site. Wildcards are accepted. Empty to allow any domains"
-msgstr "Komma-gescheiden lijst van domeinen waarvan kanalen connecties kunnen aangaan met kanalen op deze $Projectname-hub. Wildcards zijn toegestaan.\nLaat leeg om alle domeinen toe te laten."
-
-#: ../../mod/admin.php:482
-msgid "Allowed email domains"
-msgstr "Toegestane e-maildomeinen"
-
-#: ../../mod/admin.php:482
-msgid ""
-"Comma separated list of domains which are allowed in email addresses for "
-"registrations to this site. Wildcards are accepted. Empty to allow any "
-"domains"
-msgstr "Door komma's gescheiden lijst met e-maildomeinen waarvan e-mailadressen op deze hub mogen registeren. Wildcards zijn toegestaan. Laat leeg om alle domeinen toe te laten."
-
-#: ../../mod/admin.php:483
-msgid "Not allowed email domains"
-msgstr "Niet toegestane e-maildomeinen"
-
-#: ../../mod/admin.php:483
-msgid ""
-"Comma separated list of domains which are not allowed in email addresses for"
-" registrations to this site. Wildcards are accepted. Empty to allow any "
-"domains, unless allowed domains have been defined."
-msgstr "Door komma's gescheiden lijst met e-maildomeinen waarvan e-mailadressen niet op deze hub mogen registeren. Wildcards zijn toegestaan. Laat leeg om alle domeinen toe te staan, tenzij er toegestane domeinen zijn ingesteld. "
-
-#: ../../mod/admin.php:484
-msgid "Verify Email Addresses"
-msgstr "E-mailadres verifieren"
-
-#: ../../mod/admin.php:484
-msgid ""
-"Check to verify email addresses used in account registration (recommended)."
-msgstr "Inschakelen om e-mailadressen te verifiëren die tijdens de accountregistratie worden gebruikt (aanbevolen)."
-
-#: ../../mod/admin.php:485
-msgid "Force publish"
-msgstr "Dwing kanaalvermelding af"
-
-#: ../../mod/admin.php:485
-msgid ""
-"Check to force all profiles on this site to be listed in the site directory."
-msgstr "Vink dit aan om af te dwingen dat alle kanalen op deze hub in de kanalengids worden vermeld."
-
-#: ../../mod/admin.php:486
-msgid "Import Public Streams"
-msgstr "Openbare streams importeren"
-
-#: ../../mod/admin.php:486
-msgid ""
-"Import and allow access to public content pulled from other sites. Warning: "
-"this content is unmoderated."
-msgstr "Toegang verlenen tot openbare berichten die vanuit andere hubs worden geïmporteerd. Waarschuwing: de inhoud van deze berichten wordt niet gemodereerd."
-
-#: ../../mod/admin.php:487
-msgid "login on Homepage"
-msgstr "Inlogformulier op de homepagina"
-
-#: ../../mod/admin.php:487
-msgid ""
-"Present a login box to visitors on the home page if no other content has "
-"been configured."
-msgstr "Toon een inlogformulier voor bezoekers op de homepagina wanneer geen andere inhoud is geconfigureerd. "
-
-#: ../../mod/admin.php:489
-msgid "Directory Server URL"
-msgstr "Server-URL voor de kanalengids"
-
-#: ../../mod/admin.php:489
-msgid "Default directory server"
-msgstr "Standaardserver voor de kanalengids"
-
-#: ../../mod/admin.php:491
-msgid "Proxy user"
-msgstr "Gebruikersnaam proxy"
-
-#: ../../mod/admin.php:492
-msgid "Proxy URL"
-msgstr "Proxy-URL"
-
-#: ../../mod/admin.php:493
-msgid "Network timeout"
-msgstr "Netwerktimeout"
-
-#: ../../mod/admin.php:493
-msgid "Value is in seconds. Set to 0 for unlimited (not recommended)."
-msgstr "Waarde is in seconden. Zet op 0 voor onbeperkt (niet aanbevolen)"
-
-#: ../../mod/admin.php:494
-msgid "Delivery interval"
-msgstr "Afleveringsinterval"
-
-#: ../../mod/admin.php:494
-msgid ""
-"Delay background delivery processes by this many seconds to reduce system "
-"load. Recommend: 4-5 for shared hosts, 2-3 for virtual private servers. 0-1 "
-"for large dedicated servers."
-msgstr "Vertraag de achtergrondprocessen voor het afleveren met een aantal seconden om de systeembelasting te verminderen. Aanbevolen: 4-5 voor shared hosts, 2-3 voor virtual private servers (VPS) en 0-1 voor grote dedicated servers."
-
-#: ../../mod/admin.php:495
-msgid "Deliveries per process"
-msgstr "Leveringen per serverproces"
-
-#: ../../mod/admin.php:495
-msgid ""
-"Number of deliveries to attempt in a single operating system process. Adjust"
-" if necessary to tune system performance. Recommend: 1-5."
-msgstr "Aantal leveringen die aan één serverproces worden meegegeven. Pas dit aan wanneer het nodig is om systeemprestaties te verbeteren. Aangeraden: 1-5"
-
-#: ../../mod/admin.php:496
-msgid "Poll interval"
-msgstr "Poll-interval"
-
-#: ../../mod/admin.php:496
-msgid ""
-"Delay background polling processes by this many seconds to reduce system "
-"load. If 0, use delivery interval."
-msgstr "De achtergrondprocessen voor het afleveren met zoveel seconden vertragen om de systeembelasting te verminderen. 0 om de afleveringsinterval te gebruiken."
-
-#: ../../mod/admin.php:497
-msgid "Maximum Load Average"
-msgstr "Maximaal gemiddelde systeembelasting"
-
-#: ../../mod/admin.php:497
-msgid ""
-"Maximum system load before delivery and poll processes are deferred - "
-"default 50."
-msgstr "Maximale systeembelasting voordat de afleverings- en polllingsprocessen worden uitgesteld. Standaard is 50."
-
-#: ../../mod/admin.php:498
-msgid "Expiration period in days for imported (grid/network) content"
-msgstr "Aantal dagen waarna geïmporteerde inhoud uit iemands grid/netwerk-pagina wordt verwijderd."
-
-#: ../../mod/admin.php:498
-msgid "0 for no expiration of imported content"
-msgstr "Dit geldt alleen voor inhoud van andere kanalen, dus niet voor iemands eigen kanaal. 0 voor het niet verwijderen van geïmporteerde inhoud."
-
-#: ../../mod/admin.php:635 ../../mod/admin.php:636 ../../mod/settings.php:729
-msgid "Off"
-msgstr "Uit"
-
-#: ../../mod/admin.php:635 ../../mod/admin.php:636 ../../mod/settings.php:729
-msgid "On"
-msgstr "Aan"
-
-#: ../../mod/admin.php:636
-#, php-format
-msgid "Lock feature %s"
-msgstr " Vergrendel de functie '%s'"
-
-#: ../../mod/admin.php:644
-msgid "Manage Additional Features"
-msgstr "Beheer - Extra functies"
-
-#: ../../mod/admin.php:661
-msgid "No server found"
-msgstr "Geen hub gevonden"
-
-#: ../../mod/admin.php:668 ../../mod/admin.php:998
-msgid "ID"
-msgstr "ID"
-
-#: ../../mod/admin.php:668
-msgid "for channel"
-msgstr "voor kanaal"
-
-#: ../../mod/admin.php:668
-msgid "on server"
-msgstr "op hub"
-
-#: ../../mod/admin.php:668 ../../mod/connections.php:266
-msgid "Status"
-msgstr "Status"
-
-#: ../../mod/admin.php:670
-msgid "Server"
-msgstr "Hubbeheer"
-
-#: ../../mod/admin.php:712
-msgid "Block public"
-msgstr "Openbare toegang blokkeren"
-
-#: ../../mod/admin.php:712
-msgid ""
-"Check to block public access to all otherwise public personal pages on this "
-"site unless you are currently authenticated."
-msgstr "Vink dit aan om alle normaliter openbare persoonlijke pagina's op deze hub alleen toegankelijk te maken voor leden die zich hebben geauthenticeerd."
-
-#: ../../mod/admin.php:713
-msgid "Allow communications only from these sites"
-msgstr "Alleen communicatie met deze hubs toestaan"
-
-#: ../../mod/admin.php:713
-msgid ""
-"One site per line. Leave empty to allow communication from anywhere by "
-"default"
-msgstr "Eén hub per regel. Laat leeg om communicatie standaard met alle hubs toe te staan"
-
-#: ../../mod/admin.php:714
-msgid "Block communications from these sites"
-msgstr "Communicatie met deze hubs blokkeren"
-
-#: ../../mod/admin.php:715
-msgid "Allow communications only from these channels"
-msgstr "Sta alleen communicatie toe met deze kanalen"
-
-#: ../../mod/admin.php:715
-msgid ""
-"One channel (hash) per line. Leave empty to allow from any channel by "
-"default"
-msgstr "Eén kanaal (hash) per regel. Laat leeg om communicatie standaard met alle kanalen toe te staan"
-
-#: ../../mod/admin.php:716
-msgid "Block communications from these channels"
-msgstr "Communicatie met deze kanalen blokkeren"
-
-#: ../../mod/admin.php:717
-msgid "Allow embedded HTML content only from these domains"
-msgstr "Alleen ingesloten (embedded) HTML vanaf deze domeinen toestaan"
-
-#: ../../mod/admin.php:717
-msgid "One site per line. Leave empty to allow from any site by default"
-msgstr "Eén per regel. Laat leeg om standaard vanaf elk domein toe te staan"
-
-#: ../../mod/admin.php:718
-msgid "Block embedded HTML from these domains"
-msgstr "Ingesloten (embedded) HTML vanaf deze domeinen blokkeren"
-
-#: ../../mod/admin.php:720
-msgid "Cooperative embed security"
-msgstr "Met elkaar ingesloten (embedded) HTML beveiligen"
-
-#: ../../mod/admin.php:720
-msgid "Enable to share embed security with other compatible sites/hubs"
-msgstr "Beveiliging omtrent ingesloten (embedded) HTML met andere compatibele hubs delen."
-
-#: ../../mod/admin.php:735
-msgid "Update has been marked successful"
-msgstr "Update is als succesvol gemarkeerd"
-
-#: ../../mod/admin.php:745
-#, php-format
-msgid "Executing %s failed. Check system logs."
-msgstr "Uitvoeren van %s is mislukt. Controleer systeemlogboek."
-
-#: ../../mod/admin.php:748
-#, php-format
-msgid "Update %s was successfully applied."
-msgstr "Update %s was geslaagd."
-
-#: ../../mod/admin.php:752
-#, php-format
-msgid "Update %s did not return a status. Unknown if it succeeded."
-msgstr "Update %s gaf geen melding. Het is daarom niet bekend of deze geslaagd is."
-
-#: ../../mod/admin.php:755
-#, php-format
-msgid "Update function %s could not be found."
-msgstr "Update-functie %s kon niet gevonden worden."
-
-#: ../../mod/admin.php:771
-msgid "No failed updates."
-msgstr "Geen mislukte updates."
-
-#: ../../mod/admin.php:775
-msgid "Failed Updates"
-msgstr "Mislukte updates"
-
-#: ../../mod/admin.php:777
-msgid "Mark success (if update was manually applied)"
-msgstr "Markeer als geslaagd (wanneer de update handmatig was uitgevoerd)"
-
-#: ../../mod/admin.php:778
-msgid "Attempt to execute this update step automatically"
-msgstr "Poging om deze stap van de update automatisch uit te voeren."
-
-#: ../../mod/admin.php:809
-msgid "Queue Statistics"
-msgstr "Wachtrij-statistieken"
-
-#: ../../mod/admin.php:810
-msgid "Total Entries"
-msgstr "Aantal vermeldingen"
-
-#: ../../mod/admin.php:811
-msgid "Priority"
-msgstr "Prioriteit"
-
-#: ../../mod/admin.php:812
-msgid "Destination URL"
-msgstr "Doel-URL"
-
-#: ../../mod/admin.php:813
-msgid "Mark hub permanently offline"
-msgstr "Hub als permanent offline markeren"
-
-#: ../../mod/admin.php:814
-msgid "Empty queue for this hub"
-msgstr "Berichtenwachtrij voor deze hub legen"
-
-#: ../../mod/admin.php:815
-msgid "Last known contact"
-msgstr "Voor het laatst contact"
-
-#: ../../mod/admin.php:851
-#, php-format
-msgid "%s account blocked/unblocked"
-msgid_plural "%s account blocked/unblocked"
-msgstr[0] "%s account geblokkeerd/gedeblokkeerd"
-msgstr[1] "%s accounts geblokkeerd/gedeblokkeerd"
-
-#: ../../mod/admin.php:859
-#, php-format
-msgid "%s account deleted"
-msgid_plural "%s accounts deleted"
-msgstr[0] "%s account verwijderd"
-msgstr[1] "%s accounts verwijderd"
-
-#: ../../mod/admin.php:895
-msgid "Account not found"
-msgstr "Account niet gevonden"
-
-#: ../../mod/admin.php:907
-#, php-format
-msgid "Account '%s' deleted"
-msgstr "Account '%s' verwijderd"
-
-#: ../../mod/admin.php:915
-#, php-format
-msgid "Account '%s' blocked"
-msgstr "Account '%s' geblokkeerd"
-
-#: ../../mod/admin.php:923
-#, php-format
-msgid "Account '%s' unblocked"
-msgstr "Account '%s' gedeblokkeerd"
-
-#: ../../mod/admin.php:985 ../../mod/admin.php:997
-msgid "Users"
-msgstr "Accounts"
-
-#: ../../mod/admin.php:987 ../../mod/admin.php:1151
-msgid "select all"
-msgstr "alles selecteren"
-
-#: ../../mod/admin.php:988
-msgid "User registrations waiting for confirm"
-msgstr "Accounts die op goedkeuring wachten"
-
-#: ../../mod/admin.php:989
-msgid "Request date"
-msgstr "Tijd/datum verzoek"
-
-#: ../../mod/admin.php:990
-msgid "No registrations."
-msgstr "Geen verzoeken."
-
-#: ../../mod/admin.php:991 ../../mod/connections.php:271
-msgid "Approve"
-msgstr "Goedkeuren"
-
-#: ../../mod/admin.php:992
-msgid "Deny"
-msgstr "Afkeuren"
-
-#: ../../mod/admin.php:994 ../../mod/connedit.php:537
-msgid "Block"
-msgstr "Blokkeren"
-
-#: ../../mod/admin.php:995 ../../mod/connedit.php:537
-msgid "Unblock"
-msgstr "Deblokkeren"
-
-#: ../../mod/admin.php:998
-msgid "Register date"
-msgstr "Geregistreerd"
-
-#: ../../mod/admin.php:998
-msgid "Last login"
-msgstr "Laatste keer ingelogd"
-
-#: ../../mod/admin.php:998
-msgid "Expires"
-msgstr "Verloopt"
-
-#: ../../mod/admin.php:998
-msgid "Service Class"
-msgstr "Abonnementen"
-
-#: ../../mod/admin.php:1000
-msgid ""
-"Selected accounts will be deleted!\\n\\nEverything these accounts had posted"
-" on this site will be permanently deleted!\\n\\nAre you sure?"
-msgstr "Geselecteerde accounts (met bijbehorende kanalen) worden verwijderd!\\n\\nAlles wat deze accounts op deze hub hebben gepubliceerd wordt definitief verwijderd!\\n\\Weet je het zeker?"
-
-#: ../../mod/admin.php:1001
-msgid ""
-"The account {0} will be deleted!\\n\\nEverything this account has posted on "
-"this site will be permanently deleted!\\n\\nAre you sure?"
-msgstr "Account {0} (met bijbehorende kanalen) wordt verwijderd !\\n\\nAlles wat dit account op deze hub heeft gepubliceerd wordt definitief verwijderd!\\n\\nWeet je het zeker?"
-
-#: ../../mod/admin.php:1037
-#, php-format
-msgid "%s channel censored/uncensored"
-msgid_plural "%s channels censored/uncensored"
-msgstr[0] "%s kanaal gecensureerd/ongecensureerd"
-msgstr[1] "%s kanalen gecensureerd/ongecensureerd"
-
-#: ../../mod/admin.php:1046
-#, php-format
-msgid "%s channel code allowed/disallowed"
-msgid_plural "%s channels code allowed/disallowed"
-msgstr[0] "Scripts toegestaan/niet toegestaan voor %s kanaal"
-msgstr[1] "Scripts toegestaan/niet toegestaan voor %s kanalen"
-
-#: ../../mod/admin.php:1053
-#, php-format
-msgid "%s channel deleted"
-msgid_plural "%s channels deleted"
-msgstr[0] "%s kanaal verwijderd"
-msgstr[1] "%s kanalen verwijderd"
-
-#: ../../mod/admin.php:1073
-msgid "Channel not found"
-msgstr "Kanaal niet gevonden"
-
-#: ../../mod/admin.php:1084
-#, php-format
-msgid "Channel '%s' deleted"
-msgstr "Kanaal '%s' verwijderd"
-
-#: ../../mod/admin.php:1096
-#, php-format
-msgid "Channel '%s' censored"
-msgstr "Kanaal '%s' gecensureerd"
-
-#: ../../mod/admin.php:1096
-#, php-format
-msgid "Channel '%s' uncensored"
-msgstr "Kanaal '%s' ongecensureerd"
-
-#: ../../mod/admin.php:1107
-#, php-format
-msgid "Channel '%s' code allowed"
-msgstr "Scripts toegestaan voor kanaal '%s'"
-
-#: ../../mod/admin.php:1107
-#, php-format
-msgid "Channel '%s' code disallowed"
-msgstr "Scripts niet toegestaan voor kanaal '%s'"
-
-#: ../../mod/admin.php:1153
-msgid "Censor"
-msgstr "Censureren"
-
-#: ../../mod/admin.php:1154
-msgid "Uncensor"
-msgstr "Niet censureren"
-
-#: ../../mod/admin.php:1155
-msgid "Allow Code"
-msgstr "Scripts toestaan"
-
-#: ../../mod/admin.php:1156
-msgid "Disallow Code"
-msgstr "Scripts niet toestaan"
-
-#: ../../mod/admin.php:1158
-msgid "UID"
-msgstr "UID"
-
-#: ../../mod/admin.php:1158 ../../mod/profiles.php:465 ../../mod/locs.php:114
-msgid "Address"
-msgstr "Kanaaladres"
-
-#: ../../mod/admin.php:1160
-msgid ""
-"Selected channels will be deleted!\\n\\nEverything that was posted in these "
-"channels on this site will be permanently deleted!\\n\\nAre you sure?"
-msgstr "Geselecteerde kanalen worden verwijderd!\\n\\nAlles wat in deze kanalen op deze hub werd gepubliceerd wordt definitief verwijderd!\\n\\nWeet je het zeker?"
-
-#: ../../mod/admin.php:1161
-msgid ""
-"The channel {0} will be deleted!\\n\\nEverything that was posted in this "
-"channel on this site will be permanently deleted!\\n\\nAre you sure?"
-msgstr "Kanaal {0} wordt verwijderd!\\n\\nAlles wat in dit kanaal op deze hub werd gepubliceerd wordt definitief verwijderd!\\n\\nWeet je het zeker?"
-
-#: ../../mod/admin.php:1218
-#, php-format
-msgid "Plugin %s disabled."
-msgstr "Plugin %s uitgeschakeld."
-
-#: ../../mod/admin.php:1222
-#, php-format
-msgid "Plugin %s enabled."
-msgstr "Plugin %s ingeschakeld"
-
-#: ../../mod/admin.php:1232 ../../mod/admin.php:1458
-msgid "Disable"
-msgstr "Uitschakelen"
-
-#: ../../mod/admin.php:1235 ../../mod/admin.php:1460
-msgid "Enable"
-msgstr "Inschakelen"
-
-#: ../../mod/admin.php:1265 ../../mod/admin.php:1487
-msgid "Toggle"
-msgstr "Omschakelen"
-
-#: ../../mod/admin.php:1273 ../../mod/admin.php:1497
-msgid "Author: "
-msgstr "Auteur: "
-
-#: ../../mod/admin.php:1274 ../../mod/admin.php:1498
-msgid "Maintainer: "
-msgstr "Beheerder: "
-
-#: ../../mod/admin.php:1275
-msgid "Minimum project version: "
-msgstr "Minimum versie Hubzilla: "
-
-#: ../../mod/admin.php:1276
-msgid "Maximum project version: "
-msgstr "Maximum versie Hubzilla:"
-
-#: ../../mod/admin.php:1277
-msgid "Minimum PHP version: "
-msgstr "Minimum versie PHP: "
-
-#: ../../mod/admin.php:1278
-msgid "Requires: "
-msgstr "Vereist: "
-
-#: ../../mod/admin.php:1279 ../../mod/admin.php:1330
-msgid "Disabled - version incompatibility"
-msgstr "Uitgeschakeld - versie is incompatibel"
-
-#: ../../mod/admin.php:1423
-msgid "No themes found."
-msgstr "Geen thema's gevonden"
-
-#: ../../mod/admin.php:1479
-msgid "Screenshot"
-msgstr "Schermafdruk"
-
-#: ../../mod/admin.php:1525
-msgid "[Experimental]"
-msgstr "[Experimenteel]"
-
-#: ../../mod/admin.php:1526
-msgid "[Unsupported]"
-msgstr "[Niet ondersteund]"
-
-#: ../../mod/admin.php:1550
-msgid "Log settings updated."
-msgstr "Logboek-instellingen bijgewerkt."
-
-#: ../../mod/admin.php:1607
-msgid "Clear"
-msgstr "Leegmaken"
-
-#: ../../mod/admin.php:1613
-msgid "Debugging"
-msgstr "Debuggen"
-
-#: ../../mod/admin.php:1614
-msgid "Log file"
-msgstr "Logbestand"
-
-#: ../../mod/admin.php:1614
-msgid ""
-"Must be writable by web server. Relative to your Red top-level directory."
-msgstr "Moet door de webserver beschrijfbaar zijn. Relatief ten opzichte van de bovenste map van je $Projectname-installatie."
-
-#: ../../mod/admin.php:1615
-msgid "Log level"
-msgstr "Logniveau"
-
-#: ../../mod/admin.php:1682
-msgid "New Profile Field"
-msgstr "Nieuw profielveld"
-
-#: ../../mod/admin.php:1683 ../../mod/admin.php:1703
-msgid "Field nickname"
-msgstr "Bijnaam voor veld"
-
-#: ../../mod/admin.php:1683 ../../mod/admin.php:1703
-msgid "System name of field"
-msgstr "Systeemnaam voor veld"
-
-#: ../../mod/admin.php:1684 ../../mod/admin.php:1704
-msgid "Input type"
-msgstr "Invoertype"
-
-#: ../../mod/admin.php:1685 ../../mod/admin.php:1705
-msgid "Field Name"
-msgstr "Veldnaam"
-
-#: ../../mod/admin.php:1685 ../../mod/admin.php:1705
-msgid "Label on profile pages"
-msgstr "Tekstlabel voor op profielpagina's"
-
-#: ../../mod/admin.php:1686 ../../mod/admin.php:1706
-msgid "Help text"
-msgstr "Helptekst"
-
-#: ../../mod/admin.php:1686 ../../mod/admin.php:1706
-msgid "Additional info (optional)"
-msgstr "Extra informatie (optioneel)"
-
-#: ../../mod/admin.php:1696
-msgid "Field definition not found"
-msgstr "Velddefinitie niet gevonden"
-
-#: ../../mod/admin.php:1702
-msgid "Edit Profile Field"
-msgstr "Profielveld bewerken"
-
-#: ../../mod/admin.php:1761
-msgid "Basic Profile Fields"
-msgstr "Standaard profielvelden"
-
-#: ../../mod/admin.php:1762
-msgid "Advanced Profile Fields"
-msgstr "Geavanceerde profielvelden"
-
-#: ../../mod/admin.php:1762
-msgid "(In addition to basic fields)"
-msgstr "(als toevoeging op de standaard velden)"
-
-#: ../../mod/admin.php:1764
-msgid "All available fields"
-msgstr "Alle beschikbare velden"
-
-#: ../../mod/admin.php:1765
-msgid "Custom Fields"
-msgstr "Extra (handmatig toegevoegde) velden"
-
-#: ../../mod/admin.php:1769
-msgid "Create Custom Field"
-msgstr "Extra velden aanmaken"
-
-#: ../../mod/api.php:74 ../../mod/api.php:98
-msgid "Authorize application connection"
-msgstr "Geef toestemming voor applicatiekoppeling"
-
-#: ../../mod/api.php:75
-msgid "Return to your app and insert this Securty Code:"
-msgstr "Ga terug naar je app en voeg deze beveiligingscode in:"
-
-#: ../../mod/api.php:85
-msgid "Please login to continue."
-msgstr "Inloggen om verder te kunnen gaan."
-
-#: ../../mod/api.php:100
-msgid ""
-"Do you want to authorize this application to access your posts and contacts,"
-" and/or create new posts for you?"
-msgstr "Wil je deze applicatie toestemming geven om jouw berichten en connecties te zien, en/of nieuwe berichten voor jou te plaatsen?"
-
-#: ../../mod/openid.php:26
-msgid "OpenID protocol error. No ID returned."
-msgstr "OpenID-protocolfout. Geen ID terugontvangen."
-
-#: ../../mod/appman.php:28 ../../mod/appman.php:44
-msgid "App installed."
-msgstr "App geïnstalleerd"
-
-#: ../../mod/appman.php:37
-msgid "Malformed app."
-msgstr "Misvormde app."
-
-#: ../../mod/appman.php:80
-msgid "Embed code"
-msgstr "Insluitcode"
-
-#: ../../mod/appman.php:86
-msgid "Edit App"
-msgstr "App bewerken"
-
-#: ../../mod/appman.php:86
-msgid "Create App"
-msgstr "App maken"
-
-#: ../../mod/appman.php:91
-msgid "Name of app"
-msgstr "Naam van app"
-
-#: ../../mod/appman.php:92
-msgid "Location (URL) of app"
-msgstr "Locatie (URL) van app"
-
-#: ../../mod/appman.php:93 ../../mod/events.php:457 ../../mod/rbmark.php:97
-msgid "Description"
-msgstr "Omschrijving"
-
-#: ../../mod/appman.php:94
-msgid "Photo icon URL"
-msgstr "URL van pictogram"
-
-#: ../../mod/appman.php:94
-msgid "80 x 80 pixels - optional"
-msgstr "80 x 80 pixels (optioneel)"
-
-#: ../../mod/appman.php:95
-msgid "Version ID"
-msgstr "Versie-ID"
-
-#: ../../mod/appman.php:96
-msgid "Price of app"
-msgstr "Prijs van de app"
-
-#: ../../mod/appman.php:97
-msgid "Location (URL) to purchase app"
-msgstr "Locatie (URL) om de app aan te schaffen"
-
-#: ../../mod/page.php:36 ../../mod/block.php:27
-msgid "Invalid item."
-msgstr "Ongeldig item."
-
-#: ../../mod/page.php:52 ../../mod/block.php:39 ../../mod/cal.php:61
-#: ../../mod/wall_upload.php:29
-msgid "Channel not found."
-msgstr "Kanaal niet gevonden."
-
-#: ../../mod/page.php:129
-msgid ""
-"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod "
-"tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,"
-" quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo "
-"consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse "
-"cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat "
-"non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
-msgstr "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
-
-#: ../../mod/attach.php:9
-msgid "Item not available."
-msgstr "Item is niet aanwezig."
-
-#: ../../mod/pconfig.php:27 ../../mod/pconfig.php:60
-msgid "This setting requires special processing and editing has been blocked."
-msgstr "Deze instelling vereist een speciaal proces en bewerken is geblokkeerd."
-
-#: ../../mod/pconfig.php:49
-msgid "Configuration Editor"
-msgstr "Configuratiebewerker"
-
-#: ../../mod/pconfig.php:50
-msgid ""
-"Warning: Changing some settings could render your channel inoperable. Please"
-" leave this page unless you are comfortable with and knowledgeable about how"
-" to correctly use this feature."
-msgstr "Waarschuwing: het veranderen van sommige instellingen kunnen jouw kanaal onklaar maken. Verlaat deze pagina, tenzij je weet waar je mee bezig bent en voldoende kennis bezit over hoe je deze functies moet gebruiken. "
-
-#: ../../mod/pdledit.php:14
-msgid "Layout updated."
-msgstr "Lay-out bijgewerkt."
-
-#: ../../mod/pdledit.php:30 ../../mod/pdledit.php:57
-msgid "Edit System Page Description"
-msgstr "Systeempagina's bewerken"
-
-#: ../../mod/pdledit.php:52
-msgid "Layout not found."
-msgstr "Lay-out niet gevonden."
-
-#: ../../mod/pdledit.php:58
-msgid "Module Name:"
-msgstr "Modulenaam:"
-
-#: ../../mod/pdledit.php:59
-msgid "Layout Help"
-msgstr "Lay-out-hulp"
-
-#: ../../mod/editpost.php:20 ../../mod/editblock.php:78
-#: ../../mod/editblock.php:94 ../../mod/editlayout.php:76
-#: ../../mod/editwebpage.php:77
-msgid "Item not found"
-msgstr "Item niet gevonden"
-
-#: ../../mod/editpost.php:31
-msgid "Item is not editable"
-msgstr "Item is niet te bewerken"
-
-#: ../../mod/editpost.php:57
-msgid "Delete item?"
-msgstr "Item verwijderen?"
-
-#: ../../mod/editpost.php:123 ../../mod/editblock.php:146
-#: ../../mod/editlayout.php:144 ../../mod/editwebpage.php:186
-msgid "Insert YouTube video"
-msgstr "YouTube-video invoegen"
-
-#: ../../mod/editpost.php:124 ../../mod/editblock.php:147
-#: ../../mod/editlayout.php:145 ../../mod/editwebpage.php:187
-msgid "Insert Vorbis [.ogg] video"
-msgstr "Vorbis-video [.ogg] invoegen"
-
-#: ../../mod/editpost.php:125 ../../mod/editblock.php:148
-#: ../../mod/editlayout.php:146 ../../mod/editwebpage.php:188
-msgid "Insert Vorbis [.ogg] audio"
-msgstr "Vorbis-audio [.ogg] invoegen"
-
-#: ../../mod/editpost.php:166 ../../mod/rpost.php:128
-msgid "Edit post"
-msgstr "Bericht bewerken"
-
-#: ../../mod/photos.php:79
-msgid "Page owner information could not be retrieved."
-msgstr "Informatie over de pagina-eigenaar werd niet ontvangen."
-
-#: ../../mod/photos.php:100 ../../mod/photos.php:144
-msgid "Album not found."
-msgstr "Album niet gevonden."
-
-#: ../../mod/photos.php:127
-msgid "Delete Album"
-msgstr "Verwijder album"
-
-#: ../../mod/photos.php:148
-msgid ""
-"Multiple storage folders exist with this album name, but within different "
-"directories. Please remove the desired folder or folders using the Files "
-"manager"
-msgstr "Er bestaan meerdere submappen met deze albumnaam, maar verspreidt over verschillende mappen. Verwijder de gewenste map(pen) met de bestandsbeheerder."
-
-#: ../../mod/photos.php:205 ../../mod/photos.php:1048
-msgid "Delete Photo"
-msgstr "Verwijder foto"
-
-#: ../../mod/photos.php:517 ../../mod/directory.php:59
-#: ../../mod/display.php:17 ../../mod/ratings.php:82 ../../mod/search.php:13
-#: ../../mod/viewconnections.php:17
-msgid "Public access denied."
-msgstr "Openbare toegang geweigerd."
-
-#: ../../mod/photos.php:528
-msgid "No photos selected"
-msgstr "Geen foto's geselecteerd"
-
-#: ../../mod/photos.php:577
-msgid "Access to this item is restricted."
-msgstr "Toegang tot dit item is beperkt."
-
-#: ../../mod/photos.php:616
-#, php-format
-msgid "%1$.2f MB of %2$.2f MB photo storage used."
-msgstr "%1$.2f MB van %2$.2f MB aan foto-opslag gebruikt."
-
-#: ../../mod/photos.php:619
-#, php-format
-msgid "%1$.2f MB photo storage used."
-msgstr "%1$.2f MB aan foto-opslag gebruikt."
-
-#: ../../mod/photos.php:655
-msgid "Upload Photos"
-msgstr "Foto's uploaden"
-
-#: ../../mod/photos.php:659
-msgid "Enter an album name"
-msgstr "Vul een albumnaam in"
-
-#: ../../mod/photos.php:660
-msgid "or select an existing album (doubleclick)"
-msgstr "of kies een bestaand album (dubbelklikken)"
-
-#: ../../mod/photos.php:661
-msgid "Create a status post for this upload"
-msgstr "Plaats een bericht voor deze upload."
-
-#: ../../mod/photos.php:662
-msgid "Caption (optional):"
-msgstr "Bijschrift (optioneel):"
-
-#: ../../mod/photos.php:663
-msgid "Description (optional):"
-msgstr "Omschrijving (optioneel):"
-
-#: ../../mod/photos.php:690
-msgid "Album name could not be decoded"
-msgstr "Albumnaam kon niet gedecodeerd worden"
-
-#: ../../mod/photos.php:738 ../../mod/photos.php:1278
-#: ../../mod/photos.php:1295
-msgid "Contact Photos"
-msgstr "Connectiefoto's"
-
-#: ../../mod/photos.php:761
-msgid "Show Newest First"
-msgstr "Nieuwste eerst weergeven"
-
-#: ../../mod/photos.php:763
-msgid "Show Oldest First"
-msgstr "Oudste eerst weergeven"
-
-#: ../../mod/photos.php:865
-msgid "Permission denied. Access to this item may be restricted."
-msgstr "Toegang geweigerd. Toegang tot dit item kan zijn beperkt."
-
-#: ../../mod/photos.php:867
-msgid "Photo not available"
-msgstr "Foto niet aanwezig"
-
-#: ../../mod/photos.php:925
-msgid "Use as profile photo"
-msgstr "Als profielfoto gebruiken"
-
-#: ../../mod/photos.php:926
-msgid "Use as cover photo"
-msgstr "Als omslagfoto gebruiken"
-
-#: ../../mod/photos.php:933
-msgid "Private Photo"
-msgstr "Privéfoto"
-
-#: ../../mod/photos.php:944 ../../mod/cal.php:331 ../../mod/cal.php:338
-#: ../../mod/events.php:659 ../../mod/events.php:666
-msgid "Previous"
-msgstr "Vorige"
-
-#: ../../mod/photos.php:948
-msgid "View Full Size"
-msgstr "Volledige grootte weergeven"
-
-#: ../../mod/photos.php:953 ../../mod/cal.php:332 ../../mod/cal.php:339
-#: ../../mod/events.php:660 ../../mod/events.php:667 ../../mod/setup.php:291
-msgid "Next"
-msgstr "Volgende"
-
-#: ../../mod/photos.php:993 ../../mod/tagrm.php:133
-msgid "Remove"
-msgstr "Verwijderen"
-
-#: ../../mod/photos.php:1027
-msgid "Edit photo"
-msgstr "Foto bewerken"
-
-#: ../../mod/photos.php:1029
-msgid "Rotate CW (right)"
-msgstr "Draai met de klok mee (naar rechts)"
-
-#: ../../mod/photos.php:1030
-msgid "Rotate CCW (left)"
-msgstr "Draai tegen de klok in (naar links)"
-
-#: ../../mod/photos.php:1033
-msgid "Enter a new album name"
-msgstr "Vul een nieuwe albumnaam in"
-
-#: ../../mod/photos.php:1034
-msgid "or select an existing one (doubleclick)"
-msgstr "of kies een bestaand album (dubbelklikken)"
-
-#: ../../mod/photos.php:1037
-msgid "Caption"
-msgstr "Bijschrift"
-
-#: ../../mod/photos.php:1039
-msgid "Add a Tag"
-msgstr "Tag toevoegen"
-
-#: ../../mod/photos.php:1043
-msgid "Example: @bob, @Barbara_Jensen, @jim@example.com"
-msgstr "Voorbeeld: @bob, @Barbara_Jansen, @jan@voorbeeld.nl"
-
-#: ../../mod/photos.php:1046
-msgid "Flag as adult in album view"
-msgstr "Markeer als voor volwassenen in albumweergave"
-
-#: ../../mod/photos.php:1238
-msgid "In This Photo:"
-msgstr "Op deze foto:"
-
-#: ../../mod/photos.php:1243
-msgid "Map"
-msgstr "Kaart"
-
-#: ../../mod/photos.php:1334
-msgid "View Album"
-msgstr "Album weergeven"
-
-#: ../../mod/photos.php:1345 ../../mod/photos.php:1358
-#: ../../mod/photos.php:1359
-msgid "Recent Photos"
-msgstr "Recente foto's"
-
-#: ../../mod/bookmarks.php:49
-msgid "Bookmark added"
-msgstr "Bladwijzer toegevoegd"
-
-#: ../../mod/bookmarks.php:71
-msgid "My Bookmarks"
-msgstr "Mijn bladwijzers"
-
-#: ../../mod/bookmarks.php:82
-msgid "My Connections Bookmarks"
-msgstr "Bladwijzers van mijn connecties"
-
-#: ../../mod/mitem.php:24 ../../mod/menu.php:140
-msgid "Menu not found."
-msgstr "Menu niet gevonden."
-
-#: ../../mod/mitem.php:48
-msgid "Unable to create element."
-msgstr "Niet in staat om onderdeel aan te maken."
-
-#: ../../mod/mitem.php:72
-msgid "Unable to update menu element."
-msgstr "Menu-onderdeel kan niet worden geüpdatet."
-
-#: ../../mod/mitem.php:88
-msgid "Unable to add menu element."
-msgstr "Menu-onderdeel kan niet worden toegevoegd."
-
-#: ../../mod/mitem.php:116 ../../mod/menu.php:162 ../../mod/xchan.php:37
-msgid "Not found."
-msgstr "Niet gevonden."
-
-#: ../../mod/mitem.php:149 ../../mod/mitem.php:222
-msgid "Menu Item Permissions"
-msgstr "Permissies menu-item"
-
-#: ../../mod/mitem.php:150 ../../mod/mitem.php:223 ../../mod/settings.php:1075
-msgid "(click to open/close)"
-msgstr "(klik om te openen/sluiten)"
-
-#: ../../mod/mitem.php:152 ../../mod/mitem.php:168
-msgid "Link Name"
-msgstr "Linknaam"
-
-#: ../../mod/mitem.php:153 ../../mod/mitem.php:227
-msgid "Link or Submenu Target"
-msgstr "Linkdoel of submenu-doel"
-
-#: ../../mod/mitem.php:153
-msgid "Enter URL of the link or select a menu name to create a submenu"
-msgstr "Geef de URL van de link of kies een menunaam om een submenu aan te maken"
-
-#: ../../mod/mitem.php:154 ../../mod/mitem.php:228
-msgid "Use magic-auth if available"
-msgstr "Gebruik magic-auth wanneer beschikbaar"
-
-#: ../../mod/mitem.php:155 ../../mod/mitem.php:229
-msgid "Open link in new window"
-msgstr "Open link in nieuw venster"
-
-#: ../../mod/mitem.php:156 ../../mod/mitem.php:230
-msgid "Order in list"
-msgstr "Volgorde in lijst"
-
-#: ../../mod/mitem.php:156 ../../mod/mitem.php:230
-msgid "Higher numbers will sink to bottom of listing"
-msgstr "Hogere nummers komen onderaan de lijst terecht"
-
-#: ../../mod/mitem.php:157
-msgid "Submit and finish"
-msgstr "Opslaan en afsluiten"
-
-#: ../../mod/mitem.php:158
-msgid "Submit and continue"
-msgstr "Opslaan en doorgaan"
-
-#: ../../mod/mitem.php:166
-msgid "Menu:"
-msgstr "Menu:"
-
-#: ../../mod/mitem.php:169
-msgid "Link Target"
-msgstr "Linkdoel"
-
-#: ../../mod/mitem.php:172
-msgid "Edit menu"
-msgstr "Menu bewerken"
-
-#: ../../mod/mitem.php:175
-msgid "Edit element"
-msgstr "Onderdeel bewerken"
-
-#: ../../mod/mitem.php:176
-msgid "Drop element"
-msgstr "Onderdeel verwijderen"
-
-#: ../../mod/mitem.php:177
-msgid "New element"
-msgstr "Nieuw element"
-
-#: ../../mod/mitem.php:178
-msgid "Edit this menu container"
-msgstr "Deze menu-container bewerken"
-
-#: ../../mod/mitem.php:179
-msgid "Add menu element"
-msgstr "Menu-element toevoegen"
-
-#: ../../mod/mitem.php:180
-msgid "Delete this menu item"
-msgstr "Dit menu-item verwijderen"
-
-#: ../../mod/mitem.php:181
-msgid "Edit this menu item"
-msgstr "Dit menu-item bewerken"
-
-#: ../../mod/mitem.php:198
-msgid "Menu item not found."
-msgstr "Menu-item niet gevonden."
-
-#: ../../mod/mitem.php:211
-msgid "Menu item deleted."
-msgstr "Menu-item verwijderd."
-
-#: ../../mod/mitem.php:213
-msgid "Menu item could not be deleted."
-msgstr "Menu-item kon niet worden verwijderd."
-
-#: ../../mod/mitem.php:220
-msgid "Edit Menu Element"
-msgstr "Menu-element bewerken"
-
-#: ../../mod/mitem.php:226
-msgid "Link text"
-msgstr "Linktekst"
-
-#: ../../mod/ping.php:260
-msgid "sent you a private message"
-msgstr "stuurde jou een privébericht"
-
-#: ../../mod/ping.php:308
-msgid "added your channel"
-msgstr "voegde jouw kanaal toe"
-
-#: ../../mod/ping.php:350
-msgid "posted an event"
-msgstr "plaatste een gebeurtenis"
-
-#: ../../mod/cal.php:68
-msgid "Permissions denied."
-msgstr "Permissies niet toegestaan"
-
-#: ../../mod/cal.php:258 ../../mod/events.php:581
-msgid "l, F j"
-msgstr "l j F"
-
-#: ../../mod/cal.php:330 ../../mod/events.php:658
-msgid "Edit Event"
-msgstr "Gebeurtenis bewerken"
-
-#: ../../mod/cal.php:330 ../../mod/events.php:658
-msgid "Create Event"
-msgstr "Gebeurtenis aanmaken"
-
-#: ../../mod/cal.php:340 ../../mod/events.php:668
-msgid "Today"
-msgstr "Vandaag"
-
-#: ../../mod/channel.php:25 ../../mod/chat.php:19
-msgid "You must be logged in to see this page."
-msgstr "Je moet zijn ingelogd om deze pagina te kunnen bekijken."
-
-#: ../../mod/channel.php:37
-msgid "Posts and comments"
-msgstr "Berichten en reacties"
-
-#: ../../mod/channel.php:38
-msgid "Only posts"
-msgstr "Alleen berichten"
-
-#: ../../mod/channel.php:98
-msgid "Insufficient permissions. Request redirected to profile page."
-msgstr "Onvoldoende permissies. Doorgestuurd naar profielpagina."
-
-#: ../../mod/channel.php:132 ../../mod/network.php:169 ../../mod/rpost.php:114
-msgid "Public"
-msgstr "Openbaar"
-
-#: ../../mod/poke.php:165
-msgid "Poke somebody"
-msgstr "Iemand aanstoten"
-
-#: ../../mod/poke.php:168
-msgid "Poke/Prod"
-msgstr "Aanstoten/porren"
-
-#: ../../mod/poke.php:169
-msgid "Poke, prod or do other things to somebody"
-msgstr "Iemand bijvoorbeeld aanstoten of poren"
-
-#: ../../mod/poke.php:176
-msgid "Recipient"
-msgstr "Ontvanger"
-
-#: ../../mod/poke.php:177
-msgid "Choose what you wish to do to recipient"
-msgstr "Kies wat je met de ontvanger wil doen"
-
-#: ../../mod/poke.php:180 ../../mod/poke.php:181
-msgid "Make this post private"
-msgstr "Maak dit bericht privé"
-
-#: ../../mod/chat.php:175
-msgid "Room not found"
-msgstr "Chatkanaal niet gevonden"
-
-#: ../../mod/chat.php:191
-msgid "Leave Room"
-msgstr "Chatkanaal verlaten"
-
-#: ../../mod/chat.php:192
-msgid "Delete Room"
-msgstr "Chatkanaal verwijderen"
-
-#: ../../mod/chat.php:193
-msgid "I am away right now"
-msgstr "Ik ben momenteel afwezig"
-
-#: ../../mod/chat.php:194
-msgid "I am online"
-msgstr "Ik ben online"
-
-#: ../../mod/chat.php:196
-msgid "Bookmark this room"
-msgstr "Chatkanaal aan bladwijzers toevoegen"
-
-#: ../../mod/chat.php:212
-msgid "Feature disabled."
-msgstr "Functie uitgeschakeld."
-
-#: ../../mod/chat.php:226
-msgid "New Chatroom"
-msgstr "Nieuw chatkanaal"
-
-#: ../../mod/chat.php:227
-msgid "Chatroom name"
-msgstr "Naam chatkanaal"
-
-#: ../../mod/chat.php:228
-msgid "Expiration of chats (minutes)"
-msgstr "Aantal minuten voordat chatberichten worden verwijderd"
-
-#: ../../mod/chat.php:240
-#, php-format
-msgid "%1$s's Chatrooms"
-msgstr "Chatkanalen van %1$s"
-
-#: ../../mod/chat.php:245
-msgid "No chatrooms available"
-msgstr "Geen chatkanalen beschikbaar"
-
-#: ../../mod/chat.php:246 ../../mod/profiles.php:777 ../../mod/manage.php:137
-msgid "Create New"
-msgstr "Nieuwe aanmaken"
-
-#: ../../mod/chat.php:249
-msgid "Expiration"
-msgstr "Verloopt na"
-
-#: ../../mod/chat.php:250
-msgid "min"
-msgstr "min"
-
-#: ../../mod/chatsvc.php:111
-msgid "Away"
-msgstr "Afwezig"
-
-#: ../../mod/chatsvc.php:116
-msgid "Online"
-msgstr "Online"
-
-#: ../../mod/probe.php:24 ../../mod/probe.php:30
-#, php-format
-msgid "Fetching URL returns error: %1$s"
-msgstr "Ophalen URL gaf een foutmelding terug: %1$s"
-
-#: ../../mod/common.php:10
-msgid "No channel."
-msgstr "Geen kanaal."
-
-#: ../../mod/common.php:39
-msgid "Common connections"
-msgstr "Veel voorkomende connecties"
-
-#: ../../mod/common.php:44
-msgid "No connections in common."
-msgstr "Geen gemeenschappelijke connecties."
-
-#: ../../mod/connect.php:56 ../../mod/connect.php:104
-msgid "Continue"
-msgstr "Ga verder"
-
-#: ../../mod/connect.php:85
-msgid "Premium Channel Setup"
-msgstr "Instellen premiumkanaal "
-
-#: ../../mod/connect.php:87
-msgid "Enable premium channel connection restrictions"
-msgstr "Restricties voor connecties van premiumkanaal toestaan"
-
-#: ../../mod/connect.php:88
-msgid ""
-"Please enter your restrictions or conditions, such as paypal receipt, usage "
-"guidelines, etc."
-msgstr "Vul je restricties of voorwaarden in, zoals een paypal-afschrift, voorschriften voor leden, enz."
-
-#: ../../mod/connect.php:90 ../../mod/connect.php:110
-msgid ""
-"This channel may require additional steps or acknowledgement of the "
-"following conditions prior to connecting:"
-msgstr "Dit kanaal kan extra stappen of het accepteren van de volgende voorwaarden vereisen, voordat de connectie wordt geaccepteerd:"
-
-#: ../../mod/connect.php:91
-msgid ""
-"Potential connections will then see the following text before proceeding:"
-msgstr "Mogelijke connecties zullen dan de volgende tekst zien voordat ze verder kunnen:"
-
-#: ../../mod/connect.php:92 ../../mod/connect.php:113
-msgid ""
-"By continuing, I certify that I have complied with any instructions provided"
-" on this page."
-msgstr "Door verder te gaan ga ik automatisch akkoord met alle voorwaarden en aanwijzingen op deze pagina."
-
-#: ../../mod/connect.php:101
-msgid "(No specific instructions have been provided by the channel owner.)"
-msgstr "(Er zijn geen speciale voorwaarden en aanwijzingen door de kanaal-eigenaar verstrekt) "
-
-#: ../../mod/connect.php:109
-msgid "Restricted or Premium Channel"
-msgstr "Beperkt of premiumkanaal"
-
-#: ../../mod/mood.php:132
-msgid "Set your current mood and tell your friends"
-msgstr "Noteer je huidige stemming en toon het aan je connecties"
-
-#: ../../mod/connections.php:52 ../../mod/connections.php:157
-#: ../../mod/connections.php:238
-msgid "Blocked"
-msgstr "Geblokkeerd"
-
-#: ../../mod/connections.php:57 ../../mod/connections.php:164
-#: ../../mod/connections.php:237
-msgid "Ignored"
-msgstr "Genegeerd"
-
-#: ../../mod/connections.php:62 ../../mod/connections.php:178
-#: ../../mod/connections.php:236
-msgid "Hidden"
-msgstr "Verborgen"
-
-#: ../../mod/connections.php:67 ../../mod/connections.php:171
-#: ../../mod/connections.php:235
-msgid "Archived"
-msgstr "Gearchiveerd"
-
-#: ../../mod/connections.php:134
-msgid "New Connections"
-msgstr "Nieuwe connecties"
-
-#: ../../mod/connections.php:137
-msgid "Show pending (new) connections"
-msgstr "Nog te accepteren (nieuwe) connecties weergeven"
-
-#: ../../mod/connections.php:141 ../../mod/profperm.php:139
-msgid "All Connections"
-msgstr "Alle connecties"
-
-#: ../../mod/connections.php:144
-msgid "Show all connections"
-msgstr "Toon alle connecties"
-
-#: ../../mod/connections.php:160
-msgid "Only show blocked connections"
-msgstr "Toon alleen geblokkeerde connecties"
-
-#: ../../mod/connections.php:167
-msgid "Only show ignored connections"
-msgstr "Toon alleen genegeerde connecties"
-
-#: ../../mod/connections.php:174
-msgid "Only show archived connections"
-msgstr "Toon alleen gearchiveerde connecties"
-
-#: ../../mod/connections.php:181
-msgid "Only show hidden connections"
-msgstr "Toon alleen verborgen connecties"
-
-#: ../../mod/connections.php:234
-msgid "Pending approval"
-msgstr "Moet nog geaccepteerd worden"
-
-#: ../../mod/connections.php:250
-#, php-format
-msgid "%1$s [%2$s]"
-msgstr "%1$s [%2$s]"
-
-#: ../../mod/connections.php:251
-msgid "Edit connection"
-msgstr "Connectie bewerken"
-
-#: ../../mod/connections.php:252
-msgid "Delete connection"
-msgstr "Connectie verwijderen"
-
-#: ../../mod/connections.php:261
-msgid "Channel address"
-msgstr "Kanaaladres"
-
-#: ../../mod/connections.php:263
-msgid "Network"
-msgstr "Netwerk"
-
-#: ../../mod/connections.php:268
-msgid "Connected"
-msgstr "Verbonden"
-
-#: ../../mod/connections.php:270
-msgid "Approve connection"
-msgstr "Connectie accepteren"
-
-#: ../../mod/connections.php:272
-msgid "Ignore connection"
-msgstr "Connectie negeren"
-
-#: ../../mod/connections.php:273 ../../mod/connedit.php:545
-#: ../../mod/notifications.php:51
-msgid "Ignore"
-msgstr "Negeren"
-
-#: ../../mod/connections.php:274
-msgid "Recent activity"
-msgstr "Recente activiteit"
-
-#: ../../mod/connections.php:303
-msgid "Search your connections"
-msgstr "Doorzoek jouw connecties"
-
-#: ../../mod/connections.php:304
-msgid "Connections search"
-msgstr "Connecties zoeken"
-
-#: ../../mod/profile_photo.php:112 ../../mod/cover_photo.php:54
-msgid "Image uploaded but image cropping failed."
-msgstr "Afbeelding geüpload, maar afbeelding kon niet worden bijgesneden. "
-
-#: ../../mod/profile_photo.php:166 ../../mod/cover_photo.php:150
-msgid "Image resize failed."
-msgstr "Afbeelding kon niet van grootte veranderd worden."
-
-#: ../../mod/profile_photo.php:212
-msgid ""
-"Shift-reload the page or clear browser cache if the new photo does not "
-"display immediately."
-msgstr "Vernieuw de pagina met shift+R of shift+F5, of leeg je browserbuffer, wanneer de nieuwe foto niet meteen wordt weergegeven."
-
-#: ../../mod/profile_photo.php:250 ../../mod/cover_photo.php:188
-msgid "Image upload failed."
-msgstr "Uploaden afbeelding mislukt"
-
-#: ../../mod/profile_photo.php:269 ../../mod/cover_photo.php:206
-msgid "Unable to process image."
-msgstr "Niet in staat om afbeelding te verwerken."
-
-#: ../../mod/profile_photo.php:316 ../../mod/profile_photo.php:357
-#: ../../mod/cover_photo.php:299 ../../mod/cover_photo.php:314
-msgid "Photo not available."
-msgstr "Foto niet beschikbaar."
-
-#: ../../mod/profile_photo.php:398 ../../mod/cover_photo.php:350
-msgid "Upload File:"
-msgstr "Bestand uploaden:"
-
-#: ../../mod/profile_photo.php:399 ../../mod/cover_photo.php:351
-msgid "Select a profile:"
-msgstr "Kies een profiel:"
-
-#: ../../mod/profile_photo.php:400
-msgid "Upload Profile Photo"
-msgstr "Profielfoto uploaden"
-
-#: ../../mod/profile_photo.php:407 ../../mod/cover_photo.php:357
-#: ../../mod/settings.php:992
-msgid "or"
-msgstr "of"
-
-#: ../../mod/profile_photo.php:407 ../../mod/cover_photo.php:357
-msgid "skip this step"
-msgstr "sla deze stap over"
-
-#: ../../mod/profile_photo.php:407 ../../mod/cover_photo.php:357
-msgid "select a photo from your photo albums"
-msgstr "Kies een foto uit jouw fotoalbums"
-
-#: ../../mod/profile_photo.php:423 ../../mod/cover_photo.php:373
-msgid "Crop Image"
-msgstr "Afbeelding bijsnijden"
-
-#: ../../mod/profile_photo.php:424 ../../mod/cover_photo.php:374
-msgid "Please adjust the image cropping for optimum viewing."
-msgstr "Snij de afbeelding zo uit dat deze optimaal wordt weergegeven."
-
-#: ../../mod/profile_photo.php:426 ../../mod/cover_photo.php:376
-msgid "Done Editing"
-msgstr "Klaar met bewerken"
-
-#: ../../mod/connedit.php:75
-msgid "Could not access contact record."
-msgstr "Kon geen toegang krijgen tot de connectie-gegevens."
-
-#: ../../mod/connedit.php:99
-msgid "Could not locate selected profile."
-msgstr "Kon het gekozen profiel niet vinden."
-
-#: ../../mod/connedit.php:223
-msgid "Connection updated."
-msgstr "Connectie bijgewerkt."
-
-#: ../../mod/connedit.php:225
-msgid "Failed to update connection record."
-msgstr "Bijwerken van connectie-gegevens mislukt."
-
-#: ../../mod/connedit.php:272
-msgid "is now connected to"
-msgstr "is nu verbonden met"
-
-#: ../../mod/connedit.php:407
-msgid "Could not access address book record."
-msgstr "Kon geen toegang krijgen tot de record van de connectie."
-
-#: ../../mod/connedit.php:421
-msgid "Refresh failed - channel is currently unavailable."
-msgstr "Vernieuwen mislukt - kanaal is momenteel niet beschikbaar"
-
-#: ../../mod/connedit.php:436 ../../mod/connedit.php:445
-#: ../../mod/connedit.php:454 ../../mod/connedit.php:463
-#: ../../mod/connedit.php:476
-msgid "Unable to set address book parameters."
-msgstr "Niet in staat om de parameters van connecties in te stellen."
-
-#: ../../mod/connedit.php:500
-msgid "Connection has been removed."
-msgstr "Connectie is verwijderd"
-
-#: ../../mod/connedit.php:519
-#, php-format
-msgid "View %s's profile"
-msgstr "Profiel van %s weergeven"
-
-#: ../../mod/connedit.php:523
-msgid "Refresh Permissions"
-msgstr "Permissies vernieuwen"
-
-#: ../../mod/connedit.php:526
-msgid "Fetch updated permissions"
-msgstr "Aangepaste permissies ophalen"
-
-#: ../../mod/connedit.php:530
-msgid "Recent Activity"
-msgstr "Recente activiteit/berichten"
-
-#: ../../mod/connedit.php:533
-msgid "View recent posts and comments"
-msgstr "Recente berichten en reacties weergeven"
-
-#: ../../mod/connedit.php:540
-msgid "Block (or Unblock) all communications with this connection"
-msgstr "Blokkeer (of deblokkeer) alle communicatie met deze connectie"
-
-#: ../../mod/connedit.php:541
-msgid "This connection is blocked!"
-msgstr "Deze connectie is geblokkeerd!"
-
-#: ../../mod/connedit.php:545
-msgid "Unignore"
-msgstr "Niet meer negeren"
-
-#: ../../mod/connedit.php:548
-msgid "Ignore (or Unignore) all inbound communications from this connection"
-msgstr "Negeer (of negeer niet meer) alle inkomende communicatie van deze connectie"
-
-#: ../../mod/connedit.php:549
-msgid "This connection is ignored!"
-msgstr "Deze connectie wordt genegeerd!"
-
-#: ../../mod/connedit.php:553
-msgid "Unarchive"
-msgstr "Niet meer archiveren"
-
-#: ../../mod/connedit.php:553
-msgid "Archive"
-msgstr "Archiveren"
-
-#: ../../mod/connedit.php:556
-msgid ""
-"Archive (or Unarchive) this connection - mark channel dead but keep content"
-msgstr "Archiveer (of dearchiveer) deze connectie - markeer het kanaal als dood, maar bewaar de inhoud"
-
-#: ../../mod/connedit.php:557
-msgid "This connection is archived!"
-msgstr "Deze connectie is gearchiveerd!"
-
-#: ../../mod/connedit.php:561
-msgid "Unhide"
-msgstr "Niet meer verbergen"
-
-#: ../../mod/connedit.php:561
-msgid "Hide"
-msgstr "Verbergen"
-
-#: ../../mod/connedit.php:564
-msgid "Hide or Unhide this connection from your other connections"
-msgstr "Deze connectie verbergen (of niet meer verbergen) voor jouw andere connecties"
-
-#: ../../mod/connedit.php:565
-msgid "This connection is hidden!"
-msgstr "Deze connectie is verborgen!"
-
-#: ../../mod/connedit.php:572
-msgid "Delete this connection"
-msgstr "Deze connectie verwijderen"
-
-#: ../../mod/connedit.php:653
-msgid "Approve this connection"
-msgstr "Deze connectie accepteren"
-
-#: ../../mod/connedit.php:653
-msgid "Accept connection to allow communication"
-msgstr "Keur deze connectie goed om communicatie toe te staan"
-
-#: ../../mod/connedit.php:658
-msgid "Set Affinity"
-msgstr "Verwantschapsfilter instellen"
-
-#: ../../mod/connedit.php:661
-msgid "Set Profile"
-msgstr "Profiel instellen"
-
-#: ../../mod/connedit.php:664
-msgid "Set Affinity & Profile"
-msgstr "Verwantschapsfilter en profiel instellen"
-
-#: ../../mod/connedit.php:697
-msgid "none"
-msgstr "geen"
-
-#: ../../mod/connedit.php:702
-msgid "Apply these permissions automatically"
-msgstr "Deze permissies automatisch toepassen"
-
-#: ../../mod/connedit.php:702
-msgid "Connection requests will be approved without your interaction"
-msgstr "Connectieverzoeken zullen automatisch worden geaccepteerd"
-
-#: ../../mod/connedit.php:704
-msgid "This connection's primary address is"
-msgstr "Het primaire kanaaladres van deze connectie is"
-
-#: ../../mod/connedit.php:705
-msgid "Available locations:"
-msgstr "Beschikbare locaties:"
-
-#: ../../mod/connedit.php:709
-msgid ""
-"The permissions indicated on this page will be applied to all new "
-"connections."
-msgstr "Permissies die op deze pagina staan vermeld worden op alle nieuwe connecties toegepast."
-
-#: ../../mod/connedit.php:711
-msgid "Slide to adjust your degree of friendship"
-msgstr "Schuif om te bepalen hoe goed je iemand kent en/of mag"
-
-#: ../../mod/connedit.php:713
-msgid "Slide to adjust your rating"
-msgstr "Gebruik de schuif om je beoordeling te geven"
-
-#: ../../mod/connedit.php:714 ../../mod/connedit.php:719
-msgid "Optionally explain your rating"
-msgstr "Verklaar jouw beoordeling (niet verplicht)"
-
-#: ../../mod/connedit.php:716
-msgid "Custom Filter"
-msgstr "Berichtenfilter"
-
-#: ../../mod/connedit.php:717
-msgid "Only import posts with this text"
-msgstr "Importeer alleen berichten met deze tekst"
-
-#: ../../mod/connedit.php:717 ../../mod/connedit.php:718
-msgid ""
-"words one per line or #tags or /patterns/ or lang=xx, leave blank to import "
-"all posts"
-msgstr "woorden (één per regel), #tags, /regex/ of talen (lang=iso639-1) - laat leeg om alle berichten te importeren"
-
-#: ../../mod/connedit.php:718
-msgid "Do not import posts with this text"
-msgstr "Importeer geen berichten met deze tekst"
-
-#: ../../mod/connedit.php:720
-msgid "This information is public!"
-msgstr "Deze informatie is openbaar!"
-
-#: ../../mod/connedit.php:725
-msgid "Connection Pending Approval"
-msgstr "Connectie moet nog geaccepteerd worden"
-
-#: ../../mod/connedit.php:728
-msgid "inherited"
-msgstr "geërfd"
-
-#: ../../mod/connedit.php:730
-#, php-format
-msgid ""
-"Please choose the profile you would like to display to %s when viewing your "
-"profile securely."
-msgstr "Kies het profiel dat je aan %s wil tonen wanneer hij/zij ingelogd jouw profiel wil bekijken."
-
-#: ../../mod/connedit.php:732
-msgid "Their Settings"
-msgstr "Hun instellingen"
-
-#: ../../mod/connedit.php:733
-msgid "My Settings"
-msgstr "Mijn instellingen"
-
-#: ../../mod/connedit.php:735
-msgid "Individual Permissions"
-msgstr "Individuele permissies"
-
-#: ../../mod/connedit.php:736
-msgid ""
-"Some permissions may be inherited from your channel's <a "
-"href=\"settings\"><strong>privacy settings</strong></a>, which have higher "
-"priority than individual settings. You can <strong>not</strong> change those"
-" settings here."
-msgstr "Sommige permissies worden mogelijk overgeërfd van de <a href=\"settings\">privacy-instellingen</a> van jouw kanaal, die een hogere prioriteit hebben dan deze individuele instellingen. Je kan je deze overgeërfde permissies hier <strong>niet</strong> veranderen."
-
-#: ../../mod/connedit.php:737
-msgid ""
-"Some permissions may be inherited from your channel's <a "
-"href=\"settings\"><strong>privacy settings</strong></a>, which have higher "
-"priority than individual settings. You can change those settings here but "
-"they wont have any impact unless the inherited setting changes."
-msgstr "Sommige permissies worden mogelijk overgeërfd van de <a href=\"settings\">privacy-instellingen</a> van jouw kanaal, die een hogere prioriteit hebben dan deze individuele permissies. Je kan de permissies hier veranderen, maar die hebben geen effect, tenzij de overgeërfde permissies worden veranderd. "
-
-#: ../../mod/connedit.php:738
-msgid "Last update:"
-msgstr "Laatste wijziging:"
-
-#: ../../mod/network.php:91
-msgid "No such group"
-msgstr "Collectie niet gevonden"
-
-#: ../../mod/network.php:131
-msgid "No such channel"
-msgstr "Niet zo'n kanaal"
-
-#: ../../mod/network.php:136
-msgid "forum"
-msgstr "forum"
-
-#: ../../mod/network.php:148
-msgid "Search Results For:"
-msgstr "Zoekresultaten voor:"
-
-#: ../../mod/network.php:212
-msgid "Privacy group is empty"
-msgstr "Privacygroep is leeg"
-
-#: ../../mod/network.php:221
-msgid "Privacy group: "
-msgstr "Privacygroep: "
-
-#: ../../mod/network.php:247
-msgid "Invalid connection."
-msgstr "Ongeldige connectie."
-
-#: ../../mod/cover_photo.php:130 ../../mod/cover_photo.php:177
-msgid "Cover Photos"
-msgstr "Omslagfoto's"
-
-#: ../../mod/cover_photo.php:352
-msgid "Upload Cover Photo"
-msgstr "Omslagfoto uploaden"
-
-#: ../../mod/profiles.php:19 ../../mod/profiles.php:184
-#: ../../mod/profiles.php:241 ../../mod/profiles.php:620
-msgid "Profile not found."
-msgstr "Profiel niet gevonden."
-
-#: ../../mod/profiles.php:39
-msgid "Profile deleted."
-msgstr "Profiel verwijderd."
-
-#: ../../mod/profiles.php:63 ../../mod/profiles.php:99
-msgid "Profile-"
-msgstr "Profiel-"
-
-#: ../../mod/profiles.php:84 ../../mod/profiles.php:127
-msgid "New profile created."
-msgstr "Nieuw profiel aangemaakt."
-
-#: ../../mod/profiles.php:105
-msgid "Profile unavailable to clone."
-msgstr "Profiel niet beschikbaar om te klonen"
-
-#: ../../mod/profiles.php:146
-msgid "Profile unavailable to export."
-msgstr "Geen profiel beschikbaar om te exporteren"
-
-#: ../../mod/profiles.php:251
-msgid "Profile Name is required."
-msgstr "Profielnaam is vereist"
-
-#: ../../mod/profiles.php:422
-msgid "Marital Status"
-msgstr "Huwelijke status"
-
-#: ../../mod/profiles.php:426
-msgid "Romantic Partner"
-msgstr "Romantische partner"
-
-#: ../../mod/profiles.php:430 ../../mod/profiles.php:735
-msgid "Likes"
-msgstr "Houdt van"
-
-#: ../../mod/profiles.php:434 ../../mod/profiles.php:736
-msgid "Dislikes"
-msgstr "Houdt niet van"
-
-#: ../../mod/profiles.php:438 ../../mod/profiles.php:743
-msgid "Work/Employment"
-msgstr "Werk/arbeid"
-
-#: ../../mod/profiles.php:441
-msgid "Religion"
-msgstr "Religie"
-
-#: ../../mod/profiles.php:445
-msgid "Political Views"
-msgstr "Politieke overtuigingen"
-
-#: ../../mod/profiles.php:449 ../../mod/id.php:33
-msgid "Gender"
-msgstr "Geslacht"
-
-#: ../../mod/profiles.php:453
-msgid "Sexual Preference"
-msgstr "Seksuele voorkeur"
-
-#: ../../mod/profiles.php:457
-msgid "Homepage"
-msgstr "Homepage"
-
-#: ../../mod/profiles.php:461
-msgid "Interests"
-msgstr "Interesses"
-
-#: ../../mod/profiles.php:555
-msgid "Profile updated."
-msgstr "Profiel bijgewerkt"
-
-#: ../../mod/profiles.php:644
-msgid "Hide your connections list from viewers of this profile"
-msgstr "Laat de lijst met connecties niet aan bezoekers van dit profiel zien."
-
-#: ../../mod/profiles.php:686
-msgid "Edit Profile Details"
-msgstr "Profiel bewerken"
-
-#: ../../mod/profiles.php:688
-msgid "View this profile"
-msgstr "Profiel weergeven"
-
-#: ../../mod/profiles.php:690
-msgid "Change cover photo"
-msgstr "Omslagfoto wijzigen"
-
-#: ../../mod/profiles.php:692
-msgid "Create a new profile using these settings"
-msgstr "Een nieuw profiel aanmaken met dit profiel als basis"
-
-#: ../../mod/profiles.php:693
-msgid "Clone this profile"
-msgstr "Dit profiel klonen"
-
-#: ../../mod/profiles.php:694
-msgid "Delete this profile"
-msgstr "Dit profiel verwijderen"
-
-#: ../../mod/profiles.php:695
-msgid "Add profile things"
-msgstr "Dingen aan je profiel toevoegen"
-
-#: ../../mod/profiles.php:698
-msgid "Relation"
-msgstr "Relatie"
-
-#: ../../mod/profiles.php:701
-msgid "Import profile from file"
-msgstr "Profiel vanuit bestand importeren"
-
-#: ../../mod/profiles.php:702
-msgid "Export profile to file"
-msgstr "Profiel naar bestand exporteren"
-
-#: ../../mod/profiles.php:703
-msgid "Your gender"
-msgstr "Jouw geslacht"
-
-#: ../../mod/profiles.php:704
-msgid "Marital status"
-msgstr "Burgerlijke staat"
-
-#: ../../mod/profiles.php:705
-msgid "Sexual preference"
-msgstr "Seksuele voorkeur"
-
-#: ../../mod/profiles.php:708
-msgid "Profile name"
-msgstr "Profielnaam"
-
-#: ../../mod/profiles.php:710
-msgid "This is your default profile."
-msgstr "Dit is jouw standaardprofiel"
-
-#: ../../mod/profiles.php:712
-msgid "Your full name"
-msgstr "Jouw volledige naam"
-
-#: ../../mod/profiles.php:713
-msgid "Title/Description"
-msgstr "Titel/omschrijving"
-
-#: ../../mod/profiles.php:716
-msgid "Street address"
-msgstr "Straat en huisnummer"
-
-#: ../../mod/profiles.php:717
-msgid "Locality/City"
-msgstr "Woonplaats"
-
-#: ../../mod/profiles.php:718
-msgid "Region/State"
-msgstr "Provincie/gewest/deelstaat"
-
-#: ../../mod/profiles.php:719
-msgid "Postal/Zip code"
-msgstr "Postcode"
-
-#: ../../mod/profiles.php:720
-msgid "Country"
-msgstr "Land"
-
-#: ../../mod/profiles.php:725
-msgid "Who (if applicable)"
-msgstr "Wie (wanneer van toepassing)"
-
-#: ../../mod/profiles.php:725
-msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
-msgstr "Voorbeelden: petra123, Petra Jansen, petra@voorbeeld.nl"
-
-#: ../../mod/profiles.php:726
-msgid "Since (date)"
-msgstr "Sinds (datum)"
-
-#: ../../mod/profiles.php:729
-msgid "Tell us about yourself"
-msgstr "Vertel ons iets over jezelf"
-
-#: ../../mod/profiles.php:730 ../../mod/id.php:27
-msgid "Homepage URL"
-msgstr "URL homepagina"
-
-#: ../../mod/profiles.php:731
-msgid "Hometown"
-msgstr "Oorspronkelijk uit"
-
-#: ../../mod/profiles.php:732
-msgid "Political views"
-msgstr "Politieke overtuigingen"
-
-#: ../../mod/profiles.php:733
-msgid "Religious views"
-msgstr "Religieuze overtuigingen"
-
-#: ../../mod/profiles.php:734
-msgid "Keywords used in directory listings"
-msgstr "Trefwoorden voor in de kanalengids"
-
-#: ../../mod/profiles.php:734
-msgid "Example: fishing photography software"
-msgstr "Voorbeeld: muziek, fotografie, software"
-
-#: ../../mod/profiles.php:737
-msgid "Musical interests"
-msgstr "Muzikale interesses"
-
-#: ../../mod/profiles.php:738
-msgid "Books, literature"
-msgstr "Boeken/literatuur"
-
-#: ../../mod/profiles.php:739
-msgid "Television"
-msgstr "Televisie"
-
-#: ../../mod/profiles.php:740
-msgid "Film/Dance/Culture/Entertainment"
-msgstr "Film/dans/cultuur/entertainment"
-
-#: ../../mod/profiles.php:741
-msgid "Hobbies/Interests"
-msgstr "Hobby's/interesses"
-
-#: ../../mod/profiles.php:742
-msgid "Love/Romance"
-msgstr "Liefde/romantiek"
-
-#: ../../mod/profiles.php:744
-msgid "School/Education"
-msgstr "School/opleiding"
-
-#: ../../mod/profiles.php:745
-msgid "Contact information and social networks"
-msgstr "Contactinformatie en sociale netwerken"
-
-#: ../../mod/profiles.php:746
-msgid "My other channels"
-msgstr "Mijn andere kanalen"
-
-#: ../../mod/dav.php:121
-msgid "$Projectname channel"
-msgstr "$Projectname-kanaal"
-
-#: ../../mod/profperm.php:29 ../../mod/profperm.php:58
-msgid "Invalid profile identifier."
-msgstr "Ongeldige profiel-identificator"
-
-#: ../../mod/profperm.php:110
-msgid "Profile Visibility Editor"
-msgstr "Zichtbaarheid profiel "
-
-#: ../../mod/profperm.php:114
-msgid "Click on a contact to add or remove."
-msgstr "Klik op een connectie om deze toe te voegen of te verwijderen"
-
-#: ../../mod/profperm.php:123
-msgid "Visible To"
-msgstr "Zichtbaar voor"
-
-#: ../../mod/directory.php:239
-#, php-format
-msgid "%d rating"
-msgid_plural "%d ratings"
-msgstr[0] "%d beoordeling"
-msgstr[1] "%d beoordelingen"
-
-#: ../../mod/directory.php:250
-msgid "Gender: "
-msgstr "Geslacht:"
-
-#: ../../mod/directory.php:252
-msgid "Status: "
-msgstr "Status: "
-
-#: ../../mod/directory.php:254
-msgid "Homepage: "
-msgstr "Homepage: "
-
-#: ../../mod/directory.php:313
-msgid "Description:"
-msgstr "Omschrijving:"
-
-#: ../../mod/directory.php:322
-msgid "Public Forum:"
-msgstr "Openbaar forum:"
-
-#: ../../mod/directory.php:325
-msgid "Keywords: "
-msgstr "Trefwoorden: "
-
-#: ../../mod/directory.php:328
-msgid "Don't suggest"
-msgstr "Niet voorstellen"
-
-#: ../../mod/directory.php:330
-msgid "Common connections:"
-msgstr "Gemeenschappelijke connecties:"
-
-#: ../../mod/directory.php:379
-msgid "Global Directory"
-msgstr "Volledige kanalengids"
-
-#: ../../mod/directory.php:379
-msgid "Local Directory"
-msgstr "Lokale kanalengids"
-
-#: ../../mod/directory.php:385
-msgid "Finding:"
-msgstr "Gezocht naar:"
-
-#: ../../mod/directory.php:390
-msgid "next page"
-msgstr "volgende pagina"
-
-#: ../../mod/directory.php:390
-msgid "previous page"
-msgstr "vorige pagina"
-
-#: ../../mod/directory.php:391
-msgid "Sort options"
-msgstr "Sorteeropties"
-
-#: ../../mod/directory.php:392
-msgid "Alphabetic"
-msgstr "Alfabetisch"
-
-#: ../../mod/directory.php:393
-msgid "Reverse Alphabetic"
-msgstr "Omgekeerd alfabetisch"
-
-#: ../../mod/directory.php:394
-msgid "Newest to Oldest"
-msgstr "Nieuw naar oud"
-
-#: ../../mod/directory.php:395
-msgid "Oldest to Newest"
-msgstr "Oud naar nieuw"
-
-#: ../../mod/directory.php:412
-msgid "No entries (some entries may be hidden)."
-msgstr "Niets gevonden (sommige kanalen kunnen verborgen zijn)."
-
-#: ../../mod/dirsearch.php:21 ../../mod/regdir.php:45
-msgid "This site is not a directory server"
-msgstr "Deze hub is geen kanalengidshub (directoryserver)"
-
-#: ../../mod/dirsearch.php:29
-msgid "This directory server requires an access token"
-msgstr "Deze kanalengidshub (directoryserver) heeft een toegangs-token nodig"
-
-#: ../../mod/pubsites.php:21
-msgid ""
-"The listed hubs allow public registration for the $Projectname network. All "
-"hubs in the network are interlinked so membership on any of them conveys "
-"membership in the network as a whole. Some hubs may require subscription or "
-"provide tiered service plans. The hub itself <strong>may</strong> provide "
-"additional details."
-msgstr "Op de hier weergegeven hubs kan iedereen zich voor het $Projectname-netwerk aanmelden. Alle hubs in het netwerk zijn met elkaar verbonden, dus maakt het qua lidmaatschap niet uit waar je je aanmeldt. Op sommige hubs heb je eerst goedkeuring nodig en sommige hubs vereisen een financiële tegemoetkoming voor bepaalde uitbreidingen. <strong>Mogelijk</strong> wordt hierover op de hub zelf meer informatie gegeven."
-
-#: ../../mod/pubsites.php:27
-msgid "Hub URL"
-msgstr "Hub-URL"
-
-#: ../../mod/pubsites.php:27
-msgid "Access Type"
-msgstr "Toegangs-<br/>&nbsp;type"
-
-#: ../../mod/pubsites.php:27
-msgid "Registration Policy"
-msgstr "Registratie-<br/>&nbsp;beleid"
-
-#: ../../mod/pubsites.php:33
-msgid "Rate"
-msgstr "Beoordeel"
-
-#: ../../mod/dreport.php:23
-msgid "Invalid message"
-msgstr "Ongeldig bericht"
-
-#: ../../mod/dreport.php:55
-msgid "no results"
-msgstr "geen resultaten"
-
-#: ../../mod/dreport.php:60
-#, php-format
-msgid "Delivery report for %1$s"
-msgstr "Afleveringsrapport voor %1$s"
-
-#: ../../mod/dreport.php:74
-msgid "channel sync processed"
-msgstr "kanaalsync verwerkt"
-
-#: ../../mod/dreport.php:78
-msgid "queued"
-msgstr "in wachtrij"
-
-#: ../../mod/dreport.php:82
-msgid "posted"
-msgstr "verstuurd"
-
-#: ../../mod/dreport.php:86
-msgid "accepted for delivery"
-msgstr "geaccepteerd om afgeleverd te worden"
-
-#: ../../mod/dreport.php:90
-msgid "updated"
-msgstr "geüpdatet"
-
-#: ../../mod/dreport.php:93
-msgid "update ignored"
-msgstr "update genegeerd"
-
-#: ../../mod/dreport.php:96
-msgid "permission denied"
-msgstr "toegang geweigerd"
-
-#: ../../mod/dreport.php:100
-msgid "recipient not found"
-msgstr "ontvanger niet gevonden"
-
-#: ../../mod/dreport.php:103
-msgid "mail recalled"
-msgstr "Privébericht ingetrokken"
-
-#: ../../mod/dreport.php:106
-msgid "duplicate mail received"
-msgstr "dubbel privébericht ontvangen"
-
-#: ../../mod/dreport.php:109
-msgid "mail delivered"
-msgstr "privébericht afgeleverd"
-
-#: ../../mod/editblock.php:118
-msgid "Delete block?"
-msgstr "Blok verwijderen"
-
-#: ../../mod/editblock.php:182
-msgid "Edit Block"
-msgstr "Blok bewerken"
-
-#: ../../mod/new_channel.php:117 ../../mod/manage.php:130
-#, php-format
-msgid "You have created %1$.0f of %2$.0f allowed channels."
-msgstr "Je hebt %1$.0f van totaal %2$.0f toegestane kanalen aangemaakt."
-
-#: ../../mod/new_channel.php:124 ../../mod/register.php:227
-msgid "Name or caption"
-msgstr "Naam"
-
-#: ../../mod/new_channel.php:124 ../../mod/register.php:227
-msgid "Examples: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \"Aviation Group\""
-msgstr "Voorbeelden: \"Jan Pietersen\", \"Willems weblog\", \"Computerforum\""
-
-#: ../../mod/new_channel.php:126 ../../mod/register.php:229
-msgid "Choose a short nickname"
-msgstr "Korte bijnaam"
-
-#: ../../mod/new_channel.php:126 ../../mod/register.php:229
-#, php-format
-msgid ""
-"Your nickname will be used to create an easy to remember channel address "
-"e.g. nickname%s"
-msgstr "Deze bijnaam wordt gebruikt om een makkelijk te onthouden kanaaladres van jouw kanaal aan te maken, die je dan met anderen kunt delen. Bijvoorbeeld: bijnaam%s"
-
-#: ../../mod/new_channel.php:128 ../../mod/register.php:231
-msgid "Channel role and privacy"
-msgstr "Kanaaltype en privacy"
-
-#: ../../mod/new_channel.php:128 ../../mod/register.php:231
-msgid "Select a channel role with your privacy requirements."
-msgstr "Kies een kanaaltype met het door jou gewenste privacyniveau."
-
-#: ../../mod/new_channel.php:128 ../../mod/register.php:231
-msgid "Read more about roles"
-msgstr "Lees meer over kanaaltypes"
-
-#: ../../mod/new_channel.php:131
-msgid "Create Channel"
-msgstr "Kanaal aanmaken"
-
-#: ../../mod/new_channel.php:132
-msgid ""
-"A channel is your identity on this network. It can represent a person, a "
-"blog, or a forum to name a few. Channels can make connections with other "
-"channels to share information with highly detailed permissions."
-msgstr "Een kanaal is jouw identiteit in dit netwerk. Het kan bijvoorbeeld een persoon, een blog of een forum vertegenwoordigen. Door met elkaar te verbinden kunnen kanalen, met behulp van uitgebreide permissies, informatie uitwisselen."
-
-#: ../../mod/new_channel.php:133
-msgid ""
-"or <a href=\"import\">import an existing channel</a> from another location."
-msgstr "Of <a href=\"import\">importeer een bestaand kanaal</a> vanaf een andere locatie"
-
-#: ../../mod/editlayout.php:112
-msgid "Delete layout?"
-msgstr "Lay-out verwijderen?"
-
-#: ../../mod/editlayout.php:160 ../../mod/layouts.php:124
-msgid "Layout Description (Optional)"
-msgstr "Lay-out-omschrijving (optioneel)"
-
-#: ../../mod/editlayout.php:162 ../../mod/layouts.php:121
-#: ../../mod/layouts.php:180
-msgid "Layout Name"
-msgstr "Naam lay-out"
-
-#: ../../mod/editlayout.php:179
-msgid "Edit Layout"
-msgstr "Lay-out bewerken"
-
-#: ../../mod/rate.php:158
-msgid "Website:"
-msgstr "Website:"
-
-#: ../../mod/rate.php:161
-#, php-format
-msgid "Remote Channel [%s] (not yet known on this site)"
-msgstr "Kanaal op afstand [%s] (nog niet op deze hub bekend)"
-
-#: ../../mod/rate.php:162
-msgid "Rating (this information is public)"
-msgstr "Beoordeling (deze informatie is openbaar)"
-
-#: ../../mod/rate.php:163
-msgid "Optionally explain your rating (this information is public)"
-msgstr "Verklaar jouw beoordeling (niet verplicht, deze informatie is openbaar)"
-
-#: ../../mod/webpages.php:195
-msgid "Page Title"
-msgstr "Paginatitel"
-
-#: ../../mod/editwebpage.php:153
-msgid "Delete webpage?"
-msgstr "Webpagina verwijderen?"
-
-#: ../../mod/editwebpage.php:173
-msgid "Page link title"
-msgstr "Titel van paginalink"
-
-#: ../../mod/editwebpage.php:223
-msgid "Edit Webpage"
-msgstr "Webpagina bewerken"
-
-#: ../../mod/blocks.php:95 ../../mod/blocks.php:150
-msgid "Block Name"
-msgstr "Bloknaam"
-
-#: ../../mod/blocks.php:151
-msgid "Block Title"
-msgstr "Bloktitel"
-
-#: ../../mod/ratings.php:69
-msgid "No ratings"
-msgstr "Geen beoordelingen"
-
-#: ../../mod/ratings.php:100
-msgid "Rating: "
-msgstr "Beoordeling: "
-
-#: ../../mod/ratings.php:101
-msgid "Website: "
-msgstr "Website: "
-
-#: ../../mod/ratings.php:103
-msgid "Description: "
-msgstr "Omschrijving: "
-
-#: ../../mod/events.php:21
-msgid "Calendar entries imported."
-msgstr "Agenda-items geïmporteerd."
-
-#: ../../mod/events.php:23
-msgid "No calendar entries found."
-msgstr "Geen agenda-items gevonden."
-
-#: ../../mod/events.php:100
-msgid "Event can not end before it has started."
-msgstr "Gebeurtenis kan niet eindigen voordat het is begonnen"
-
-#: ../../mod/events.php:102 ../../mod/events.php:111 ../../mod/events.php:131
-msgid "Unable to generate preview."
-msgstr "Niet in staat om voorvertoning te genereren"
-
-#: ../../mod/events.php:109
-msgid "Event title and start time are required."
-msgstr "Titel en begintijd van gebeurtenis zijn vereist."
-
-#: ../../mod/events.php:129 ../../mod/events.php:254
-msgid "Event not found."
-msgstr "Gebeurtenis niet gevonden"
-
-#: ../../mod/events.php:444
-msgid "Edit event title"
-msgstr "Titel bewerken"
-
-#: ../../mod/events.php:444
-msgid "Event title"
-msgstr "Titel"
-
-#: ../../mod/events.php:446
-msgid "Categories (comma-separated list)"
-msgstr "Categorieën (door komma's gescheiden lijst)"
-
-#: ../../mod/events.php:447
-msgid "Edit Category"
-msgstr "Categorie"
-
-#: ../../mod/events.php:447
-msgid "Category"
-msgstr "Categorie"
-
-#: ../../mod/events.php:450
-msgid "Edit start date and time"
-msgstr "Begindatum en -tijd bewerken"
-
-#: ../../mod/events.php:450
-msgid "Start date and time"
-msgstr "Begindatum en -tijd"
-
-#: ../../mod/events.php:451 ../../mod/events.php:454
-msgid "Finish date and time are not known or not relevant"
-msgstr "Einddatum en -tijd zijn niet bekend of niet van toepassing"
-
-#: ../../mod/events.php:453
-msgid "Edit finish date and time"
-msgstr "Einddatum en -tijd bewerken"
-
-#: ../../mod/events.php:453
-msgid "Finish date and time"
-msgstr "Einddatum en -tijd"
-
-#: ../../mod/events.php:455 ../../mod/events.php:456
-msgid "Adjust for viewer timezone"
-msgstr "Aanpassen aan de tijdzone van wie deze gebeurtenis bekijkt"
-
-#: ../../mod/events.php:455
-msgid ""
-"Important for events that happen in a particular place. Not practical for "
-"global holidays."
-msgstr "Belangrijk voor gebeurtenissen die op een bepaalde locatie plaatsvinden. Niet praktisch voor wereldwijde feestdagen."
-
-#: ../../mod/events.php:457
-msgid "Edit Description"
-msgstr "Omschrijving bewerken"
-
-#: ../../mod/events.php:459
-msgid "Edit Location"
-msgstr "Locatie bewerken"
-
-#: ../../mod/events.php:462 ../../mod/events.php:464
-msgid "Share this event"
-msgstr "Deel deze gebeurtenis"
-
-#: ../../mod/events.php:469
-msgid "Advanced Options"
-msgstr "Geavanceerde opties"
-
-#: ../../mod/events.php:603
-msgid "Edit event"
-msgstr "Gebeurtenis bewerken"
-
-#: ../../mod/events.php:605
-msgid "Delete event"
-msgstr "Gebeurtenis verwijderen"
-
-#: ../../mod/events.php:639
-msgid "calendar"
-msgstr "agenda"
-
-#: ../../mod/events.php:699
-msgid "Event removed"
-msgstr "Gebeurtenis verwijderd"
-
-#: ../../mod/events.php:702
-msgid "Failed to remove event"
-msgstr "Verwijderen gebeurtenis mislukt"
-
-#: ../../mod/rbmark.php:90
-msgid "Select a bookmark folder"
-msgstr "Kies een bladwijzermap"
-
-#: ../../mod/rbmark.php:95
-msgid "Save Bookmark"
-msgstr "Bladwijzer opslaan"
-
-#: ../../mod/rbmark.php:96
-msgid "URL of bookmark"
-msgstr "URL van bladwijzer"
-
-#: ../../mod/rbmark.php:101
-msgid "Or enter new bookmark folder name"
-msgstr "Of geef de naam op van een nieuwe bladwijzermap"
-
-#: ../../mod/ffsapi.php:8
-msgid "Share content from Firefox to $Projectname"
-msgstr "Deel webpagina's vanuit Firefox met "
-
-#: ../../mod/ffsapi.php:11
-msgid "Activate the Firefox $Projectname provider"
-msgstr "Activeer de $Projectname-service in Firefox"
-
-#: ../../mod/register.php:45
-msgid "Maximum daily site registrations exceeded. Please try again tomorrow."
-msgstr "Maximum toegestane dagelijkse registraties op deze $Projectname-hub bereikt. Probeer het morgen (UTC) nogmaals."
-
-#: ../../mod/register.php:51
-msgid ""
-"Please indicate acceptance of the Terms of Service. Registration failed."
-msgstr "Registratie mislukt. De gebruiksvoorwaarden dienen wel geaccepteerd te worden."
-
-#: ../../mod/register.php:85
-msgid "Passwords do not match."
-msgstr "Wachtwoorden komen niet met elkaar overeen."
-
-#: ../../mod/register.php:127
-msgid ""
-"Registration successful. Please check your email for validation "
-"instructions."
-msgstr "Registratie geslaagd. Controleer je e-mail voor instructies."
-
-#: ../../mod/register.php:133
-msgid "Your registration is pending approval by the site owner."
-msgstr "Jouw accountregistratie wacht op goedkeuring van de beheerder van deze $Projectname-hub."
-
-#: ../../mod/register.php:136
-msgid "Your registration can not be processed."
-msgstr "Jouw registratie kan niet verwerkt worden."
-
-#: ../../mod/register.php:180
-msgid "Registration on this hub is disabled."
-msgstr "Registreren van nieuwe accounts is op deze hub uitgeschakeld."
-
-#: ../../mod/register.php:189
-msgid "Registration on this hub is by approval only."
-msgstr "Registraties op deze hub moeten eerst worden goedgekeurd."
-
-#: ../../mod/register.php:190
-msgid "<a href=\"pubsites\">Register at another affiliated hub.</a>"
-msgstr "<a href=\"pubsites\">Registreer op een andere hub</a>."
-
-#: ../../mod/register.php:200
-msgid ""
-"This site has exceeded the number of allowed daily account registrations. "
-"Please try again tomorrow."
-msgstr "Deze $Projectname-hub heeft het maximum aantal dagelijks toegestane registraties bereikt. Probeer het morgen (UTC) nogmaals."
-
-#: ../../mod/register.php:211
-msgid "Terms of Service"
-msgstr "Gebruiksvoorwaarden"
-
-#: ../../mod/register.php:217
-#, php-format
-msgid "I accept the %s for this website"
-msgstr "Ik accepteer de %s van deze $Projectname-hub"
-
-#: ../../mod/register.php:219
-#, php-format
-msgid "I am over 13 years of age and accept the %s for this website"
-msgstr "Ik ben 13 jaar of ouder en accepteer de %s van deze $Projectname-hub"
-
-#: ../../mod/register.php:223
-msgid "Your email address"
-msgstr "Jouw e-mailadres"
-
-#: ../../mod/register.php:224
-msgid "Choose a password"
-msgstr "Geef een wachtwoord op"
-
-#: ../../mod/register.php:225
-msgid "Please re-enter your password"
-msgstr "Geef het wachtwoord opnieuw op"
-
-#: ../../mod/register.php:226
-msgid "Please enter your invitation code"
-msgstr "Vul jouw uitnodigingscode in"
-
-#: ../../mod/register.php:232
-msgid "no"
-msgstr "Nee"
-
-#: ../../mod/register.php:232
-msgid "yes"
-msgstr "Ja"
-
-#: ../../mod/register.php:246
-msgid "Membership on this site is by invitation only."
-msgstr "Registreren op deze $Projectname-hub kan alleen op uitnodiging."
-
-#: ../../mod/register.php:258
-msgid "Proceed to create your first channel"
-msgstr "Volgende stap: aanmaken van jouw eerste kanaal"
-
-#: ../../mod/regmod.php:11
-msgid "Please login."
-msgstr "Inloggen."
-
-#: ../../mod/filer.php:48
-msgid "- select -"
-msgstr "- kies map -"
-
-#: ../../mod/notifications.php:26
-msgid "Invalid request identifier."
-msgstr "Ongeldige verzoek identificator (request identifier)"
-
-#: ../../mod/notifications.php:35
-msgid "Discard"
-msgstr "Annuleren"
-
-#: ../../mod/notifications.php:94 ../../mod/notify.php:53
-msgid "No more system notifications."
-msgstr "Geen systeemnotificaties meer."
-
-#: ../../mod/notifications.php:98 ../../mod/notify.php:57
-msgid "System Notifications"
-msgstr "Systeemnotificaties"
-
-#: ../../mod/filestorage.php:82
-msgid "Permission Denied."
-msgstr "Toegang geweigerd"
-
-#: ../../mod/filestorage.php:98
-msgid "File not found."
-msgstr "Bestand niet gevonden."
-
-#: ../../mod/filestorage.php:141
-msgid "Edit file permissions"
-msgstr "Bestandsrechten bewerken"
-
-#: ../../mod/filestorage.php:150
-msgid "Set/edit permissions"
-msgstr "Rechten instellen/bewerken"
-
-#: ../../mod/filestorage.php:151
-msgid "Include all files and sub folders"
-msgstr "Toepassen op alle bestanden en submappen"
-
-#: ../../mod/filestorage.php:152
-msgid "Return to file list"
-msgstr "Terugkeren naar bestandlijst "
-
-#: ../../mod/filestorage.php:154
-msgid "Copy/paste this code to attach file to a post"
-msgstr "Kopieer/plak deze code om het bestand aan een bericht te koppelen"
-
-#: ../../mod/filestorage.php:155
-msgid "Copy/paste this URL to link file from a web page"
-msgstr "Kopieer/plak deze URL om het bestand aan een externe webpagina te koppelen"
-
-#: ../../mod/filestorage.php:157
-msgid "Share this file"
-msgstr "Dit bestand delen"
-
-#: ../../mod/filestorage.php:158
-msgid "Show URL to this file"
-msgstr "Toon URL van dit bestand"
-
-#: ../../mod/filestorage.php:159
-msgid "Notify your contacts about this file"
-msgstr "Jouw connecties over dit bestand berichten"
-
-#: ../../mod/removeaccount.php:30
-msgid ""
-"Account removals are not allowed within 48 hours of changing the account "
-"password."
-msgstr "Het verwijderen van een account is niet toegestaan binnen 48 uur nadat het wachtwoord is veranderd."
-
-#: ../../mod/removeaccount.php:57
-msgid "Remove This Account"
-msgstr "Verwijder dit account"
-
-#: ../../mod/removeaccount.php:58 ../../mod/removeme.php:58
-msgid "WARNING: "
-msgstr "WAARSCHUWING: "
-
-#: ../../mod/removeaccount.php:58
-msgid ""
-"This account and all its channels will be completely removed from the "
-"network. "
-msgstr "Dit account en al zijn kanalen worden volledig uit het $Projectname-netwerk verwijderd."
-
-#: ../../mod/removeaccount.php:58 ../../mod/removeme.php:58
-msgid "This action is permanent and can not be undone!"
-msgstr "Deze handeling is van permanente aard en kan niet meer worden teruggedraaid!"
-
-#: ../../mod/removeaccount.php:59 ../../mod/removeme.php:59
-msgid "Please enter your password for verification:"
-msgstr "Vul je wachtwoord in ter verificatie:"
-
-#: ../../mod/removeaccount.php:60
-msgid ""
-"Remove this account, all its channels and all its channel clones from the "
-"network"
-msgstr "Dit account, al zijn kanalen en alle klonen van zijn kanalen uit het $Projectname-netwerk verwijderen"
+#: ../../include/nav.php:82 ../../include/nav.php:113 ../../boot.php:1601
+msgid "Logout"
+msgstr "Uitloggen"
-#: ../../mod/removeaccount.php:60
-msgid ""
-"By default only the instances of the channels located on this hub will be "
-"removed from the network"
-msgstr "Standaard worden alleen de kanalen die zich op deze hub bevinden uit het $Projectname-netwerk verwijderd"
+#: ../../include/nav.php:82 ../../include/nav.php:113
+msgid "End this session"
+msgstr "Beëindig deze sessie"
-#: ../../mod/removeaccount.php:61 ../../mod/settings.php:712
-msgid "Remove Account"
-msgstr "Account verwijderen"
+#: ../../include/nav.php:85 ../../include/nav.php:144
+msgid "Home"
+msgstr "Home"
-#: ../../mod/follow.php:27
-msgid "Channel added."
-msgstr "Kanaal toegevoegd."
+#: ../../include/nav.php:85
+msgid "Your posts and conversations"
+msgstr "Jouw kanaal"
-#: ../../mod/removeme.php:29
-msgid ""
-"Channel removals are not allowed within 48 hours of changing the account "
-"password."
-msgstr "Het verwijderen van een kanaal is niet toegestaan binnen 48 uur nadat het wachtwoord van het account is veranderd."
+#: ../../include/nav.php:86
+msgid "Your profile page"
+msgstr "Jouw profielpagina"
-#: ../../mod/removeme.php:57
-msgid "Remove This Channel"
-msgstr "Verwijder dit kanaal"
+#: ../../include/nav.php:88
+msgid "Manage/Edit profiles"
+msgstr "Beheer/wijzig profielen"
-#: ../../mod/removeme.php:58
-msgid "This channel will be completely removed from the network. "
-msgstr "Dit kanaal wordt volledig uit het $Projectname-netwerk verwijderd."
+#: ../../include/nav.php:90
+msgid "Edit your profile"
+msgstr "Jouw profiel bewerken"
-#: ../../mod/removeme.php:60
-msgid "Remove this channel and all its clones from the network"
-msgstr "Dit kanaal en alle klonen hiervan uit het $Projectname-netwerk verwijderen"
+#: ../../include/nav.php:92
+msgid "Your photos"
+msgstr "Jouw foto's"
-#: ../../mod/removeme.php:60
-msgid ""
-"By default only the instance of the channel located on this hub will be "
-"removed from the network"
-msgstr "Standaard wordt alleen het kanaal dat zich op deze hub bevindt uit het $Projectname-netwerk verwijderd"
+#: ../../include/nav.php:93
+msgid "Your files"
+msgstr "Jouw bestanden"
-#: ../../mod/removeme.php:61 ../../mod/settings.php:1131
-msgid "Remove Channel"
-msgstr "Kanaal verwijderen"
+#: ../../include/nav.php:96
+msgid "Your chatrooms"
+msgstr "Jouw chatkanalen"
-#: ../../mod/fsuggest.php:20 ../../mod/fsuggest.php:92
-msgid "Contact not found."
-msgstr "Contact niet gevonden"
+#: ../../include/nav.php:102
+msgid "Your bookmarks"
+msgstr "Jouw bladwijzers"
-#: ../../mod/fsuggest.php:63
-msgid "Friend suggestion sent."
-msgstr "Kanaalvoorstel verzonden."
+#: ../../include/nav.php:106
+msgid "Your webpages"
+msgstr "Jouw webpagina's"
-#: ../../mod/fsuggest.php:97
-msgid "Suggest Friends"
-msgstr "Kanalen voorstellen"
+#: ../../include/nav.php:110
+msgid "Sign in"
+msgstr "Inloggen"
-#: ../../mod/fsuggest.php:99
+#: ../../include/nav.php:127
#, php-format
-msgid "Suggest a friend for %s"
-msgstr "Stel een kanaal voor aan %s"
-
-#: ../../mod/rmagic.php:40
-msgid ""
-"We encountered a problem while logging in with the OpenID you provided. "
-"Please check the correct spelling of the ID."
-msgstr "We hebben een probleem ontdekt tijdens het inloggen met de OpenID die je hebt verstrekt. Controleer de ID op typefouten."
-
-#: ../../mod/rmagic.php:40
-msgid "The error message was:"
-msgstr "Het foutbericht was:"
-
-#: ../../mod/rmagic.php:44
-msgid "Authentication failed."
-msgstr "Authenticatie mislukt."
+msgid "%s - click to logout"
+msgstr "%s - klik om uit te loggen"
-#: ../../mod/rmagic.php:84
-msgid "Remote Authentication"
+#: ../../include/nav.php:130
+msgid "Remote authentication"
msgstr "Authenticatie op afstand"
-#: ../../mod/rmagic.php:85
-msgid "Enter your channel address (e.g. channel@example.com)"
-msgstr "Vul jouw kanaaladres in (bijv. channel@example.com)"
-
-#: ../../mod/rmagic.php:86
-msgid "Authenticate"
-msgstr "Authenticeren"
-
-#: ../../mod/help.php:163
-msgid "Documentation Search"
-msgstr "Zoek documentatie"
-
-#: ../../mod/help.php:204 ../../mod/help.php:210 ../../mod/help.php:216
-msgid "Help:"
-msgstr "Hulp:"
-
-#: ../../mod/help.php:257
-msgid "$Projectname Documentation"
-msgstr "$Projectname-documentatie"
-
-#: ../../mod/group.php:20
-msgid "Privacy group created."
-msgstr "Privacygroep aangemaakt"
-
-#: ../../mod/group.php:26
-msgid "Could not create privacy group."
-msgstr "Kon privacygroep niet aanmaken"
-
-#: ../../mod/group.php:54
-msgid "Privacy group updated."
-msgstr "Privacygroep bijgewerkt"
-
-#: ../../mod/group.php:86
-msgid "Create a group of channels."
-msgstr "Privacygroep met kanalen aanmaken"
-
-#: ../../mod/group.php:87 ../../mod/group.php:180
-msgid "Privacy group name: "
-msgstr "Naam privacygroep: "
-
-#: ../../mod/group.php:89 ../../mod/group.php:183
-msgid "Members are visible to other channels"
-msgstr "Kanalen in deze privacygroep zijn zichtbaar voor andere kanalen"
-
-#: ../../mod/group.php:107
-msgid "Privacy group removed."
-msgstr "Privacygroep verwijderd."
-
-#: ../../mod/group.php:109
-msgid "Unable to remove privacy group."
-msgstr "Verwijderen privacygroep mislukt"
-
-#: ../../mod/group.php:179
-msgid "Privacy group editor"
-msgstr "Privacygroep bewerken"
-
-#: ../../mod/group.php:193
-msgid "Members"
-msgstr "Kanalen"
-
-#: ../../mod/group.php:195
-msgid "All Connected Channels"
-msgstr "Alle kanaalconnecties"
-
-#: ../../mod/group.php:227
-msgid "Click on a channel to add or remove."
-msgstr "Klik op een kanaal om deze toe te voegen of te verwijderen."
-
-#: ../../mod/search.php:212
-#, php-format
-msgid "Items tagged with: %s"
-msgstr "Items getagd met %s"
-
-#: ../../mod/search.php:214
-#, php-format
-msgid "Search results for: %s"
-msgstr "Zoekresultaten voor %s"
-
-#: ../../mod/home.php:57 ../../mod/home.php:65 ../../mod/siteinfo.php:61
-msgid "$Projectname"
-msgstr "$Projectname"
-
-#: ../../mod/home.php:75
-#, php-format
-msgid "Welcome to %s"
-msgstr "Welkom op %s"
-
-#: ../../mod/service_limits.php:19
-msgid "No service class restrictions found."
-msgstr "Geen abonnementsbeperkingen gevonden."
-
-#: ../../mod/settings.php:76
-msgid "Name is required"
-msgstr "Naam is vereist"
-
-#: ../../mod/settings.php:80
-msgid "Key and Secret are required"
-msgstr "Key en secret zijn vereist"
-
-#: ../../mod/settings.php:232
-msgid "Not valid email."
-msgstr "Geen geldig e-mailadres."
-
-#: ../../mod/settings.php:235
-msgid "Protected email address. Cannot change to that email."
-msgstr "Beschermd e-mailadres. Kan dat e-mailadres niet gebruiken."
-
-#: ../../mod/settings.php:244
-msgid "System failure storing new email. Please try again."
-msgstr "Systeemfout opslaan van nieuwe e-mail. Probeer het nog een keer."
-
-#: ../../mod/settings.php:261
-msgid "Password verification failed."
-msgstr "Wachtwoordverificatie mislukt"
-
-#: ../../mod/settings.php:268
-msgid "Passwords do not match. Password unchanged."
-msgstr "Wachtwoorden komen niet overeen. Wachtwoord onveranderd."
-
-#: ../../mod/settings.php:272
-msgid "Empty passwords are not allowed. Password unchanged."
-msgstr "Lege wachtwoorden zijn niet toegestaan. Wachtwoord onveranderd."
-
-#: ../../mod/settings.php:286
-msgid "Password changed."
-msgstr "Wachtwoord veranderd."
-
-#: ../../mod/settings.php:288
-msgid "Password update failed. Please try again."
-msgstr "Bijwerken wachtwoord mislukt. Probeer opnieuw."
-
-#: ../../mod/settings.php:532
-msgid "Settings updated."
-msgstr "Instellingen bijgewerkt."
-
-#: ../../mod/settings.php:596 ../../mod/settings.php:622
-#: ../../mod/settings.php:658
-msgid "Add application"
-msgstr "Applicatie toevoegen"
-
-#: ../../mod/settings.php:599
-msgid "Name of application"
-msgstr "Naam van applicatie"
-
-#: ../../mod/settings.php:600 ../../mod/settings.php:626
-msgid "Consumer Key"
-msgstr "Consumer key"
-
-#: ../../mod/settings.php:600 ../../mod/settings.php:601
-msgid "Automatically generated - change if desired. Max length 20"
-msgstr "Automatische gegenereerd - verander wanneer gewenst. Maximale lengte is 20"
-
-#: ../../mod/settings.php:601 ../../mod/settings.php:627
-msgid "Consumer Secret"
-msgstr "Consumer secret"
-
-#: ../../mod/settings.php:602 ../../mod/settings.php:628
-msgid "Redirect"
-msgstr "Redirect/doorverwijzing"
-
-#: ../../mod/settings.php:602
-msgid ""
-"Redirect URI - leave blank unless your application specifically requires "
-"this"
-msgstr "URI voor redirect - laat leeg, behalve wanneer de applicatie dit vereist"
-
-#: ../../mod/settings.php:603 ../../mod/settings.php:629
-msgid "Icon url"
-msgstr "Pictogram-URL"
-
-#: ../../mod/settings.php:603
-msgid "Optional"
-msgstr "Optioneel"
-
-#: ../../mod/settings.php:614
-msgid "Application not found."
-msgstr "Applicatie niet gevonden."
-
-#: ../../mod/settings.php:657
-msgid "Connected Apps"
-msgstr "Verbonden applicaties"
-
-#: ../../mod/settings.php:661
-msgid "Client key starts with"
-msgstr "Client key begint met"
-
-#: ../../mod/settings.php:662
-msgid "No name"
-msgstr "Geen naam"
-
-#: ../../mod/settings.php:663
-msgid "Remove authorization"
-msgstr "Autorisatie verwijderen"
-
-#: ../../mod/settings.php:676
-msgid "No feature settings configured"
-msgstr "Geen plugin-instellingen aanwezig"
-
-#: ../../mod/settings.php:683
-msgid "Feature/Addon Settings"
-msgstr "Plugin-instellingen"
-
-#: ../../mod/settings.php:706
-msgid "Account Settings"
-msgstr "Account-instellingen"
-
-#: ../../mod/settings.php:707
-msgid "Current Password"
-msgstr "Huidig wachtwoord"
-
-#: ../../mod/settings.php:708
-msgid "Enter New Password"
-msgstr "Nieuw wachtwoord invoeren"
-
-#: ../../mod/settings.php:709
-msgid "Confirm New Password"
-msgstr "Nieuw wachtwoord bevestigen"
-
-#: ../../mod/settings.php:709
-msgid "Leave password fields blank unless changing"
-msgstr "Laat de wachtwoordvelden leeg, behalve wanneer je deze wil veranderen"
-
-#: ../../mod/settings.php:711 ../../mod/settings.php:1048
-msgid "Email Address:"
-msgstr "E-mailadres:"
-
-#: ../../mod/settings.php:713
-msgid "Remove this account including all its channels"
-msgstr "Dit account en al zijn kanalen verwijderen"
-
-#: ../../mod/settings.php:736
-msgid "Additional Features"
-msgstr "Extra functies"
-
-#: ../../mod/settings.php:760
-msgid "Connector Settings"
-msgstr "Instellingen externe koppelingen"
-
-#: ../../mod/settings.php:799
-msgid "No special theme for mobile devices"
-msgstr "Geen speciaal thema voor mobiele apparaten"
-
-#: ../../mod/settings.php:802
-#, php-format
-msgid "%s - (Experimental)"
-msgstr "%s - (experimenteel)"
-
-#: ../../mod/settings.php:844
-msgid "Display Settings"
-msgstr "Weergave-instellingen"
-
-#: ../../mod/settings.php:845
-msgid "Theme Settings"
-msgstr "Thema-instellingen"
-
-#: ../../mod/settings.php:846
-msgid "Custom Theme Settings"
-msgstr "Handmatige thema-instellingen"
-
-#: ../../mod/settings.php:847
-msgid "Content Settings"
-msgstr "Inhoudsinstellingen"
-
-#: ../../mod/settings.php:853
-msgid "Display Theme:"
-msgstr "Gebruik thema:"
-
-#: ../../mod/settings.php:854
-msgid "Mobile Theme:"
-msgstr "Mobiel thema:"
-
-#: ../../mod/settings.php:855
-msgid "Preload images before rendering the page"
-msgstr "Afbeeldingen laden voordat de pagina wordt weergegeven"
-
-#: ../../mod/settings.php:855
-msgid ""
-"The subjective page load time will be longer but the page will be ready when"
-" displayed"
-msgstr "De laadtijd van een pagina lijkt langer, maar de pagina is wel meteen helemaal geladen wanneer deze wordt weergeven"
-
-#: ../../mod/settings.php:856
-msgid "Enable user zoom on mobile devices"
-msgstr "Inzoomen op smartphones en tablets toestaan"
-
-#: ../../mod/settings.php:857
-msgid "Update browser every xx seconds"
-msgstr "Ververs de webbrowser om de zoveel seconde"
-
-#: ../../mod/settings.php:857
-msgid "Minimum of 10 seconds, no maximum"
-msgstr "Minimaal 10 seconde, geen maximum"
-
-#: ../../mod/settings.php:858
-msgid "Maximum number of conversations to load at any time:"
-msgstr "Maximaal aantal conversaties die per keer geladen worden:"
-
-#: ../../mod/settings.php:858
-msgid "Maximum of 100 items"
-msgstr "Maximaal 100 conversaties"
-
-#: ../../mod/settings.php:859
-msgid "Show emoticons (smilies) as images"
-msgstr "Toon emoticons (smilies) als afbeeldingen"
-
-#: ../../mod/settings.php:860
-msgid "Link post titles to source"
-msgstr "Berichtkoppen naar originele locatie linken"
-
-#: ../../mod/settings.php:861
-msgid "System Page Layout Editor - (advanced)"
-msgstr "Lay-out bewerken van systeempagina's (geavanceerd)"
-
-#: ../../mod/settings.php:864
-msgid "Use blog/list mode on channel page"
-msgstr "Gebruik blog/lijst-modus op kanaalpagina"
-
-#: ../../mod/settings.php:864 ../../mod/settings.php:865
-msgid "(comments displayed separately)"
-msgstr "(reacties worden afzonderlijk weergeven)"
-
-#: ../../mod/settings.php:865
-msgid "Use blog/list mode on grid page"
-msgstr "Gebruik blog/lijst-modus op gridpagina"
-
-#: ../../mod/settings.php:866
-msgid "Channel page max height of content (in pixels)"
-msgstr "Maximale hoogte berichtinhoud op kanaalpagina (in pixels)"
-
-#: ../../mod/settings.php:866 ../../mod/settings.php:867
-msgid "click to expand content exceeding this height"
-msgstr "klik om inhoud uit te klappen die deze hoogte overschrijdt"
-
-#: ../../mod/settings.php:867
-msgid "Grid page max height of content (in pixels)"
-msgstr "Maximale hoogte berichtinhoud op gridpagina (in pixels)"
-
-#: ../../mod/settings.php:901
-msgid "Nobody except yourself"
-msgstr "Niemand, behalve jezelf"
-
-#: ../../mod/settings.php:902
-msgid "Only those you specifically allow"
-msgstr "Alleen connecties met uitdrukkelijke toestemming"
-
-#: ../../mod/settings.php:903
-msgid "Approved connections"
-msgstr "Geaccepteerde connecties"
-
-#: ../../mod/settings.php:904
-msgid "Any connections"
-msgstr "Alle connecties"
-
-#: ../../mod/settings.php:905
-msgid "Anybody on this website"
-msgstr "Iedereen op deze hub"
-
-#: ../../mod/settings.php:906
-msgid "Anybody in this network"
-msgstr "Iedereen in dit netwerk"
-
-#: ../../mod/settings.php:907
-msgid "Anybody authenticated"
-msgstr "Geauthenticeerd"
-
-#: ../../mod/settings.php:908
-msgid "Anybody on the internet"
-msgstr "Iedereen op het internet"
-
-#: ../../mod/settings.php:983
-msgid "Publish your default profile in the network directory"
-msgstr "Publiceer je standaardprofiel in de kanalengids"
-
-#: ../../mod/settings.php:988
-msgid "Allow us to suggest you as a potential friend to new members?"
-msgstr "Sta ons toe om jouw kanaal als mogelijke connectie voor te stellen aan nieuwe kanalen"
-
-#: ../../mod/settings.php:997
-msgid "Your channel address is"
-msgstr "Jouw kanaaladres is"
-
-#: ../../mod/settings.php:1039
-msgid "Channel Settings"
-msgstr "Kanaal-instellingen"
-
-#: ../../mod/settings.php:1046
-msgid "Basic Settings"
-msgstr "Basis-instellingen"
-
-#: ../../mod/settings.php:1049
-msgid "Your Timezone:"
-msgstr "Jouw tijdzone:"
-
-#: ../../mod/settings.php:1050
-msgid "Default Post Location:"
-msgstr "Standaardlocatie bericht:"
-
-#: ../../mod/settings.php:1050
-msgid "Geographical location to display on your posts"
-msgstr "Geografische locatie die bij het bericht moet worden vermeld"
-
-#: ../../mod/settings.php:1051
-msgid "Use Browser Location:"
-msgstr "Locatie van webbrowser gebruiken:"
-
-#: ../../mod/settings.php:1053
-msgid "Adult Content"
-msgstr "Inhoud voor volwassenen"
-
-#: ../../mod/settings.php:1053
-msgid ""
-"This channel frequently or regularly publishes adult content. (Please tag "
-"any adult material and/or nudity with #NSFW)"
-msgstr "Dit kanaal publiceert regelmatig of vaak materiaal dat alleen geschikt is voor volwassenen. (Gebruik de tag #NSFW in berichten met een seksueel getinte inhoud of ander voor minderjarigen ongeschikt materiaal)"
-
-#: ../../mod/settings.php:1055
-msgid "Security and Privacy Settings"
-msgstr "Veiligheids- en privacy-instellingen"
-
-#: ../../mod/settings.php:1058
-msgid "Your permissions are already configured. Click to view/adjust"
-msgstr "Jouw permissies zijn al ingesteld. Klik om ze te bekijken of aan te passen."
-
-#: ../../mod/settings.php:1060
-msgid "Hide my online presence"
-msgstr "Verberg mijn aanwezigheid"
-
-#: ../../mod/settings.php:1060
-msgid "Prevents displaying in your profile that you are online"
-msgstr "Voorkomt dat op je kanaalpagina te zien valt dat je momenteel op $Projectname aanwezig bent"
-
-#: ../../mod/settings.php:1062
-msgid "Simple Privacy Settings:"
-msgstr "Eenvoudige privacy-instellingen:"
-
-#: ../../mod/settings.php:1063
-msgid ""
-"Very Public - <em>extremely permissive (should be used with caution)</em>"
-msgstr "Zeer openbaar <em>(kanaal staat volledig open - moet met grote zorgvuldigheid gebruikt worden)</em>"
-
-#: ../../mod/settings.php:1064
-msgid ""
-"Typical - <em>default public, privacy when desired (similar to social "
-"network permissions but with improved privacy)</em>"
-msgstr "Normaal <em>(standaard openbaar, maar privacy wanneer noodzakelijk - vergelijkbaar met die van sociale netwerken, maar met verbeterde privacy)</em>"
-
-#: ../../mod/settings.php:1065
-msgid "Private - <em>default private, never open or public</em>"
-msgstr "Privé <em>(standaard privé en nooit openbaar)</em>"
-
-#: ../../mod/settings.php:1066
-msgid "Blocked - <em>default blocked to/from everybody</em>"
-msgstr "Geblokkeerd <em>(standaard geblokkeerd naar/van iedereen)</em>"
-
-#: ../../mod/settings.php:1068
-msgid "Allow others to tag your posts"
-msgstr "Anderen toestaan om je berichten te taggen"
-
-#: ../../mod/settings.php:1068
-msgid ""
-"Often used by the community to retro-actively flag inappropriate content"
-msgstr "Vaak in groepen/forums gebruikt om met terugwerkende kracht ongepast materiaal te markeren"
-
-#: ../../mod/settings.php:1070
-msgid "Advanced Privacy Settings"
-msgstr "Geavanceerde privacy-instellingen"
-
-#: ../../mod/settings.php:1072
-msgid "Expire other channel content after this many days"
-msgstr "Inhoud van andere kanalen na zoveel aantal dagen laten verlopen:"
-
-#: ../../mod/settings.php:1072
-#, php-format
-msgid ""
-"0 or blank to use the website limit. The website expires after %d days."
-msgstr "0 of leeg om het standaard aantal dagen van deze hub te gebruiken. Deze hub laat de inhoud van andere kanalen na %d dagen verlopen."
-
-#: ../../mod/settings.php:1073
-msgid "Maximum Friend Requests/Day:"
-msgstr "Maximum aantal connectieverzoeken per dag:"
-
-#: ../../mod/settings.php:1073
-msgid "May reduce spam activity"
-msgstr "Kan eventuele spam verminderen"
-
-#: ../../mod/settings.php:1074
-msgid "Default Post Permissions"
-msgstr "Standaard permissies voor nieuwe berichten"
-
-#: ../../mod/settings.php:1079
-msgid "Channel permissions category:"
-msgstr "Kanaaltype en -permissies:"
-
-#: ../../mod/settings.php:1085
-msgid "Maximum private messages per day from unknown people:"
-msgstr "Maximum aantal privé-berichten per dag van onbekende personen:"
-
-#: ../../mod/settings.php:1085
-msgid "Useful to reduce spamming"
-msgstr "Kan eventuele spam verminderen"
-
-#: ../../mod/settings.php:1088
-msgid "Notification Settings"
-msgstr "Notificatie-instellingen"
-
-#: ../../mod/settings.php:1089
-msgid "By default post a status message when:"
-msgstr "Plaats automatisch een statusbericht wanneer:"
-
-#: ../../mod/settings.php:1090
-msgid "accepting a friend request"
-msgstr "Een connectieverzoek wordt geaccepteerd"
-
-#: ../../mod/settings.php:1091
-msgid "joining a forum/community"
-msgstr "Je lid wordt van een forum/groep"
-
-#: ../../mod/settings.php:1092
-msgid "making an <em>interesting</em> profile change"
-msgstr "Er sprake is van een <em>interessante</em> profielwijziging"
-
-#: ../../mod/settings.php:1093
-msgid "Send a notification email when:"
-msgstr "Verzend een notificatie per e-mail wanneer:"
-
-#: ../../mod/settings.php:1094
-msgid "You receive a connection request"
-msgstr "Je een connectieverzoek ontvangt"
-
-#: ../../mod/settings.php:1095
-msgid "Your connections are confirmed"
-msgstr "Jouw connecties zijn bevestigd"
-
-#: ../../mod/settings.php:1096
-msgid "Someone writes on your profile wall"
-msgstr "Iemand iets op jouw kanaal heeft geschreven"
-
-#: ../../mod/settings.php:1097
-msgid "Someone writes a followup comment"
-msgstr "Iemand een reactie schrijft"
-
-#: ../../mod/settings.php:1098
-msgid "You receive a private message"
-msgstr "Je een privé-bericht ontvangt"
-
-#: ../../mod/settings.php:1099
-msgid "You receive a friend suggestion"
-msgstr "Je een kanaalvoorstel ontvangt"
-
-#: ../../mod/settings.php:1100
-msgid "You are tagged in a post"
-msgstr "Je expliciet in een bericht bent genoemd"
-
-#: ../../mod/settings.php:1101
-msgid "You are poked/prodded/etc. in a post"
-msgstr "Je bent in een bericht aangestoten/gepord/etc."
-
-#: ../../mod/settings.php:1104
-msgid "Show visual notifications including:"
-msgstr "Toon de volgende zichtbare notificaties:"
-
-#: ../../mod/settings.php:1106
-msgid "Unseen grid activity"
-msgstr "Niet bekeken grid-activiteit"
-
-#: ../../mod/settings.php:1107
-msgid "Unseen channel activity"
-msgstr "Niet bekeken kanaal-activiteit"
-
-#: ../../mod/settings.php:1108
-msgid "Unseen private messages"
-msgstr "Niet bekeken privéberichten"
-
-#: ../../mod/settings.php:1108 ../../mod/settings.php:1113
-#: ../../mod/settings.php:1114 ../../mod/settings.php:1115
-msgid "Recommended"
-msgstr "Aanbevolen"
-
-#: ../../mod/settings.php:1109
-msgid "Upcoming events"
-msgstr "Aankomende gebeurtenissen"
-
-#: ../../mod/settings.php:1110
-msgid "Events today"
-msgstr "Gebeurtenissen van vandaag"
-
-#: ../../mod/settings.php:1111
-msgid "Upcoming birthdays"
-msgstr "Aankomende verjaardagen"
-
-#: ../../mod/settings.php:1111
-msgid "Not available in all themes"
-msgstr "Niet in alle thema's beschikbaar"
-
-#: ../../mod/settings.php:1112
-msgid "System (personal) notifications"
-msgstr "(Persoonlijke) systeemnotificaties"
-
-#: ../../mod/settings.php:1113
-msgid "System info messages"
-msgstr "Systeemmededelingen"
-
-#: ../../mod/settings.php:1114
-msgid "System critical alerts"
-msgstr "Kritische systeemwaarschuwingen"
-
-#: ../../mod/settings.php:1115
-msgid "New connections"
-msgstr "Nieuwe connecties"
-
-#: ../../mod/settings.php:1116
-msgid "System Registrations"
-msgstr "Nieuwe accountregistraties op deze hub"
-
-#: ../../mod/settings.php:1117
-msgid ""
-"Also show new wall posts, private messages and connections under Notices"
-msgstr "Toon tevens nieuwe kanaalberichten, privéberichten en connecties onder Notificaties"
-
-#: ../../mod/settings.php:1119
-msgid "Notify me of events this many days in advance"
-msgstr "Herinner mij zoveel dagen van te voren aan gebeurtenissen"
-
-#: ../../mod/settings.php:1119
-msgid "Must be greater than 0"
-msgstr "Moet hoger dan 0 zijn"
-
-#: ../../mod/settings.php:1121
-msgid "Advanced Account/Page Type Settings"
-msgstr "Instellingen geavanceerd account/paginatype"
-
-#: ../../mod/settings.php:1122
-msgid "Change the behaviour of this account for special situations"
-msgstr "Verander het gedrag van dit account voor speciale situaties"
-
-#: ../../mod/settings.php:1125
-msgid ""
-"Please enable expert mode (in <a href=\"settings/features\">Settings > "
-"Additional features</a>) to adjust!"
-msgstr "Schakel de expertmodus in (in <a href=\"settings/features\">Instellingen > Extra functies</a>) om aan te kunnen passen!"
-
-#: ../../mod/settings.php:1126
-msgid "Miscellaneous Settings"
-msgstr "Diverse instellingen"
-
-#: ../../mod/settings.php:1127
-msgid "Default photo upload folder"
-msgstr "Standaard fotoalbum voor uploads"
-
-#: ../../mod/settings.php:1127 ../../mod/settings.php:1128
-msgid "%Y - current year, %m - current month"
-msgstr "%Y - dit jaar, %m - deze maand"
-
-#: ../../mod/settings.php:1128
-msgid "Default file upload folder"
-msgstr "Standaard bestandsmap voor uploads"
-
-#: ../../mod/settings.php:1130
-msgid "Personal menu to display in your channel pages"
-msgstr "Persoonlijk menu om op je kanaalpagina's weer te geven"
-
-#: ../../mod/settings.php:1132
-msgid "Remove this channel."
-msgstr "Verwijder dit kanaal."
-
-#: ../../mod/settings.php:1133
-msgid "Firefox Share $Projectname provider"
-msgstr "$Projectname-service voor Firefox Share"
-
-#: ../../mod/settings.php:1134
-msgid "Start calendar week on monday"
-msgstr "Begin in de agenda de week op maandag"
-
-#: ../../mod/id.php:11
-msgid "First Name"
-msgstr "Voornaam"
-
-#: ../../mod/id.php:12
-msgid "Last Name"
-msgstr "Achternaam"
-
-#: ../../mod/id.php:13
-msgid "Nickname"
-msgstr "Bijnaam"
-
-#: ../../mod/id.php:14
-msgid "Full Name"
-msgstr "Volledige naam"
-
-#: ../../mod/id.php:20
-msgid "Profile Photo 16px"
-msgstr "Profielfoto 16px"
-
-#: ../../mod/id.php:21
-msgid "Profile Photo 32px"
-msgstr "Profielfoto 32px"
-
-#: ../../mod/id.php:22
-msgid "Profile Photo 48px"
-msgstr "Profielfoto 48px"
-
-#: ../../mod/id.php:23
-msgid "Profile Photo 64px"
-msgstr "Profielfoto 64px"
-
-#: ../../mod/id.php:24
-msgid "Profile Photo 80px"
-msgstr "Profielfoto 80px"
-
-#: ../../mod/id.php:25
-msgid "Profile Photo 128px"
-msgstr "Profielfoto 128px"
-
-#: ../../mod/id.php:26
-msgid "Timezone"
-msgstr "Tijdzone"
-
-#: ../../mod/id.php:29
-msgid "Birth Year"
-msgstr "Geboortejaar"
-
-#: ../../mod/id.php:30
-msgid "Birth Month"
-msgstr "Geboortemaand"
-
-#: ../../mod/id.php:31
-msgid "Birth Day"
-msgstr "Geboortedag"
-
-#: ../../mod/id.php:32
-msgid "Birthdate"
-msgstr "Geboortedatum"
-
-#: ../../mod/setup.php:197
-msgid "$Projectname Server - Setup"
-msgstr "$Projectname Hub - Setup"
-
-#: ../../mod/setup.php:201
-msgid "Could not connect to database."
-msgstr "Could not connect to database."
-
-#: ../../mod/setup.php:205
-msgid ""
-"Could not connect to specified site URL. Possible SSL certificate or DNS "
-"issue."
-msgstr "Could not connect to specified hub URL. Possible SSL certificate or DNS issue."
-
-#: ../../mod/setup.php:212
-msgid "Could not create table."
-msgstr "Could not create table."
-
-#: ../../mod/setup.php:217
-msgid "Your site database has been installed."
-msgstr "Your hub database has been installed."
-
-#: ../../mod/setup.php:221
-msgid ""
-"You may need to import the file \"install/schema_xxx.sql\" manually using a "
-"database client."
-msgstr "You may need to import the file \"install/schema_xxx.sql\" manually using a database client."
-
-#: ../../mod/setup.php:222 ../../mod/setup.php:290 ../../mod/setup.php:740
-msgid "Please see the file \"install/INSTALL.txt\"."
-msgstr "Please see the file \"install/INSTALL.txt\"."
-
-#: ../../mod/setup.php:287
-msgid "System check"
-msgstr "System check"
-
-#: ../../mod/setup.php:292
-msgid "Check again"
-msgstr "Check again"
-
-#: ../../mod/setup.php:314
-msgid "Database connection"
-msgstr "Database connection"
-
-#: ../../mod/setup.php:315
-msgid ""
-"In order to install $Projectname we need to know how to connect to your "
-"database."
-msgstr "In order to install $Projectname we need to know how to connect to your database."
-
-#: ../../mod/setup.php:316
-msgid ""
-"Please contact your hosting provider or site administrator if you have "
-"questions about these settings."
-msgstr "Please contact your hosting provider or server administrator if you have questions about these settings."
-
-#: ../../mod/setup.php:317
-msgid ""
-"The database you specify below should already exist. If it does not, please "
-"create it before continuing."
-msgstr "The database you specify below should already exist. If it does not, please create it before continuing."
-
-#: ../../mod/setup.php:321
-msgid "Database Server Name"
-msgstr "Database Server Name"
-
-#: ../../mod/setup.php:321
-msgid "Default is 127.0.0.1"
-msgstr "Default is 127.0.0.1"
-
-#: ../../mod/setup.php:322
-msgid "Database Port"
-msgstr "Database Port"
-
-#: ../../mod/setup.php:322
-msgid "Communication port number - use 0 for default"
-msgstr "Communication port number - use 0 for default"
-
-#: ../../mod/setup.php:323
-msgid "Database Login Name"
-msgstr "Database Login Name"
-
-#: ../../mod/setup.php:324
-msgid "Database Login Password"
-msgstr "Database Login Password"
-
-#: ../../mod/setup.php:325
-msgid "Database Name"
-msgstr "Database Name"
-
-#: ../../mod/setup.php:326
-msgid "Database Type"
-msgstr "Database Type"
-
-#: ../../mod/setup.php:328 ../../mod/setup.php:368
-msgid "Site administrator email address"
-msgstr "Hub administrator email address"
-
-#: ../../mod/setup.php:328 ../../mod/setup.php:368
-msgid ""
-"Your account email address must match this in order to use the web admin "
-"panel."
-msgstr "Your account email address must match this in order to use the web admin panel."
-
-#: ../../mod/setup.php:329 ../../mod/setup.php:370
-msgid "Website URL"
-msgstr "Hub URL"
-
-#: ../../mod/setup.php:329 ../../mod/setup.php:370
-msgid "Please use SSL (https) URL if available."
-msgstr "Please use SSL (https) URL if available."
-
-#: ../../mod/setup.php:330 ../../mod/setup.php:373
-msgid "Please select a default timezone for your website"
-msgstr "Please select a default timezone for your hub"
-
-#: ../../mod/setup.php:357
-msgid "Site settings"
-msgstr "Hub settings"
-
-#: ../../mod/setup.php:371
-msgid "Enable $Projectname <strong>advanced</strong> features?"
-msgstr "Enable $Projectname <strong>advanced</strong> features?"
-
-#: ../../mod/setup.php:371
-msgid ""
-"Some advanced features, while useful - may be best suited for technically "
-"proficient audiences"
-msgstr "Some advanced features, while useful - may be best suited for technically proficient audiences"
-
-#: ../../mod/setup.php:423
-msgid "Could not find a command line version of PHP in the web server PATH."
-msgstr "Could not find a command line version of PHP in the web server PATH."
-
-#: ../../mod/setup.php:424
-msgid ""
-"If you don't have a command line version of PHP installed on server, you "
-"will not be able to run background polling via cron."
-msgstr "If you don't have a command line version of PHP installed on server, you will not be able to run background polling via cron."
-
-#: ../../mod/setup.php:428
-msgid "PHP executable path"
-msgstr "PHP executable path"
-
-#: ../../mod/setup.php:428
-msgid ""
-"Enter full path to php executable. You can leave this blank to continue the "
-"installation."
-msgstr "Enter full path to php executable. You can leave this blank to continue the installation."
-
-#: ../../mod/setup.php:433
-msgid "Command line PHP"
-msgstr "Command line PHP"
-
-#: ../../mod/setup.php:442
-msgid ""
-"The command line version of PHP on your system does not have "
-"\"register_argc_argv\" enabled."
-msgstr "The command line version of PHP on your system does not have \"register_argc_argv\" enabled."
-
-#: ../../mod/setup.php:443
-msgid "This is required for message delivery to work."
-msgstr "This is required for message delivery to work."
-
-#: ../../mod/setup.php:446
-msgid "PHP register_argc_argv"
-msgstr "PHP register_argc_argv"
-
-#: ../../mod/setup.php:464
-#, php-format
-msgid ""
-"Your max allowed total upload size is set to %s. Maximum size of one file to"
-" upload is set to %s. You are allowed to upload up to %d files at once."
-msgstr "Your max allowed total upload size is set to %s. Maximum size of one file to upload is set to %s. You are allowed to upload up to %d files at once."
-
-#: ../../mod/setup.php:469
-msgid "You can adjust these settings in the servers php.ini."
-msgstr "You can adjust these settings in the servers php.ini."
-
-#: ../../mod/setup.php:471
-msgid "PHP upload limits"
-msgstr "PHP upload limits"
-
-#: ../../mod/setup.php:494
-msgid ""
-"Error: the \"openssl_pkey_new\" function on this system is not able to "
-"generate encryption keys"
-msgstr "Error: the \"openssl_pkey_new\" function on this system is not able to generate encryption keys"
-
-#: ../../mod/setup.php:495
-msgid ""
-"If running under Windows, please see "
-"\"http://www.php.net/manual/en/openssl.installation.php\"."
-msgstr "If running under Windows, please see \"http://www.php.net/manual/en/openssl.installation.php\"."
-
-#: ../../mod/setup.php:498
-msgid "Generate encryption keys"
-msgstr "Generate encryption keys"
-
-#: ../../mod/setup.php:510
-msgid "libCurl PHP module"
-msgstr "libCurl PHP module"
-
-#: ../../mod/setup.php:511
-msgid "GD graphics PHP module"
-msgstr "GD graphics PHP module"
-
-#: ../../mod/setup.php:512
-msgid "OpenSSL PHP module"
-msgstr "OpenSSL PHP module"
-
-#: ../../mod/setup.php:513
-msgid "mysqli or postgres PHP module"
-msgstr "mysqli or postgres PHP module"
-
-#: ../../mod/setup.php:514
-msgid "mb_string PHP module"
-msgstr "mb_string PHP module"
-
-#: ../../mod/setup.php:515
-msgid "mcrypt PHP module"
-msgstr "mcrypt PHP module"
-
-#: ../../mod/setup.php:516
-msgid "xml PHP module"
-msgstr "xml PHP module"
-
-#: ../../mod/setup.php:520 ../../mod/setup.php:522
-msgid "Apache mod_rewrite module"
-msgstr "Apache mod_rewrite module"
-
-#: ../../mod/setup.php:520
-msgid ""
-"Error: Apache webserver mod-rewrite module is required but not installed."
-msgstr "Error: Apache webserver mod-rewrite module is required but not installed."
-
-#: ../../mod/setup.php:526 ../../mod/setup.php:529
-msgid "proc_open"
-msgstr "proc_open"
-
-#: ../../mod/setup.php:526
-msgid ""
-"Error: proc_open is required but is either not installed or has been "
-"disabled in php.ini"
-msgstr "Error: proc_open is required but is either not installed or has been disabled in php.ini"
-
-#: ../../mod/setup.php:534
-msgid "Error: libCURL PHP module required but not installed."
-msgstr "Error: libCURL PHP module required but not installed."
-
-#: ../../mod/setup.php:538
-msgid ""
-"Error: GD graphics PHP module with JPEG support required but not installed."
-msgstr "Error: GD graphics PHP module with JPEG support required but not installed."
-
-#: ../../mod/setup.php:542
-msgid "Error: openssl PHP module required but not installed."
-msgstr "Error: openssl PHP module required but not installed."
-
-#: ../../mod/setup.php:546
-msgid ""
-"Error: mysqli or postgres PHP module required but neither are installed."
-msgstr "Error: mysqli or postgres PHP module required but neither are installed."
-
-#: ../../mod/setup.php:550
-msgid "Error: mb_string PHP module required but not installed."
-msgstr "Error: mb_string PHP module required but not installed."
-
-#: ../../mod/setup.php:554
-msgid "Error: mcrypt PHP module required but not installed."
-msgstr "Error: mcrypt PHP module required but not installed."
-
-#: ../../mod/setup.php:558
-msgid "Error: xml PHP module required for DAV but not installed."
-msgstr "Error: xml PHP module required for DAV but not installed."
-
-#: ../../mod/setup.php:576
-msgid ""
-"The web installer needs to be able to create a file called \".htconfig.php\""
-" in the top folder of your web server and it is unable to do so."
-msgstr "The web installer needs to be able to create a file called \".htconfig.php\" in the top folder of your web server and it is unable to do so."
-
-#: ../../mod/setup.php:577
-msgid ""
-"This is most often a permission setting, as the web server may not be able "
-"to write files in your folder - even if you can."
-msgstr "This is most often a permission setting, as the web server may not be able to write files in your folder - even if you can."
-
-#: ../../mod/setup.php:578
-msgid ""
-"At the end of this procedure, we will give you a text to save in a file "
-"named .htconfig.php in your Red top folder."
-msgstr "At the end of this procedure, we will give you a text to save in a file named .htconfig.php in your Red top folder."
-
-#: ../../mod/setup.php:579
-msgid ""
-"You can alternatively skip this procedure and perform a manual installation."
-" Please see the file \"install/INSTALL.txt\" for instructions."
-msgstr "You can alternatively skip this procedure and perform a manual installation. Please see the file \"install/INSTALL.txt\" for instructions."
-
-#: ../../mod/setup.php:582
-msgid ".htconfig.php is writable"
-msgstr ".htconfig.php is writable"
-
-#: ../../mod/setup.php:596
-msgid ""
-"Red uses the Smarty3 template engine to render its web views. Smarty3 "
-"compiles templates to PHP to speed up rendering."
-msgstr "Red uses the Smarty3 template engine to render its web views. Smarty3 compiles templates to PHP to speed up rendering."
-
-#: ../../mod/setup.php:597
-#, php-format
-msgid ""
-"In order to store these compiled templates, the web server needs to have "
-"write access to the directory %s under the Red top level folder."
-msgstr "In order to store these compiled templates, the web server needs to have write access to the directory %s under the Red top level folder."
-
-#: ../../mod/setup.php:598 ../../mod/setup.php:619
-msgid ""
-"Please ensure that the user that your web server runs as (e.g. www-data) has"
-" write access to this folder."
-msgstr "Please ensure that the user that your web server runs as (e.g. www-data) has write access to this folder."
-
-#: ../../mod/setup.php:599
-#, php-format
-msgid ""
-"Note: as a security measure, you should give the web server write access to "
-"%s only--not the template files (.tpl) that it contains."
-msgstr "Note: as a security measure, you should give the web server write access to %s only--not the template files (.tpl) that it contains."
-
-#: ../../mod/setup.php:602
-#, php-format
-msgid "%s is writable"
-msgstr "%s is writable"
-
-#: ../../mod/setup.php:618
-msgid ""
-"Red uses the store directory to save uploaded files. The web server needs to"
-" have write access to the store directory under the Red top level folder"
-msgstr "Red uses the store directory to save uploaded files. The web server needs to have write access to the store directory under the Red top level folder"
-
-#: ../../mod/setup.php:622
-msgid "store is writable"
-msgstr "store is writable"
-
-#: ../../mod/setup.php:655
-msgid ""
-"SSL certificate cannot be validated. Fix certificate or disable https access"
-" to this site."
-msgstr "SSL certificate cannot be validated. Fix certificate or disable https access to this hub."
-
-#: ../../mod/setup.php:656
-msgid ""
-"If you have https access to your website or allow connections to TCP port "
-"443 (the https: port), you MUST use a browser-valid certificate. You MUST "
-"NOT use self-signed certificates!"
-msgstr "If you have https access to your hub or allow connections to TCP port 443 (the https: port), you MUST use a browser-valid certificate. You MUST NOT use self-signed certificates!"
-
-#: ../../mod/setup.php:657
-msgid ""
-"This restriction is incorporated because public posts from you may for "
-"example contain references to images on your own hub."
-msgstr "This restriction is incorporated because public posts from you may for example contain references to images on your own hub."
-
-#: ../../mod/setup.php:658
-msgid ""
-"If your certificate is not recognized, members of other sites (who may "
-"themselves have valid certificates) will get a warning message on their own "
-"site complaining about security issues."
-msgstr "If your certificate is not recognized, members of other hubs (who may themselves have valid certificates) will get a warning message on their own hub complaining about security issues."
-
-#: ../../mod/setup.php:659
-msgid ""
-"This can cause usability issues elsewhere (not just on your own site) so we "
-"must insist on this requirement."
-msgstr "This can cause usability issues elsewhere (not just on your own hub) so we must insist on this requirement."
-
-#: ../../mod/setup.php:660
-msgid ""
-"Providers are available that issue free certificates which are browser-"
-"valid."
-msgstr "Providers are available that issue free certificates which are browser-valid."
-
-#: ../../mod/setup.php:662
-msgid "SSL certificate validation"
-msgstr "SSL certificate validation"
-
-#: ../../mod/setup.php:668
-msgid ""
-"Url rewrite in .htaccess is not working. Check your server "
-"configuration.Test: "
-msgstr "Url rewrite in .htaccess is not working. Check your server configuration.Test: "
-
-#: ../../mod/setup.php:671
-msgid "Url rewrite is working"
-msgstr "Url rewrite is working"
-
-#: ../../mod/setup.php:680
-msgid ""
-"The database configuration file \".htconfig.php\" could not be written. "
-"Please use the enclosed text to create a configuration file in your web "
-"server root."
-msgstr "The database configuration file \".htconfig.php\" could not be written. Please use the enclosed text to create a configuration file in your web server root."
-
-#: ../../mod/setup.php:704
-msgid "Errors encountered creating database tables."
-msgstr "Errors encountered creating database tables."
-
-#: ../../mod/setup.php:738
-msgid "<h1>What next</h1>"
-msgstr "<h1>What next</h1>"
-
-#: ../../mod/setup.php:739
-msgid ""
-"IMPORTANT: You will need to [manually] setup a scheduled task for the "
-"poller."
-msgstr "IMPORTANT: You will need to [manually] setup a scheduled task for the poller."
-
-#: ../../mod/impel.php:192
-#, php-format
-msgid "%s element installed"
-msgstr "%s onderdeel geïnstalleerd"
-
-#: ../../mod/impel.php:195
-#, php-format
-msgid "%s element installation failed"
-msgstr "Installatie %s-element mislukt"
-
-#: ../../mod/import.php:28
-#, php-format
-msgid "Your service plan only allows %d channels."
-msgstr "Jouw abonnement staat maar %d kanalen toe."
-
-#: ../../mod/import.php:66 ../../mod/import_items.php:38
-msgid "Nothing to import."
-msgstr "Niets gevonden om te importeren"
-
-#: ../../mod/import.php:90 ../../mod/import_items.php:62
-msgid "Unable to download data from old server"
-msgstr "Niet in staat om gegevens van de oude hub te downloaden"
-
-#: ../../mod/import.php:96 ../../mod/import_items.php:68
-msgid "Imported file is empty."
-msgstr "Geïmporteerde bestand is leeg"
-
-#: ../../mod/import.php:118 ../../mod/import_items.php:82
-#, php-format
-msgid "Warning: Database versions differ by %1$d updates."
-msgstr "Waarschuwing: database-versies lopen %1$d updates achter."
-
-#: ../../mod/import.php:156
-msgid "No channel. Import failed."
-msgstr "Geen kanaal. Importeren mislukt."
-
-#: ../../mod/import.php:524
-msgid "You must be logged in to use this feature."
-msgstr "Je moet ingelogd zijn om dit onderdeel te kunnen gebruiken."
-
-#: ../../mod/import.php:529
-msgid "Import Channel"
-msgstr "Kanaal importeren"
-
-#: ../../mod/import.php:530
-msgid ""
-"Use this form to import an existing channel from a different server/hub. You"
-" may retrieve the channel identity from the old server/hub via the network "
-"or provide an export file."
-msgstr "Gebruik dit formulier om een bestaand kanaal te importeren van een andere hub. Je kan de kanaal-identiteit van de oude hub via het netwerk ontvangen of een exportbestand verstrekken."
-
-#: ../../mod/import.php:531 ../../mod/import_items.php:115
-msgid "File to Upload"
-msgstr "Bestand om te uploaden"
-
-#: ../../mod/import.php:532
-msgid "Or provide the old server/hub details"
-msgstr "Of vul de gegevens van de oude hub in"
-
-#: ../../mod/import.php:533
-msgid "Your old identity address (xyz@example.com)"
-msgstr "Jouw oude kanaaladres (xyz@example.com)"
-
-#: ../../mod/import.php:534
-msgid "Your old login email address"
-msgstr "Het e-mailadres van je oude account"
-
-#: ../../mod/import.php:535
-msgid "Your old login password"
-msgstr "Wachtwoord van jouw oude account"
-
-#: ../../mod/import.php:536
-msgid ""
-"For either option, please choose whether to make this hub your new primary "
-"address, or whether your old location should continue this role. You will be"
-" able to post from either location, but only one can be marked as the "
-"primary location for files, photos, and media."
-msgstr "Voor elke optie geldt dat je moet kiezen of je jouw primaire kanaaladres op deze hub wil instellen of dat jouw oude hub deze rol blijft vervullen."
-
-#: ../../mod/import.php:537
-msgid "Make this hub my primary location"
-msgstr "Stel deze hub als mijn primaire locatie in"
-
-#: ../../mod/import.php:538
-msgid ""
-"Import existing posts if possible (experimental - limited by available "
-"memory"
-msgstr "Importeer bestaande berichten wanneer mogelijk (experimenteel - afhankelijk van beschikbaar servergeheugen)"
-
-#: ../../mod/import.php:539
-msgid ""
-"This process may take several minutes to complete. Please submit the form "
-"only once and leave this page open until finished."
-msgstr "Dit proces kan enkele minuten in beslag nemen. Klik maar één keer op opslaan en verlaat deze pagina niet alvorens het proces is voltooid."
-
-#: ../../mod/import_items.php:98
-msgid "Import completed"
-msgstr "Importeren voltooid"
-
-#: ../../mod/import_items.php:113
-msgid "Import Items"
-msgstr "Importeer items"
-
-#: ../../mod/import_items.php:114
-msgid ""
-"Use this form to import existing posts and content from an export file."
-msgstr "Gebruik dit formulier om bestaande berichten en andere inhoud vanuit een exportbestand te importeren."
-
-#: ../../mod/sharedwithme.php:94
-msgid "Files: shared with me"
-msgstr "Bestanden: met mij gedeeld"
-
-#: ../../mod/sharedwithme.php:96
-msgid "NEW"
-msgstr "NIEUW"
-
-#: ../../mod/sharedwithme.php:99
-msgid "Remove all files"
-msgstr "Verwijder alle bestanden"
-
-#: ../../mod/sharedwithme.php:100
-msgid "Remove this file"
-msgstr "Verwijder dit bestand"
-
-#: ../../mod/invite.php:25
-msgid "Total invitation limit exceeded."
-msgstr "Limiet voor aantal uitnodigingen overschreden."
-
-#: ../../mod/invite.php:49
-#, php-format
-msgid "%s : Not a valid email address."
-msgstr "%s : Geen geldig e-mailadres."
-
-#: ../../mod/invite.php:59
-msgid "Please join us on $Projectname"
-msgstr "Uitnodiging voor $Projectname"
-
-#: ../../mod/invite.php:70
-msgid "Invitation limit exceeded. Please contact your site administrator."
-msgstr "Limiet voor aantal uitnodigingen overschreden. Neem contact op met je hub-beheerder."
-
-#: ../../mod/invite.php:75
-#, php-format
-msgid "%s : Message delivery failed."
-msgstr "%s: Aflevering bericht mislukt."
-
-#: ../../mod/invite.php:79
-#, php-format
-msgid "%d message sent."
-msgid_plural "%d messages sent."
-msgstr[0] "%d bericht verzonden."
-msgstr[1] "%d berichten verzonden."
-
-#: ../../mod/invite.php:98
-msgid "You have no more invitations available"
-msgstr "Je hebt geen uitnodigingen meer beschikbaar"
-
-#: ../../mod/invite.php:129
-msgid "Send invitations"
-msgstr "Uitnodigingen verzenden"
-
-#: ../../mod/invite.php:130
-msgid "Enter email addresses, one per line:"
-msgstr "Voer e-mailadressen in, één per regel:"
-
-#: ../../mod/invite.php:131 ../../mod/mail.php:246
-msgid "Your message:"
-msgstr "Jouw bericht:"
-
-#: ../../mod/invite.php:132
-msgid "Please join my community on $Projectname."
-msgstr "Hierbij nodig ik je uit om mij, en andere vrienden en kennissen, op $Projectname te vergezellen. Lees meer over $Projectname op http://hubzilla.org"
-
-#: ../../mod/invite.php:134
-msgid "You will need to supply this invitation code:"
-msgstr "Je moet deze uitnodigingscode opgeven:"
-
-#: ../../mod/invite.php:135
-msgid ""
-"1. Register at any $Projectname location (they are all inter-connected)"
-msgstr "1. Registreer je op een willekeurige $Projectname-hub (ze zijn allemaal onderling met elkaar verbonden):"
-
-#: ../../mod/invite.php:137
-msgid "2. Enter my $Projectname network address into the site searchbar."
-msgstr "2. Nadat je bent ingelogd en een kanaal hebt aangemaakt kan je mijn $Projectname-kanaaladres in het zoekveld invullen:"
-
-#: ../../mod/invite.php:138
-msgid "or visit"
-msgstr "of bezoek"
-
-#: ../../mod/invite.php:140
-msgid "3. Click [Connect]"
-msgstr "3. Klik op [+ Verbinden]"
-
-#: ../../mod/siteinfo.php:15
-#, php-format
-msgid "Version %s"
-msgstr "Versie %s"
-
-#: ../../mod/siteinfo.php:36
-msgid "Installed plugins/addons/apps:"
-msgstr "Ingeschakelde plugins en apps:"
-
-#: ../../mod/siteinfo.php:49
-msgid "No installed plugins/addons/apps"
-msgstr "Geen ingeschakelde plugins en apps"
-
-#: ../../mod/siteinfo.php:62
-msgid ""
-"This is a hub of $Projectname - a global cooperative network of "
-"decentralized privacy enhanced websites."
-msgstr "Dit is een $Projectname-hub - $Projectname is een wereldwijd coöperatief netwerk van gedecentraliseerde websites (hubs) met verbeterde privacy."
-
-#: ../../mod/siteinfo.php:64
-msgid "Tag: "
-msgstr "Tag: "
-
-#: ../../mod/siteinfo.php:66
-msgid "Last background fetch: "
-msgstr "Meest recente achtergrond-fetch:"
-
-#: ../../mod/siteinfo.php:68
-msgid "Current load average: "
-msgstr "Gemiddelde systeembelasting is nu:"
-
-#: ../../mod/siteinfo.php:71
-msgid "Running at web location"
-msgstr "Draaiend op weblocatie"
-
-#: ../../mod/siteinfo.php:72
-msgid ""
-"Please visit <a href=\"http://hubzilla.org\">hubzilla.org</a> to learn more "
-"about $Projectname."
-msgstr "Bezoek <a href=\"http://hubzilla.org\">hubzilla.org</a> "
-
-#: ../../mod/siteinfo.php:73
-msgid "Bug reports and issues: please visit"
-msgstr "Bugrapporten en andere kwesties: bezoek"
-
-#: ../../mod/siteinfo.php:75
-msgid "$projectname issues"
-msgstr "$projectname-issues"
-
-#: ../../mod/siteinfo.php:76
-msgid ""
-"Suggestions, praise, etc. - please email \"redmatrix\" at librelist - dot "
-"com"
-msgstr "Voorstellen, lofbetuigingen, enz. - e-mail \"redmatrix\" at librelist - dot com"
-
-#: ../../mod/siteinfo.php:78
-msgid "Site Administrators"
-msgstr "Hubbeheerders: "
-
-#: ../../mod/item.php:174
-msgid "Unable to locate original post."
-msgstr "Niet in staat om de originele locatie van het bericht te vinden. "
-
-#: ../../mod/item.php:423
-msgid "Empty post discarded."
-msgstr "Leeg bericht geannuleerd"
-
-#: ../../mod/item.php:463
-msgid "Executable content type not permitted to this channel."
-msgstr "Uitvoerbare bestanden zijn niet toegestaan op dit kanaal."
-
-#: ../../mod/item.php:843
-msgid "Duplicate post suppressed."
-msgstr "Dubbel bericht tegengehouden."
-
-#: ../../mod/item.php:973
-msgid "System error. Post not saved."
-msgstr "Systeemfout. Bericht niet opgeslagen."
-
-#: ../../mod/item.php:1240
-msgid "Unable to obtain post information from database."
-msgstr "Niet in staat om informatie over dit bericht uit de database te verkrijgen."
-
-#: ../../mod/item.php:1247
-#, php-format
-msgid "You have reached your limit of %1$.0f top level posts."
-msgstr "Je hebt jouw limiet van %1$.0f berichten bereikt."
-
-#: ../../mod/item.php:1254
-#, php-format
-msgid "You have reached your limit of %1$.0f webpages."
-msgstr "Je hebt jouw limiet van %1$.0f webpagina's bereikt."
-
-#: ../../mod/layouts.php:177
-msgid "Comanche page description language help"
-msgstr "Hulp met de paginabeschrijvingstaal Comanche"
-
-#: ../../mod/layouts.php:181
-msgid "Layout Description"
-msgstr "Lay-out-omschrijving"
-
-#: ../../mod/layouts.php:186
-msgid "Download PDL file"
-msgstr "Download PDL-bestand"
-
-#: ../../mod/like.php:15
-msgid "Like/Dislike"
-msgstr "Leuk/niet leuk"
-
-#: ../../mod/like.php:20
-msgid "This action is restricted to members."
-msgstr "Deze actie kan alleen door $Projectname-leden worden uitgevoerd."
-
-#: ../../mod/like.php:21
-msgid ""
-"Please <a href=\"rmagic\">login with your $Projectname ID</a> or <a "
-"href=\"register\">register as a new $Projectname member</a> to continue."
-msgstr "Je dient <a href=\"rmagic\">in te loggen met je $Projectname-account</a> of <a href=\"register\">een nieuw $Projectname-account aan te maken</a> om verder te kunnen gaan."
-
-#: ../../mod/like.php:101 ../../mod/like.php:127 ../../mod/like.php:165
-msgid "Invalid request."
-msgstr "Ongeldig verzoek"
-
-#: ../../mod/like.php:142
-msgid "thing"
-msgstr "ding"
-
-#: ../../mod/like.php:188
-msgid "Channel unavailable."
-msgstr "Kanaal niet beschikbaar."
-
-#: ../../mod/like.php:236
-msgid "Previous action reversed."
-msgstr "Vorige actie omgedraaid"
-
-#: ../../mod/like.php:420
-#, php-format
-msgid "%1$s agrees with %2$s's %3$s"
-msgstr "%1$s is het eens met %2$s's %3$s"
-
-#: ../../mod/like.php:422
-#, php-format
-msgid "%1$s doesn't agree with %2$s's %3$s"
-msgstr "%1$s is het niet eens met %2$s's %3$s"
-
-#: ../../mod/like.php:424
-#, php-format
-msgid "%1$s abstains from a decision on %2$s's %3$s"
-msgstr "%1$s onthoudt zich van een besluit over %2$s's %3$s"
-
-#: ../../mod/like.php:426
-#, php-format
-msgid "%1$s is attending %2$s's %3$s"
-msgstr "%1$s is aanwezig op %2$s's %3$s"
-
-#: ../../mod/like.php:428
-#, php-format
-msgid "%1$s is not attending %2$s's %3$s"
-msgstr "%1$s is niet aanwezig op %2$s's %3$s"
-
-#: ../../mod/like.php:430
-#, php-format
-msgid "%1$s may attend %2$s's %3$s"
-msgstr "%1$s is mogelijk aanwezig op %2$s's %3$s"
-
-#: ../../mod/like.php:533
-msgid "Action completed."
-msgstr "Actie voltooid"
-
-#: ../../mod/like.php:534
-msgid "Thank you."
-msgstr "Bedankt"
-
-#: ../../mod/locs.php:21 ../../mod/locs.php:50
-msgid "Location not found."
-msgstr "Locatie niet gevonden."
-
-#: ../../mod/locs.php:58
-msgid "Location lookup failed."
-msgstr "Opzoeken locatie mislukt"
-
-#: ../../mod/locs.php:62
-msgid ""
-"Please select another location to become primary before removing the primary"
-" location."
-msgstr "Kies eerst een andere primaire locatie alvorens de huidige primaire locatie te verwijderen."
-
-#: ../../mod/locs.php:91
-msgid "Syncing locations"
-msgstr "Locaties synchronizeren"
-
-#: ../../mod/locs.php:101
-msgid "No locations found."
-msgstr "Geen locaties gevonden."
-
-#: ../../mod/locs.php:112
-msgid "Manage Channel Locations"
-msgstr "Kanaallocaties beheren"
-
-#: ../../mod/locs.php:115
-msgid "Primary"
-msgstr "Primair"
-
-#: ../../mod/locs.php:116 ../../mod/menu.php:109
-msgid "Drop"
-msgstr "Verwijderen"
-
-#: ../../mod/locs.php:118
-msgid "Sync Now"
-msgstr "Nu synchroniseren"
-
-#: ../../mod/locs.php:119
-msgid "Please wait several minutes between consecutive operations."
-msgstr "Wacht enkele minuten tussen opeenvolgende handelingen."
-
-#: ../../mod/locs.php:120
-msgid ""
-"When possible, drop a location by logging into that website/hub and removing"
-" your channel."
-msgstr "Wij adviseren, wanneer dit (nog) mogelijk is, de locatie te verwijderen door op de hub van de kloon in te loggen en het kanaal daar te verwijderen."
-
-#: ../../mod/locs.php:121
-msgid "Use this form to drop the location if the hub is no longer operating."
-msgstr "Gebruik dit formulier om de locatie te verwijderen wanneer de hub van de kloon niet meer operationeel is."
-
-#: ../../mod/sources.php:32
-msgid "Failed to create source. No channel selected."
-msgstr "Aanmaken bron mislukt. Geen kanaal geselecteerd."
-
-#: ../../mod/sources.php:45
-msgid "Source created."
-msgstr "Bron aangemaakt."
-
-#: ../../mod/sources.php:57
-msgid "Source updated."
-msgstr "Bron aangemaakt."
-
-#: ../../mod/sources.php:82
-msgid "*"
-msgstr "*"
-
-#: ../../mod/sources.php:89
-msgid "Manage remote sources of content for your channel."
-msgstr "Beheer externe bronnen met inhoud voor jouw kanaal"
-
-#: ../../mod/sources.php:90 ../../mod/sources.php:100
-msgid "New Source"
-msgstr "Nieuwe bron"
-
-#: ../../mod/sources.php:101 ../../mod/sources.php:133
-msgid ""
-"Import all or selected content from the following channel into this channel "
-"and distribute it according to your channel settings."
-msgstr "Importeer complete of gedeelde inhoud vanuit het volgende kanaal naar dit kanaal, en verdeel het vervolgens volgens jouw kanaalinstellingen."
-
-#: ../../mod/sources.php:102 ../../mod/sources.php:134
-msgid "Only import content with these words (one per line)"
-msgstr "Importeer alleen inhoud met deze woorden (één per regel)"
-
-#: ../../mod/sources.php:102 ../../mod/sources.php:134
-msgid "Leave blank to import all public content"
-msgstr "Laat leeg om alle openbare inhoud te importeren"
-
-#: ../../mod/sources.php:103 ../../mod/sources.php:137
-msgid "Channel Name"
-msgstr "Kanaalnaam"
-
-#: ../../mod/sources.php:123 ../../mod/sources.php:150
-msgid "Source not found."
-msgstr "Bron niet gevonden"
-
-#: ../../mod/sources.php:130
-msgid "Edit Source"
-msgstr "Bron bewerken"
-
-#: ../../mod/sources.php:131
-msgid "Delete Source"
-msgstr "Bron verwijderen"
-
-#: ../../mod/sources.php:158
-msgid "Source removed"
-msgstr "Bron verwijderd"
-
-#: ../../mod/sources.php:160
-msgid "Unable to remove source."
-msgstr "Verwijderen bron mislukt."
-
-#: ../../mod/lostpass.php:15
-msgid "No valid account found."
-msgstr "Geen geldige account gevonden."
-
-#: ../../mod/lostpass.php:29
-msgid "Password reset request issued. Check your email."
-msgstr "Het verzoek om je wachtwoord opnieuw in te stellen is behandeld. Controleer je e-mail."
-
-#: ../../mod/lostpass.php:35 ../../mod/lostpass.php:103
-#, php-format
-msgid "Site Member (%s)"
-msgstr "Lid van hub (%s)"
-
-#: ../../mod/lostpass.php:40
-#, php-format
-msgid "Password reset requested at %s"
-msgstr "Verzoek tot het opnieuw instellen van een wachtwoord op %s is ingediend"
-
-#: ../../mod/lostpass.php:63
-msgid ""
-"Request could not be verified. (You may have previously submitted it.) "
-"Password reset failed."
-msgstr "Het verzoek kon niet worden geverifieerd. (Mogelijk heb je al eerder een verzoek ingediend.) Opnieuw instellen van wachtwoord is mislukt."
-
-#: ../../mod/lostpass.php:86 ../../boot.php:1608
-msgid "Password Reset"
-msgstr "Wachtwoord vergeten?"
-
-#: ../../mod/lostpass.php:87
-msgid "Your password has been reset as requested."
-msgstr "Jouw wachtwoord is opnieuw ingesteld zoals je had verzocht."
-
-#: ../../mod/lostpass.php:88
-msgid "Your new password is"
-msgstr "Jouw nieuwe wachtwoord is"
-
-#: ../../mod/lostpass.php:89
-msgid "Save or copy your new password - and then"
-msgstr "Kopieer of sla je nieuwe wachtwoord op - en"
-
-#: ../../mod/lostpass.php:90
-msgid "click here to login"
-msgstr "klik dan hier om in te loggen"
-
-#: ../../mod/lostpass.php:91
-msgid ""
-"Your password may be changed from the <em>Settings</em> page after "
-"successful login."
-msgstr "Jouw wachtwoord kan worden veranderd onder <em>instellingen</em>, nadat je succesvol bent ingelogd."
-
-#: ../../mod/lostpass.php:108
-#, php-format
-msgid "Your password has changed at %s"
-msgstr "Jouw wachtwoord op %s is veranderd"
-
-#: ../../mod/lostpass.php:123
-msgid "Forgot your Password?"
-msgstr "Wachtwoord vergeten?"
-
-#: ../../mod/lostpass.php:124
-msgid ""
-"Enter your email address and submit to have your password reset. Then check "
-"your email for further instructions."
-msgstr "Voer je e-mailadres in en verstuur deze om je wachtwoord opnieuw in te stellen. Controleer hierna hier je e-mail voor verdere instructies."
-
-#: ../../mod/lostpass.php:125
-msgid "Email Address"
-msgstr "E-mailadres"
-
-#: ../../mod/lostpass.php:126
-msgid "Reset"
-msgstr "Opnieuw instellen"
-
-#: ../../mod/magic.php:69
-msgid "Hub not found."
-msgstr "Hub niet gevonden."
-
-#: ../../mod/subthread.php:114
-#, php-format
-msgid "%1$s is following %2$s's %3$s"
-msgstr "%1$s volgt het %3$s van %2$s"
-
-#: ../../mod/subthread.php:116
-#, php-format
-msgid "%1$s stopped following %2$s's %3$s"
-msgstr "%1$s volgt het %3$s van %2$s niet meer"
-
-#: ../../mod/mail.php:34
-msgid "Unable to lookup recipient."
-msgstr "Niet in staat om ontvanger op te zoeken."
-
-#: ../../mod/mail.php:42
-msgid "Unable to communicate with requested channel."
-msgstr "Niet in staat om met het aangevraagde kanaal te communiceren."
-
-#: ../../mod/mail.php:49
-msgid "Cannot verify requested channel."
-msgstr "Kan opgevraagd kanaal niet verifieren"
-
-#: ../../mod/mail.php:75
-msgid "Selected channel has private message restrictions. Send failed."
-msgstr "Gekozen kanaal heeft restricties voor privéberichten. Verzenden mislukt."
-
-#: ../../mod/mail.php:140
-msgid "Messages"
-msgstr "Berichten"
-
-#: ../../mod/mail.php:175
-msgid "Message recalled."
-msgstr "Bericht ingetrokken."
-
-#: ../../mod/mail.php:188
-msgid "Conversation removed."
-msgstr "Conversatie verwijderd"
-
-#: ../../mod/mail.php:231
-msgid "Requested channel is not in this network"
-msgstr "Opgevraagd kanaal is niet in dit netwerk beschikbaar"
-
-#: ../../mod/mail.php:239
-msgid "Send Private Message"
-msgstr "Privébericht versturen"
-
-#: ../../mod/mail.php:240 ../../mod/mail.php:370
-msgid "To:"
-msgstr "Aan:"
-
-#: ../../mod/mail.php:243 ../../mod/mail.php:372
-msgid "Subject:"
-msgstr "Onderwerp:"
-
-#: ../../mod/mail.php:250
-msgid "Send"
-msgstr "Verzenden"
-
-#: ../../mod/mail.php:342
-msgid "Delete message"
-msgstr "Bericht verwijderen"
-
-#: ../../mod/mail.php:343
-msgid "Delivery report"
-msgstr "Afleveringsrapport"
-
-#: ../../mod/mail.php:344
-msgid "Recall message"
-msgstr "Bericht intrekken"
-
-#: ../../mod/mail.php:346
-msgid "Message has been recalled."
-msgstr "Bericht is ingetrokken."
-
-#: ../../mod/mail.php:363
-msgid "Delete Conversation"
-msgstr "Verwijder conversatie"
-
-#: ../../mod/mail.php:365
-msgid ""
-"No secure communications available. You <strong>may</strong> be able to "
-"respond from the sender's profile page."
-msgstr "Geen veilige communicatie beschikbaar. <strong>Mogelijk</strong> kan je reageren op de kanaalpagina van de afzender."
-
-#: ../../mod/mail.php:369
-msgid "Send Reply"
-msgstr "Antwoord versturen"
-
-#: ../../mod/mail.php:374
-#, php-format
-msgid "Your message for %s (%s):"
-msgstr "Jouw privébericht aan %s (%s):"
-
-#: ../../mod/suggest.php:35
-msgid ""
-"No suggestions available. If this is a new site, please try again in 24 "
-"hours."
-msgstr "Geen voorgestelde kanalen gevonden. Wanneer dit een nieuwe hub is, probeer het dan over 24 uur weer."
-
-#: ../../mod/manage.php:137
-msgid "Create a new channel"
-msgstr "Nieuw kanaal aanmaken"
-
-#: ../../mod/manage.php:159
-msgid "Current Channel"
-msgstr "Huidig kanaal"
-
-#: ../../mod/manage.php:161
-msgid "Switch to one of your channels by selecting it."
-msgstr "Activeer een van jouw andere kanalen door er op te klikken."
-
-#: ../../mod/manage.php:162
-msgid "Default Channel"
-msgstr "Standaardkanaal"
-
-#: ../../mod/manage.php:163
-msgid "Make Default"
-msgstr "Als standaard instellen"
-
-#: ../../mod/manage.php:166
-#, php-format
-msgid "%d new messages"
-msgstr "%d nieuwe berichten"
-
-#: ../../mod/manage.php:167
-#, php-format
-msgid "%d new introductions"
-msgstr "%d nieuwe connectieverzoeken"
-
-#: ../../mod/manage.php:169
-msgid "Delegated Channel"
-msgstr "Uitbesteed kanaal"
-
-#: ../../mod/tagger.php:96
-#, php-format
-msgid "%1$s tagged %2$s's %3$s with %4$s"
-msgstr "%1$s heeft het %3$s van %2$s getagd met %4$s"
-
-#: ../../mod/match.php:22
-msgid "Profile Match"
-msgstr "Profielovereenkomst"
-
-#: ../../mod/match.php:31
-msgid "No keywords to match. Please add keywords to your default profile."
-msgstr "Je hebt geen trefwoorden waarmee overeenkomsten gevonden kunnen worden. Voeg enkele trefwoorden aan je standaardprofiel toe."
-
-#: ../../mod/match.php:63
-msgid "is interested in:"
-msgstr "is geïnteresseerd in:"
-
-#: ../../mod/match.php:70
-msgid "No matches"
-msgstr "Geen overeenkomsten"
-
-#: ../../mod/tagrm.php:44 ../../mod/tagrm.php:94
-msgid "Tag removed"
-msgstr "Tag verwijderd"
-
-#: ../../mod/tagrm.php:119
-msgid "Remove Item Tag"
-msgstr "Verwijder item-tag"
-
-#: ../../mod/tagrm.php:121
-msgid "Select a tag to remove: "
-msgstr "Kies een tag om te verwijderen"
-
-#: ../../mod/menu.php:45
-msgid "Unable to update menu."
-msgstr "Niet in staat om menu aan te passen"
-
-#: ../../mod/menu.php:56
-msgid "Unable to create menu."
-msgstr "Niet in staat om menu aan te maken."
-
-#: ../../mod/menu.php:94 ../../mod/menu.php:106
-msgid "Menu Name"
-msgstr "Menunaam"
-
-#: ../../mod/menu.php:94
-msgid "Unique name (not visible on webpage) - required"
-msgstr "Unieke naam vereist (niet zichtbaar op webpagina)"
-
-#: ../../mod/menu.php:95 ../../mod/menu.php:107
-msgid "Menu Title"
-msgstr "Menutitel"
-
-#: ../../mod/menu.php:95
-msgid "Visible on webpage - leave empty for no title"
-msgstr "Zichtbaar op webpagina (leeg laten voor geen titel)"
-
-#: ../../mod/menu.php:96
-msgid "Allow Bookmarks"
-msgstr "Bladwijzers toestaan"
-
-#: ../../mod/menu.php:96 ../../mod/menu.php:153
-msgid "Menu may be used to store saved bookmarks"
-msgstr "Menu kan gebruikt worden om bladwijzers in op te slaan"
-
-#: ../../mod/menu.php:97 ../../mod/menu.php:155
-msgid "Submit and proceed"
-msgstr "Opslaan en doorgaan"
-
-#: ../../mod/menu.php:113
-msgid "Bookmarks allowed"
-msgstr "Bladwijzers toegestaan"
-
-#: ../../mod/menu.php:115
-msgid "Delete this menu"
-msgstr "Menu verwijderen"
-
-#: ../../mod/menu.php:116 ../../mod/menu.php:150
-msgid "Edit menu contents"
-msgstr "Bewerk de inhoud van het menu"
-
-#: ../../mod/menu.php:117
-msgid "Edit this menu"
-msgstr "Dit menu bewerken"
-
-#: ../../mod/menu.php:132
-msgid "Menu could not be deleted."
-msgstr "Menu kon niet verwijderd worden."
-
-#: ../../mod/menu.php:145
-msgid "Edit Menu"
-msgstr "Menu bewerken"
-
-#: ../../mod/menu.php:149
-msgid "Add or remove entries to this menu"
-msgstr "Items aan dit menu toevoegen of verwijder"
-
-#: ../../mod/menu.php:151
-msgid "Menu name"
-msgstr "Naam van menu"
-
-#: ../../mod/menu.php:151
-msgid "Must be unique, only seen by you"
-msgstr "Moet uniek zijn en is alleen zichtbaar voor jou."
-
-#: ../../mod/menu.php:152
-msgid "Menu title"
-msgstr "Titel van menu"
+#: ../../include/nav.php:130
+msgid "Click to authenticate to your home hub"
+msgstr "Authenticeer jezelf via (bijvoorbeeld) jouw hub"
-#: ../../mod/menu.php:152
-msgid "Menu title as seen by others"
-msgstr "Titel van menu zoals anderen dat zien."
+#: ../../include/nav.php:144
+msgid "Home Page"
+msgstr "Homepage"
-#: ../../mod/menu.php:153
-msgid "Allow bookmarks"
-msgstr "Bladwijzers toestaan"
+#: ../../include/nav.php:148
+msgid "Create an account"
+msgstr "Maak een account aan"
-#: ../../mod/thing.php:110
-msgid "Thing updated"
-msgstr "Ding bijgewerkt"
+#: ../../include/nav.php:161
+msgid "Help and documentation"
+msgstr "Hulp en documentatie"
-#: ../../mod/thing.php:162
-msgid "Object store: failed"
-msgstr "Opslaan van ding mislukt"
+#: ../../include/nav.php:165
+msgid "Applications, utilities, links, games"
+msgstr "Apps"
-#: ../../mod/thing.php:166
-msgid "Thing added"
-msgstr "Ding toegevoegd"
+#: ../../include/nav.php:167
+msgid "Search site @name, #tag, ?docs, content"
+msgstr "Zoek een @kanaal, doorzoek inhoud hub met tekst en #tags, of doorzoek ?documentatie "
-#: ../../mod/thing.php:192
-#, php-format
-msgid "OBJ: %1$s %2$s %3$s"
-msgstr "OBJ: %1$s %2$s %3$s"
+#: ../../include/nav.php:170
+msgid "Channel Directory"
+msgstr "Kanalengids"
-#: ../../mod/thing.php:255
-msgid "Show Thing"
-msgstr "Ding weergeven"
+#: ../../include/nav.php:182
+msgid "Your grid"
+msgstr "Jouw grid"
-#: ../../mod/thing.php:262
-msgid "item not found."
-msgstr "Item niet gevonden"
+#: ../../include/nav.php:183
+msgid "Mark all grid notifications seen"
+msgstr "Markeer alle gridnotificaties als bekeken"
-#: ../../mod/thing.php:295
-msgid "Edit Thing"
-msgstr "Ding bewerken"
+#: ../../include/nav.php:185
+msgid "Channel home"
+msgstr "Jouw kanaal"
-#: ../../mod/thing.php:297 ../../mod/thing.php:347
-msgid "Select a profile"
-msgstr "Kies een profiel"
+#: ../../include/nav.php:186
+msgid "Mark all channel notifications seen"
+msgstr "Alle kanaalnotificaties als gelezen markeren"
-#: ../../mod/thing.php:301 ../../mod/thing.php:350
-msgid "Post an activity"
-msgstr "Plaats een bericht"
+#: ../../include/nav.php:192
+msgid "Notices"
+msgstr "Notificaties"
-#: ../../mod/thing.php:301 ../../mod/thing.php:350
-msgid "Only sends to viewers of the applicable profile"
-msgstr "Toont dit alleen aan diegene die het gekozen profiel mogen zien."
+#: ../../include/nav.php:192
+msgid "Notifications"
+msgstr "Notificaties"
-#: ../../mod/thing.php:303 ../../mod/thing.php:352
-msgid "Name of thing e.g. something"
-msgstr "Naam van ding"
+#: ../../include/nav.php:193
+msgid "See all notifications"
+msgstr "Alle notificaties weergeven"
-#: ../../mod/thing.php:305 ../../mod/thing.php:353
-msgid "URL of thing (optional)"
-msgstr "URL van ding (optioneel)"
+#: ../../include/nav.php:196
+msgid "Private mail"
+msgstr "Privéberichten"
-#: ../../mod/thing.php:307 ../../mod/thing.php:354
-msgid "URL for photo of thing (optional)"
-msgstr "URL voor foto van ding (optioneel)"
+#: ../../include/nav.php:197
+msgid "See all private messages"
+msgstr "Alle privéberichten weergeven"
-#: ../../mod/thing.php:345
-msgid "Add Thing to your Profile"
-msgstr "Ding aan je profiel toevoegen"
+#: ../../include/nav.php:198
+msgid "Mark all private messages seen"
+msgstr "Markeer alle privéberichten als bekeken"
-#: ../../mod/uexport.php:51 ../../mod/uexport.php:52
-msgid "Export Channel"
-msgstr "Kanaal exporteren"
+#: ../../include/nav.php:204
+msgid "Event Calendar"
+msgstr "Agenda"
-#: ../../mod/uexport.php:53
-msgid ""
-"Export your basic channel information to a file. This acts as a backup of "
-"your connections, permissions, profile and basic data, which can be used to "
-"import your data to a new server hub, but does not contain your content."
-msgstr "Exporteer de basisinformatie van jouw kanaal naar een bestand. Dit fungeert als een back-up van jouw connecties, permissies, profiel en basisgegevens, die gebruikt kan worden om op een nieuwe hub jouw gegevens te importeren. Deze back-up bevat echter niet de inhoud van jouw kanaal."
+#: ../../include/nav.php:205
+msgid "See all events"
+msgstr "Alle gebeurtenissen weergeven"
-#: ../../mod/uexport.php:54
-msgid "Export Content"
-msgstr "Inhoud exporteren"
+#: ../../include/nav.php:206
+msgid "Mark all events seen"
+msgstr "Markeer alle gebeurtenissen als bekeken"
-#: ../../mod/uexport.php:55
-msgid ""
-"Export your channel information and recent content to a JSON backup that can"
-" be restored or imported to another server hub. This backs up all of your "
-"connections, permissions, profile data and several months of posts. This "
-"file may be VERY large. Please be patient - it may take several minutes for"
-" this download to begin."
-msgstr "Exporteer informatie en recente inhoud van jouw kanaal naar een JSON-back-up, wat kan worden gebruikt om jouw kanaal te herstellen of te importeren op een andere hub. Dit slaat al jouw connecties, permissies, profielgegevens en enkele maanden aan inhoud van jouw kanaal op. Dit bestand kan ZEER groot worden. Wees geduldig - het kan enkele minuten duren voordat de download begint."
+#: ../../include/nav.php:209
+msgid "Manage Your Channels"
+msgstr "Beheer je kanalen"
-#: ../../mod/uexport.php:56
-msgid "Export your posts from a given year."
-msgstr "Exporteer jouw berichten uit een bepaald jaar."
+#: ../../include/nav.php:211
+msgid "Account/Channel Settings"
+msgstr "Account-/kanaal-instellingen"
-#: ../../mod/uexport.php:58
-msgid ""
-"You may also export your posts and conversations for a particular year or "
-"month. Adjust the date in your browser location bar to select other dates. "
-"If the export fails (possibly due to memory exhaustion on your server hub), "
-"please try again selecting a more limited date range."
-msgstr "Je kan ook berichten en conversaties uit een bepaald jaar of van een bepaalde maand exporteren. Verander de datum in de adresbalk van jouw webbrowser om andere jaren en maanden te selecteren. Wanneer het exporteren mislukt (waarschijnlijk door een gebrek aan beschikbaar servergeheugen), probeer het dan nogmaals met een beperkter tijdvak."
+#: ../../include/nav.php:219
+msgid "Site Setup and Configuration"
+msgstr "Hub instellen en beheren"
-#: ../../mod/uexport.php:59
-#, php-format
-msgid ""
-"To select all posts for a given year, such as this year, visit <a "
-"href=\"%1$s\">%2$s</a>"
-msgstr "Bezoek <a href=\"%1$s\">%2$s</a> om alle berichten van bijvoorbeeld dit jaar te selecteren. "
+#: ../../include/nav.php:261
+msgid "@name, #tag, ?doc, content"
+msgstr "@kanaal, #tag, inhoud, ?hulp"
-#: ../../mod/uexport.php:60
-#, php-format
-msgid ""
-"To select all posts for a given month, such as January of this year, visit "
-"<a href=\"%1$s\">%2$s</a>"
-msgstr "Bezoek <a href=\"%1$s\">%2$s</a> om alle berichten van bijvoorbeeld januari dit jaar te selecteren."
+#: ../../include/nav.php:262
+msgid "Please wait..."
+msgstr "Wachten aub..."
-#: ../../mod/uexport.php:61
-#, php-format
-msgid ""
-"These content files may be imported or restored by visiting <a "
-"href=\"%1$s\">%2$s</a> on any site containing your channel. For best results"
-" please import or restore these in date order (oldest first)."
-msgstr "Deze back-up-bestanden kunnen geïmporteerd of hersteld worden door op jouw hub en met jouw kanaal <a href=\"%1$s\">%2$s</a> te bezoeken. Voor het beste resultaat kan je de bestanden in chronologische volgorde importeren of herstellen."
+#: ../../include/zot.php:680
+msgid "Invalid data packet"
+msgstr "Datapakket ongeldig"
-#: ../../mod/viewconnections.php:59
-msgid "No connections."
-msgstr "Geen connecties."
+#: ../../include/zot.php:696
+msgid "Unable to verify channel signature"
+msgstr "Kanaalkenmerk kon niet worden geverifieerd. "
-#: ../../mod/viewconnections.php:72
+#: ../../include/zot.php:2332
#, php-format
-msgid "Visit %s's profile [%s]"
-msgstr "Bezoek het profiel van %s [%s]"
-
-#: ../../mod/viewconnections.php:101
-msgid "View Connections"
-msgstr "Connecties weergeven"
-
-#: ../../mod/viewsrc.php:40
-msgid "Source of Item"
-msgstr "Bron van item"
-
-#: ../../mod/xchan.php:6
-msgid "Xchan Lookup"
-msgstr "Xchan opzoeken"
+msgid "Unable to verify site signature for %s"
+msgstr "Hubkenmerk voor %s kon niet worden geverifieerd"
-#: ../../mod/xchan.php:9
-msgid "Lookup xchan beginning with (or webbie): "
-msgstr "Zoek een xchan (of webbie) die begint met:"
+#: ../../include/zot.php:3670
+msgid "invalid target signature"
+msgstr "ongeldig doelkenmerk"
#: ../../view/theme/redbasic/php/config.php:82
msgid "Focus (Hubzilla default)"
@@ -9597,62 +9768,62 @@ msgstr "Grootte profielfoto's van berichten instellen"
msgid "Set size of followup author photos"
msgstr "Grootte profielfoto's van reacties instellen"
-#: ../../boot.php:1073
+#: ../../boot.php:1075
#, php-format
msgctxt "opensearch"
msgid "Search %1$s (%2$s)"
msgstr "Zoek %1$s (%2$s)"
-#: ../../boot.php:1073
+#: ../../boot.php:1075
msgctxt "opensearch"
msgid "$Projectname"
msgstr "$Projectname"
-#: ../../boot.php:1390
+#: ../../boot.php:1392
#, php-format
msgid "Update %s failed. See error logs."
msgstr "Update %s mislukt. Zie foutenlogboek."
-#: ../../boot.php:1393
+#: ../../boot.php:1395
#, php-format
msgid "Update Error at %s"
msgstr "Update-fout op %s"
-#: ../../boot.php:1581
+#: ../../boot.php:1583
msgid ""
"Create an account to access services and applications within the Hubzilla"
msgstr "Maak een account aan om toegang te krijgen tot diensten en toepassingen van Hubzilla"
-#: ../../boot.php:1603
+#: ../../boot.php:1605
msgid "Password"
msgstr "Wachtwoord"
-#: ../../boot.php:1604
+#: ../../boot.php:1606
msgid "Remember me"
msgstr "Aangemeld blijven"
-#: ../../boot.php:1607
+#: ../../boot.php:1609
msgid "Forgot your password?"
msgstr "Wachtwoord vergeten?"
-#: ../../boot.php:2236
+#: ../../boot.php:2238
msgid "toggle mobile"
msgstr "mobiele weergave omschakelen"
-#: ../../boot.php:2389
+#: ../../boot.php:2391
msgid "Website SSL certificate is not valid. Please correct."
msgstr "Het SSL-certificaat van deze website is ongeldig. Corrigeer dit a.u.b."
-#: ../../boot.php:2392
+#: ../../boot.php:2394
#, php-format
msgid "[hubzilla] Website SSL error for %s"
msgstr "[hubzilla] Probleem met SSL-certificaat voor %s"
-#: ../../boot.php:2429
+#: ../../boot.php:2431
msgid "Cron/Scheduled tasks not running."
msgstr "Cron is niet actief"
-#: ../../boot.php:2433
+#: ../../boot.php:2435
#, php-format
msgid "[hubzilla] Cron tasks not running on %s"
msgstr "[hubzilla] Cron-taken zijn niet actief op %s"
diff --git a/view/nl/hstrings.php b/view/nl/hstrings.php
index 3df6c9520..72fc4d2e1 100644
--- a/view/nl/hstrings.php
+++ b/view/nl/hstrings.php
@@ -34,1010 +34,12 @@ App::$strings["Not Found"] = "Niet gevonden";
App::$strings["Page not found."] = "Pagina niet gevonden.";
App::$strings["Remote authentication blocked. You are logged into this site locally. Please logout and retry."] = "Authenticatie op afstand geblokkeerd. Je bent lokaal op deze hub ingelogd. Uitloggen en opnieuw proberen.";
App::$strings["Welcome %s. Remote authentication successful."] = "Welkom %s. Authenticatie op afstand geslaagd.";
-App::$strings["No username found in import file."] = "Geen gebruikersnaam in het importbestand gevonden.";
-App::$strings["Unable to create a unique channel address. Import failed."] = "Niet in staat om een uniek kanaaladres aan te maken. Importeren is mislukt.";
-App::$strings["Import completed."] = "Import voltooid.";
-App::$strings["Cannot locate DNS info for database server '%s'"] = "Kan DNS-informatie voor databaseserver '%s' niet vinden";
-App::$strings["Profile Photos"] = "Profielfoto's";
-App::$strings["Unable to obtain identity information from database"] = "Niet in staat om identiteitsinformatie uit de database te verkrijgen";
-App::$strings["Empty name"] = "Ontbrekende naam";
-App::$strings["Name too long"] = "Naam te lang";
-App::$strings["No account identifier"] = "Geen account-identificator";
-App::$strings["Nickname is required."] = "Bijnaam is verplicht";
-App::$strings["Reserved nickname. Please choose another."] = "Deze naam is gereserveerd. Kies een andere.";
-App::$strings["Nickname has unsupported characters or is already being used on this site."] = "Deze naam heeft niet ondersteunde karakters of is al op deze hub in gebruik.";
-App::$strings["Unable to retrieve created identity"] = "Niet in staat om aangemaakte identiteit te vinden";
-App::$strings["Default Profile"] = "Standaardprofiel";
-App::$strings["Friends"] = "Vrienden";
-App::$strings["Requested channel is not available."] = "Opgevraagd kanaal is niet beschikbaar.";
App::$strings["Requested profile is not available."] = "Opgevraagd profiel is niet beschikbaar";
-App::$strings["Change profile photo"] = "Profielfoto veranderen";
-App::$strings["Edit Profiles"] = "Bewerk profielen";
-App::$strings["Create New Profile"] = "Nieuw profiel aanmaken";
-App::$strings["Edit Profile"] = "Profiel bewerken";
-App::$strings["Profile Image"] = "Profielfoto";
-App::$strings["Visible to everybody"] = "Voor iedereen zichtbaar";
-App::$strings["Edit visibility"] = "Zichtbaarheid bewerken";
-App::$strings["Connect"] = "Verbinden";
-App::$strings["Location:"] = "Plaats:";
-App::$strings["Gender:"] = "Geslacht:";
-App::$strings["Status:"] = "Status:";
-App::$strings["Homepage:"] = "Homepagina:";
-App::$strings["Online Now"] = "Nu online";
-App::$strings["g A l F d"] = "G:i, l d F";
-App::$strings["F d"] = "d F";
-App::$strings["[today]"] = "[vandaag]";
-App::$strings["Birthday Reminders"] = "Verjaardagsherinneringen";
-App::$strings["Birthdays this week:"] = "Verjaardagen deze week:";
-App::$strings["[No description]"] = "[Geen omschrijving]";
-App::$strings["Event Reminders"] = "Herinneringen";
-App::$strings["Events this week:"] = "Gebeurtenissen deze week:";
-App::$strings["Full Name:"] = "Volledige naam:";
-App::$strings["Like this channel"] = "Vind dit kanaal leuk";
-App::$strings["__ctx:noun__ Like"] = array(
- 0 => "vindt dit leuk",
- 1 => "vinden dit leuk",
-);
-App::$strings["j F, Y"] = "F j Y";
-App::$strings["j F"] = "F j";
-App::$strings["Birthday:"] = "Geboortedatum:";
-App::$strings["Age:"] = "Leeftijd:";
-App::$strings["for %1\$d %2\$s"] = "voor %1\$d %2\$s";
-App::$strings["Sexual Preference:"] = "Seksuele voorkeur:";
-App::$strings["Hometown:"] = "Oorspronkelijk uit:";
-App::$strings["Tags:"] = "Tags:";
-App::$strings["Political Views:"] = "Politieke overtuigingen:";
-App::$strings["Religion:"] = "Religie:";
-App::$strings["About:"] = "Over:";
-App::$strings["Hobbies/Interests:"] = "Hobby's/interesses:";
-App::$strings["Likes:"] = "Houdt van:";
-App::$strings["Dislikes:"] = "Houdt niet van:";
-App::$strings["Contact information and Social Networks:"] = "Contactinformatie en sociale netwerken:";
-App::$strings["My other channels:"] = "Mijn andere kanalen";
-App::$strings["Musical interests:"] = "Muzikale interesses:";
-App::$strings["Books, literature:"] = "Boeken, literatuur:";
-App::$strings["Television:"] = "Televisie:";
-App::$strings["Film/dance/culture/entertainment:"] = "Films/dansen/cultuur/vermaak:";
-App::$strings["Love/Romance:"] = "Liefde/romantiek:";
-App::$strings["Work/employment:"] = "Werk/beroep:";
-App::$strings["School/education:"] = "School/opleiding:";
-App::$strings["Profile"] = "Profiel";
-App::$strings["Like this thing"] = "Vind dit ding leuk";
-App::$strings["cover photo"] = "omslagfoto";
-App::$strings["created a new post"] = "maakte een nieuw bericht aan";
-App::$strings["commented on %s's post"] = "gaf een reactie op een bericht van %s";
-App::$strings["Private Message"] = "Niet voor iedereen zichtbaar";
-App::$strings["Select"] = "Kies";
-App::$strings["Save to Folder"] = "In map opslaan";
-App::$strings["I will attend"] = "Aanwezig";
-App::$strings["I will not attend"] = "Niet aanwezig";
-App::$strings["I might attend"] = "Mogelijk aanwezig";
-App::$strings["I agree"] = "Eens";
-App::$strings["I disagree"] = "Oneens";
-App::$strings["I abstain"] = "Onthouding";
-App::$strings["View all"] = "Toon alles";
-App::$strings["__ctx:noun__ Dislike"] = array(
- 0 => "vindt dit niet leuk",
- 1 => "vinden dit niet leuk",
-);
-App::$strings["Add Star"] = "Ster toevoegen";
-App::$strings["Remove Star"] = "Ster verwijderen";
-App::$strings["Toggle Star Status"] = "Ster toevoegen of verwijderen";
-App::$strings["starred"] = "met ster";
-App::$strings["Message signature validated"] = "Berichtkenmerk gevalideerd";
-App::$strings["Message signature incorrect"] = "Berichtkenmerk onjuist";
-App::$strings["Add Tag"] = "Tag toevoegen";
-App::$strings["I like this (toggle)"] = "Vind ik leuk";
-App::$strings["like"] = "vind dit leuk";
-App::$strings["I don't like this (toggle)"] = "Vind ik niet leuk";
-App::$strings["dislike"] = "vind dit niet leuk";
-App::$strings["Share This"] = "Delen";
-App::$strings["share"] = "delen";
-App::$strings["Delivery Report"] = "Afleveringsrapport";
-App::$strings["%d comment"] = array(
- 0 => "%d reactie",
- 1 => "%d reacties weergeven",
-);
-App::$strings["View %s's profile - %s"] = "Profiel van %s bekijken - %s";
-App::$strings["to"] = "aan";
-App::$strings["via"] = "via";
-App::$strings["Wall-to-Wall"] = "Kanaal-naar-kanaal";
-App::$strings["via Wall-To-Wall:"] = "via kanaal-naar-kanaal";
-App::$strings["from %s"] = "van %s";
-App::$strings["last edited: %s"] = "laatst bewerkt: %s";
-App::$strings["Expires: %s"] = "Verloopt: %s";
-App::$strings["Save Bookmarks"] = "Bladwijzers opslaan";
-App::$strings["Add to Calendar"] = "Aan agenda toevoegen";
-App::$strings["Mark all seen"] = "Markeer alles als bekeken";
-App::$strings["__ctx:noun__ Likes"] = "vinden dit leuk";
-App::$strings["__ctx:noun__ Dislikes"] = "vinden dit niet leuk";
-App::$strings["Close"] = "Sluiten";
-App::$strings["Please wait"] = "Even wachten";
-App::$strings["[+] show all"] = "[+] alle";
-App::$strings["This is you"] = "Dit ben jij";
-App::$strings["Comment"] = "Reactie";
-App::$strings["Submit"] = "Opslaan";
-App::$strings["Bold"] = "Vet";
-App::$strings["Italic"] = "Cursief";
-App::$strings["Underline"] = "Onderstrepen";
-App::$strings["Quote"] = "Citeren";
-App::$strings["Code"] = "Broncode";
-App::$strings["Image"] = "Afbeelding";
-App::$strings["Insert Link"] = "Link invoegen";
-App::$strings["Video"] = "Video";
-App::$strings["Preview"] = "Voorvertoning";
-App::$strings["Encrypt text"] = "Tekst versleutelen";
-App::$strings["Not a valid email address"] = "Geen geldig e-mailadres";
-App::$strings["Your email domain is not among those allowed on this site"] = "Jouw e-maildomein is op deze hub niet toegestaan";
-App::$strings["Your email address is already registered at this site."] = "Jouw e-mailadres is al op deze hub geregistreerd.";
-App::$strings["An invitation is required."] = "Een uitnodiging is vereist";
-App::$strings["Invitation could not be verified."] = "Uitnodiging kon niet geverifieerd worden";
-App::$strings["Please enter the required information."] = "Vul de vereiste informatie in.";
-App::$strings["Failed to store account information."] = "Account-informatie kon niet opgeslagen worden.";
-App::$strings["Registration confirmation for %s"] = "Registratiebevestiging voor %s";
-App::$strings["Registration request at %s"] = "Registratiebevestiging voor %s";
-App::$strings["Administrator"] = "Beheerder";
-App::$strings["your registration password"] = "jouw registratiewachtwoord";
-App::$strings["Registration details for %s"] = "Registratiegegevens voor %s";
-App::$strings["Account approved."] = "Account goedgekeurd";
-App::$strings["Registration revoked for %s"] = "Registratie ingetrokken voor %s";
-App::$strings["Account verified. Please login."] = "Account is geverifieerd. Je kan inloggen.";
-App::$strings["Click here to upgrade."] = "Klik hier om te upgraden.";
-App::$strings["This action exceeds the limits set by your subscription plan."] = "Deze handeling overschrijdt de beperkingen die voor jouw abonnement gelden.";
-App::$strings["This action is not available under your subscription plan."] = "Deze handeling is niet mogelijk met jouw abonnement.";
-App::$strings["Male"] = "Man";
-App::$strings["Female"] = "Vrouw";
-App::$strings["Currently Male"] = "Momenteel man";
-App::$strings["Currently Female"] = "Momenteel vrouw";
-App::$strings["Mostly Male"] = "Voornamelijk man";
-App::$strings["Mostly Female"] = "Voornamelijk vrouw";
-App::$strings["Transgender"] = "Transgender";
-App::$strings["Intersex"] = "Interseksueel";
-App::$strings["Transsexual"] = "Transseksueel";
-App::$strings["Hermaphrodite"] = "Hermafrodiet";
-App::$strings["Neuter"] = "Genderneutraal";
-App::$strings["Non-specific"] = "Niet gespecificeerd";
-App::$strings["Other"] = "Anders";
-App::$strings["Undecided"] = "Nog niet beslist";
-App::$strings["Males"] = "Mannen";
-App::$strings["Females"] = "Vrouwen";
-App::$strings["Gay"] = "Homoseksueel";
-App::$strings["Lesbian"] = "Lesbisch";
-App::$strings["No Preference"] = "Geen voorkeur";
-App::$strings["Bisexual"] = "Biseksueel";
-App::$strings["Autosexual"] = "Autoseksueel";
-App::$strings["Abstinent"] = "Seksuele onthouding";
-App::$strings["Virgin"] = "Maagd";
-App::$strings["Deviant"] = "Afwijkend";
-App::$strings["Fetish"] = "Fetisj";
-App::$strings["Oodles"] = "Veel";
-App::$strings["Nonsexual"] = "Aseksueel";
-App::$strings["Single"] = "Alleen";
-App::$strings["Lonely"] = "Eenzaam";
-App::$strings["Available"] = "Beschikbaar";
-App::$strings["Unavailable"] = "Niet beschikbaar";
-App::$strings["Has crush"] = "Heeft een oogje op iemand";
-App::$strings["Infatuated"] = "Smoorverliefd";
-App::$strings["Dating"] = "Aan het daten";
-App::$strings["Unfaithful"] = "Ontrouw";
-App::$strings["Sex Addict"] = "Seksverslaafd";
-App::$strings["Friends/Benefits"] = "Vriendschap plus";
-App::$strings["Casual"] = "Ongebonden/vluchtig";
-App::$strings["Engaged"] = "Verloofd";
-App::$strings["Married"] = "Getrouwd";
-App::$strings["Imaginarily married"] = "Denkbeeldig getrouwd";
-App::$strings["Partners"] = "Partners";
-App::$strings["Cohabiting"] = "Samenwonend";
-App::$strings["Common law"] = "Common-law-huwelijk";
-App::$strings["Happy"] = "Gelukkig";
-App::$strings["Not looking"] = "Niet op zoek";
-App::$strings["Swinger"] = "Swinger";
-App::$strings["Betrayed"] = "Verraden";
-App::$strings["Separated"] = "Uit elkaar";
-App::$strings["Unstable"] = "Onstabiel";
-App::$strings["Divorced"] = "Gescheiden";
-App::$strings["Imaginarily divorced"] = "Denkbeeldig gescheiden";
-App::$strings["Widowed"] = "Weduwnaar/weduwe";
-App::$strings["Uncertain"] = "Onzeker";
-App::$strings["It's complicated"] = "Het is ingewikkeld";
-App::$strings["Don't care"] = "Maakt mij niks uit";
-App::$strings["Ask me"] = "Vraag het me";
-App::$strings["Visible to your default audience"] = "Voor iedereen zichtbaar, mits niet anders ingesteld";
-App::$strings["Show"] = "Tonen";
-App::$strings["Don't show"] = "Niet tonen";
-App::$strings["Other networks and post services"] = "Andere netwerken en diensten";
-App::$strings["Permissions"] = "Permissies";
-App::$strings[" and "] = " en ";
-App::$strings["public profile"] = "openbaar profiel";
-App::$strings["%1\$s changed %2\$s to &ldquo;%3\$s&rdquo;"] = "%1\$s veranderde %2\$s naar &ldquo;%3\$s&rdquo;";
-App::$strings["Visit %1\$s's %2\$s"] = "Bezoek het %2\$s van %1\$s";
-App::$strings["%1\$s has an updated %2\$s, changing %3\$s."] = "%1\$s heeft een aangepaste %2\$s, %3\$s veranderd.";
-App::$strings["Site Admin"] = "Hubbeheerder";
-App::$strings["Bookmarks"] = "Bladwijzers";
-App::$strings["Address Book"] = "Connecties";
-App::$strings["Login"] = "Inloggen";
-App::$strings["Channel Manager"] = "Kanaalbeheer";
-App::$strings["Grid"] = "Grid";
-App::$strings["Settings"] = "Instellingen";
-App::$strings["Webpages"] = "Webpagina's";
-App::$strings["Channel Home"] = "Jouw kanaal";
-App::$strings["Photos"] = "Foto's";
-App::$strings["Events"] = "Agenda";
-App::$strings["Directory"] = "Kanalengids";
-App::$strings["Help"] = "Hulp";
-App::$strings["Mail"] = "Privéberichten";
-App::$strings["Mood"] = "Stemming";
-App::$strings["Poke"] = "Aanstoten";
-App::$strings["Chat"] = "Chatten";
-App::$strings["Search"] = "Zoeken";
-App::$strings["Probe"] = "Onderzoeken";
-App::$strings["Suggest"] = "Voorstellen";
-App::$strings["Random Channel"] = "Willekeurig kanaal";
-App::$strings["Invite"] = "Uitnodigen ";
-App::$strings["Features"] = "Extra functies";
-App::$strings["Language"] = "Taal";
-App::$strings["Post"] = "Bericht";
-App::$strings["Profile Photo"] = "Profielfoto";
-App::$strings["Update"] = "Bijwerken";
-App::$strings["Install"] = "Installeren";
-App::$strings["Purchase"] = "Aanschaffen";
-App::$strings["Permission denied"] = "Toegang geweigerd";
-App::$strings["(Unknown)"] = "(Onbekend)";
-App::$strings["Visible to anybody on the internet."] = "Voor iedereen op het internet zichtbaar.";
-App::$strings["Visible to you only."] = "Alleen voor jou zichtbaar.";
-App::$strings["Visible to anybody in this network."] = "Voor iedereen in dit netwerk zichtbaar.";
-App::$strings["Visible to anybody authenticated."] = "Voor iedereen die geauthenticeerd is zichtbaar.";
-App::$strings["Visible to anybody on %s."] = "Voor iedereen op %s zichtbaar.";
-App::$strings["Visible to all connections."] = "Voor alle connecties zichtbaar.";
-App::$strings["Visible to approved connections."] = "Voor alle geaccepteerde connecties zichtbaar.";
-App::$strings["Visible to specific connections."] = "Voor specifieke connecties zichtbaar.";
-App::$strings["Item not found."] = "Item niet gevonden.";
-App::$strings["Privacy group not found."] = "Privacygroep niet gevonden";
-App::$strings["Privacy group is empty."] = "Privacygroep is leeg";
-App::$strings["Privacy group: %s"] = "Privacygroep: %s";
-App::$strings["Connection: %s"] = "Connectie: %s";
-App::$strings["Connection not found."] = "Connectie niet gevonden.";
-App::$strings["female"] = "vrouw";
-App::$strings["%1\$s updated her %2\$s"] = "%1\$s heeft haar %2\$s bijgewerkt";
-App::$strings["male"] = "man";
-App::$strings["%1\$s updated his %2\$s"] = "%1\$s heeft zijn %2\$s bijgewerkt";
-App::$strings["%1\$s updated their %2\$s"] = "De %2\$s van %1\$s is bijgewerkt";
-App::$strings["profile photo"] = "profielfoto";
-App::$strings["view full size"] = "volledige grootte tonen";
-App::$strings["\$Projectname Notification"] = "\$Projectname-notificatie";
-App::$strings["\$projectname"] = "\$projectname";
-App::$strings["Thank You,"] = "Bedankt,";
-App::$strings["%s Administrator"] = "Beheerder %s";
-App::$strings["No Subject"] = "Geen onderwerp";
-App::$strings["Image exceeds website size limit of %lu bytes"] = "Afbeelding is groter dan op deze hub toegestane limiet van %lu bytes";
-App::$strings["Image file is empty."] = "Afbeeldingsbestand is leeg";
-App::$strings["Unable to process image"] = "Afbeelding kan niet verwerkt worden";
-App::$strings["Photo storage failed."] = "Foto kan niet worden opgeslagen";
-App::$strings["a new photo"] = "een nieuwe foto";
-App::$strings["__ctx:photo_upload__ %1\$s posted %2\$s to %3\$s"] = "%1\$s plaatste %2\$s op %3\$s";
-App::$strings["Photo Albums"] = "Fotoalbums";
-App::$strings["Upload New Photos"] = "Nieuwe foto's uploaden";
-App::$strings["Attachments:"] = "Bijlagen:";
-App::$strings["l F d, Y \\@ g:i A"] = "l d F Y \\@ G:i";
-App::$strings["\$Projectname event notification:"] = "Notificatie \$Projectname-gebeurtenis:";
-App::$strings["Starts:"] = "Start:";
-App::$strings["Finishes:"] = "Einde:";
-App::$strings["Image/photo"] = "Afbeelding/foto";
-App::$strings["Encrypted content"] = "Versleutelde inhoud";
-App::$strings["Install %s element: "] = "Installeer %s-element: ";
-App::$strings["This post contains an installable %s element, however you lack permissions to install it on this site."] = "Dit bericht heeft een te installeren %s-element, maar je hebt geen permissies om het op deze hub te installeren.";
-App::$strings["webpage"] = "Webpagina";
-App::$strings["layout"] = "lay-out";
-App::$strings["block"] = "blok";
-App::$strings["menu"] = "menu";
-App::$strings["%1\$s wrote the following %2\$s %3\$s"] = "%1\$s schreef het volgende %2\$s %3\$s";
-App::$strings["post"] = "bericht";
-App::$strings["Different viewers will see this text differently"] = "Deze tekst wordt per persoon anders weergeven.";
-App::$strings["$1 spoiler"] = "$1 spoiler";
-App::$strings["$1 wrote:"] = "$1 schreef:";
-App::$strings["photo"] = "foto";
-App::$strings["event"] = "gebeurtenis";
-App::$strings["channel"] = "kanaal";
-App::$strings["status"] = "bericht";
-App::$strings["comment"] = "reactie";
-App::$strings["%1\$s likes %2\$s's %3\$s"] = "%1\$s vindt %3\$s van %2\$s leuk";
-App::$strings["%1\$s doesn't like %2\$s's %3\$s"] = "%1\$s vindt %3\$s van %2\$s niet leuk";
-App::$strings["%1\$s is now connected with %2\$s"] = "%1\$s is nu met %2\$s verbonden";
-App::$strings["%1\$s poked %2\$s"] = "%1\$s heeft %2\$s aangestoten";
-App::$strings["poked"] = "aangestoten";
-App::$strings["__ctx:mood__ %1\$s is %2\$s"] = "%1\$s is %2\$s";
-App::$strings["__ctx:title__ Likes"] = "vinden dit leuk";
-App::$strings["__ctx:title__ Dislikes"] = "vinden dit niet leuk";
-App::$strings["__ctx:title__ Agree"] = "eens";
-App::$strings["__ctx:title__ Disagree"] = "oneens";
-App::$strings["__ctx:title__ Abstain"] = "onthoudingen";
-App::$strings["__ctx:title__ Attending"] = "aanwezig";
-App::$strings["__ctx:title__ Not attending"] = "niet aanwezig";
-App::$strings["__ctx:title__ Might attend"] = "mogelijk aanwezig";
-App::$strings["View %s's profile @ %s"] = "Bekijk het profiel van %s @ %s";
-App::$strings["Categories:"] = "Categorieën:";
-App::$strings["Filed under:"] = "Bewaard onder:";
-App::$strings["View in context"] = "In context bekijken";
-App::$strings["remove"] = "verwijderen";
-App::$strings["Loading..."] = "Aan het laden...";
-App::$strings["Delete Selected Items"] = "Verwijder de geselecteerde items";
-App::$strings["View Source"] = "Bron weergeven";
-App::$strings["Follow Thread"] = "Conversatie volgen";
-App::$strings["Unfollow Thread"] = "Conversatie niet meer volgen";
-App::$strings["View Profile"] = "Profiel weergeven";
-App::$strings["Activity/Posts"] = "Activiteit/berichten connectie";
-App::$strings["Edit Connection"] = "Connectie bewerken";
-App::$strings["Message"] = "Bericht";
-App::$strings["Ratings"] = "Beoordelingen";
-App::$strings["%s likes this."] = "%s vindt dit leuk.";
-App::$strings["%s doesn't like this."] = "%s vindt dit niet leuk.";
-App::$strings["<span %1\$s>%2\$d people</span> like this."] = array(
- 0 => "<span %1\$s>%2\$d persoon</span> vindt dit leuk.",
- 1 => "<span %1\$s>%2\$d personen</span> vinden dit leuk.",
-);
-App::$strings["<span %1\$s>%2\$d people</span> don't like this."] = array(
- 0 => "<span %1\$s>%2\$d persoon</span> vindt dit niet leuk.",
- 1 => "<span %1\$s>%2\$d personen</span> vinden dit niet leuk.",
-);
-App::$strings["and"] = "en";
-App::$strings[", and %d other people"] = array(
- 0 => ", en %d ander persoon",
- 1 => ", en %d andere personen",
-);
-App::$strings["%s like this."] = "%s vinden dit leuk.";
-App::$strings["%s don't like this."] = "%s vinden dit niet leuk.";
-App::$strings["Visible to <strong>everybody</strong>"] = "Voor <strong>iedereen</strong> zichtbaar";
-App::$strings["Please enter a link URL:"] = "Vul een URL in:";
-App::$strings["Please enter a video link/URL:"] = "Vul een videolink/URL in:";
-App::$strings["Please enter an audio link/URL:"] = "Vul een audiolink/URL in:";
-App::$strings["Tag term:"] = "Tag:";
-App::$strings["Save to Folder:"] = "Bewaar in map: ";
-App::$strings["Where are you right now?"] = "Waar bevind je je op dit moment?";
-App::$strings["Expires YYYY-MM-DD HH:MM"] = "Verloopt op DD-MM-YYYY om HH:MM";
-App::$strings["Share"] = "Delen";
-App::$strings["Page link name"] = "Linknaam pagina";
-App::$strings["Post as"] = "Bericht plaatsen als";
-App::$strings["Upload photo"] = "Foto uploaden";
-App::$strings["upload photo"] = "foto uploaden";
-App::$strings["Attach file"] = "Bestand toevoegen";
-App::$strings["attach file"] = "bestand toevoegen";
-App::$strings["Insert web link"] = "Weblink invoegen";
-App::$strings["web link"] = "Weblink";
-App::$strings["Insert video link"] = "Videolink invoegen";
-App::$strings["video link"] = "videolink";
-App::$strings["Insert audio link"] = "Audiolink invoegen";
-App::$strings["audio link"] = "audiolink";
-App::$strings["Set your location"] = "Locatie instellen";
-App::$strings["set location"] = "locatie instellen";
-App::$strings["Toggle voting"] = "Peiling in- of uitschakelen";
-App::$strings["Clear browser location"] = "Locatie van webbrowser wissen";
-App::$strings["clear location"] = "locatie wissen";
-App::$strings["Title (optional)"] = "Titel (optioneel)";
-App::$strings["Categories (optional, comma-separated list)"] = "Categorieën (optioneel, door komma's gescheiden lijst)";
-App::$strings["Permission settings"] = "Permissies";
-App::$strings["permissions"] = "permissies";
-App::$strings["Public post"] = "Openbaar bericht";
-App::$strings["Example: bob@example.com, mary@example.com"] = "Voorbeeld: bob@voorbeeld.nl, mary@voorbeeld.be";
-App::$strings["Set expiration date"] = "Verloopdatum instellen";
-App::$strings["Set publish date"] = "Publicatiedatum instellen";
-App::$strings["OK"] = "OK";
-App::$strings["Cancel"] = "Annuleren";
-App::$strings["Discover"] = "Ontdekken";
-App::$strings["Imported public streams"] = "Openbare streams importeren";
-App::$strings["Commented Order"] = "Nieuwe reacties bovenaan";
-App::$strings["Sort by Comment Date"] = "Berichten met nieuwe reacties bovenaan";
-App::$strings["Posted Order"] = "Nieuwe berichten bovenaan";
-App::$strings["Sort by Post Date"] = "Nieuwe berichten bovenaan";
-App::$strings["Personal"] = "Persoonlijk";
-App::$strings["Posts that mention or involve you"] = "Alleen berichten die jou vermelden of waar je op een andere manier bij betrokken bent";
-App::$strings["New"] = "Nieuw";
-App::$strings["Activity Stream - by date"] = "Activiteitenstroom - volgens datum";
-App::$strings["Starred"] = "Met ster";
-App::$strings["Favourite Posts"] = "Favoriete berichten";
-App::$strings["Spam"] = "Spam";
-App::$strings["Posts flagged as SPAM"] = "Berichten gemarkeerd als SPAM";
-App::$strings["Channel"] = "Kanaal";
-App::$strings["Status Messages and Posts"] = "Berichten in dit kanaal";
-App::$strings["About"] = "Over";
-App::$strings["Profile Details"] = "Profiel";
-App::$strings["Files and Storage"] = "Bestanden en opslagruimte";
-App::$strings["Chatrooms"] = "Chatkanalen";
-App::$strings["Saved Bookmarks"] = "Opgeslagen bladwijzers";
-App::$strings["Manage Webpages"] = "Webpagina's beheren";
-App::$strings["__ctx:noun__ Attending"] = array(
- 0 => "aanwezig",
- 1 => "aanwezig",
-);
-App::$strings["__ctx:noun__ Not Attending"] = array(
- 0 => "niet aanwezig",
- 1 => "niet aanwezig",
-);
-App::$strings["__ctx:noun__ Undecided"] = array(
- 0 => "nog niet beslist",
- 1 => "nog niet beslist",
-);
-App::$strings["__ctx:noun__ Agree"] = array(
- 0 => "eens",
- 1 => "eens",
-);
-App::$strings["__ctx:noun__ Disagree"] = array(
- 0 => "oneens",
- 1 => "oneens",
-);
-App::$strings["__ctx:noun__ Abstain"] = array(
- 0 => "onthouding",
- 1 => "onthoudingen",
-);
-App::$strings["%1\$s's bookmarks"] = "Bladwijzers van %1\$s";
-App::$strings["Missing room name"] = "Naam chatkanaal ontbreekt";
-App::$strings["Duplicate room name"] = "Naam chatkanaal bestaat al";
-App::$strings["Invalid room specifier."] = "Ongeldige omschrijving chatkanaal";
-App::$strings["Room not found."] = "Chatkanaal niet gevonden";
-App::$strings["Room is full"] = "Chatkanaal is vol";
-App::$strings["New window"] = "Nieuw venster";
-App::$strings["Open the selected location in a different window or browser tab"] = "Open de geselecteerde locatie in een ander venster of tab";
-App::$strings["User '%s' deleted"] = "Account '%s' verwijderd";
-App::$strings["Logged out."] = "Uitgelogd.";
-App::$strings["Failed authentication"] = "Mislukte authenticatie";
-App::$strings["Login failed."] = "Inloggen mislukt.";
-App::$strings["The form security token was not correct. This probably happened because the form has been opened for too long (>3 hours) before submitting it."] = "De beveiligings-token van het tekstvak was ongeldig. Dit is mogelijk het gevolg van dat er te lang (meer dan 3 uur) gewacht is om de tekst op te slaan. ";
-App::$strings["Default"] = "Standaard";
-App::$strings["Frequently"] = "Regelmatig";
-App::$strings["Hourly"] = "Elk uur";
-App::$strings["Twice daily"] = "Twee keer per dag";
-App::$strings["Daily"] = "Dagelijks";
-App::$strings["Weekly"] = "Wekelijks";
-App::$strings["Monthly"] = "Maandelijks";
-App::$strings["Friendica"] = "Friendica";
-App::$strings["OStatus"] = "OStatus";
-App::$strings["GNU-Social"] = "GNU social";
-App::$strings["RSS/Atom"] = "RSS/Atom";
-App::$strings["Email"] = "E-mail";
-App::$strings["Diaspora"] = "Diaspora";
-App::$strings["Facebook"] = "Facebook";
-App::$strings["Zot"] = "Zot";
-App::$strings["LinkedIn"] = "LinkedIn";
-App::$strings["XMPP/IM"] = "XMPP/IM";
-App::$strings["MySpace"] = "MySpace";
-App::$strings["%d invitation available"] = array(
- 0 => "%d uitnodiging beschikbaar",
- 1 => "%d uitnodigingen beschikbaar",
-);
-App::$strings["Advanced"] = "Geavanceerd";
-App::$strings["Find Channels"] = "Kanalen vinden";
-App::$strings["Enter name or interest"] = "Vul naam of interesse in";
-App::$strings["Connect/Follow"] = "Verbinden/volgen";
-App::$strings["Examples: Robert Morgenstein, Fishing"] = "Voorbeeld: Robert Morgenstein, vissen";
-App::$strings["Find"] = "Vinden";
-App::$strings["Channel Suggestions"] = "Voorgestelde kanalen";
-App::$strings["Random Profile"] = "Willekeurig profiel";
-App::$strings["Invite Friends"] = "Vrienden uitnodigen";
-App::$strings["Advanced example: name=fred and country=iceland"] = "Geavanceerd voorbeeld (Engels): name=jan en country=nederland";
-App::$strings["Saved Folders"] = "Bewaarde mappen";
-App::$strings["Everything"] = "Alles";
-App::$strings["Categories"] = "Categorieën";
-App::$strings["%d connection in common"] = array(
- 0 => "%d gemeenschappelijke connectie",
- 1 => "%d gemeenschappelijke connecties",
-);
-App::$strings["show more"] = "meer connecties weergeven";
-App::$strings["Item was not found."] = "Item niet gevonden";
-App::$strings["No source file."] = "Geen bronbestand.";
-App::$strings["Cannot locate file to replace"] = "Kan het te vervangen bestand niet vinden";
-App::$strings["Cannot locate file to revise/update"] = "Kan het bestand wat aangepast moet worden niet vinden";
-App::$strings["File exceeds size limit of %d"] = "Bestand is groter dan de toegelaten %d";
-App::$strings["You have reached your limit of %1$.0f Mbytes attachment storage."] = "Je hebt jouw limiet van %1$.0f MB opslagruimte voor bijlagen bereikt.";
-App::$strings["File upload failed. Possible system limit or action terminated."] = "Uploaden van bestand mislukt. Mogelijk systeemlimiet bereikt of actie afgebroken.";
-App::$strings["Stored file could not be verified. Upload failed."] = "Opgeslagen bestand kon niet worden geverifieerd. Uploaden mislukt.";
-App::$strings["Path not available."] = "Pad niet beschikbaar.";
-App::$strings["Empty pathname"] = "Padnaam leeg";
-App::$strings["duplicate filename or path"] = "dubbele bestandsnaam of pad";
-App::$strings["Path not found."] = "Pad niet gevonden";
-App::$strings["mkdir failed."] = "directory aanmaken (mkdir) mislukt.";
-App::$strings["database storage failed."] = "opslag in database mislukt.";
-App::$strings["Empty path"] = "Ontbrekend bestandspad";
-App::$strings["Miscellaneous"] = "Diversen";
-App::$strings["Birthday"] = "Verjaardag of geboortedatum";
-App::$strings["Age: "] = "Leeftijd:";
-App::$strings["YYYY-MM-DD or MM-DD"] = "JJJJ-MM-DD of MM-DD";
-App::$strings["Required"] = "Vereist";
-App::$strings["never"] = "nooit";
-App::$strings["less than a second ago"] = "minder dan een seconde geleden";
-App::$strings["__ctx:e.g. 22 hours ago, 1 minute ago__ %1\$d %2\$s ago"] = "%1\$d %2\$s geleden";
-App::$strings["__ctx:relative_date__ year"] = array(
- 0 => "jaar",
- 1 => "jaren",
-);
-App::$strings["__ctx:relative_date__ month"] = array(
- 0 => "maand",
- 1 => "maanden",
-);
-App::$strings["__ctx:relative_date__ week"] = array(
- 0 => "week",
- 1 => "weken",
-);
-App::$strings["__ctx:relative_date__ day"] = array(
- 0 => "dag",
- 1 => "dagen",
-);
-App::$strings["__ctx:relative_date__ hour"] = array(
- 0 => "uur",
- 1 => "uren",
-);
-App::$strings["__ctx:relative_date__ minute"] = array(
- 0 => "minuut",
- 1 => "minuten",
-);
-App::$strings["__ctx:relative_date__ second"] = array(
- 0 => "seconde",
- 1 => "seconden",
-);
-App::$strings["%1\$s's birthday"] = "Verjaardag van %1\$s";
-App::$strings["Happy Birthday %1\$s"] = "Gefeliciteerd met je verjaardag %1\$s";
-App::$strings["Directory Options"] = "Opties kanalengids";
-App::$strings["Safe Mode"] = "Veilig zoeken";
-App::$strings["No"] = "Nee";
-App::$strings["Yes"] = "Ja";
-App::$strings["Public Forums Only"] = "Alleen openbare forums";
-App::$strings["This Website Only"] = "Alleen deze hub";
-App::$strings["%s <!item_type!>"] = "%s <!item_type!>";
-App::$strings["[Hubzilla:Notify] New mail received at %s"] = "[Hubzilla:Notificatie] Nieuw privébericht ontvangen op %s";
-App::$strings["%1\$s, %2\$s sent you a new private message at %3\$s."] = "%1\$s, %2\$s zond jou een nieuw privébericht om %3\$s.";
-App::$strings["%1\$s sent you %2\$s."] = "%1\$s zond jou %2\$s.";
-App::$strings["a private message"] = "een privébericht";
-App::$strings["Please visit %s to view and/or reply to your private messages."] = "Bezoek %s om je privéberichten te bekijken en/of er op te reageren.";
-App::$strings["%1\$s, %2\$s commented on [zrl=%3\$s]a %4\$s[/zrl]"] = "%1\$s, %2\$s gaf een reactie op [zrl=%3\$s]een %4\$s[/zrl]";
-App::$strings["%1\$s, %2\$s commented on [zrl=%3\$s]%4\$s's %5\$s[/zrl]"] = "%1\$s, %2\$s gaf een reactie op [zrl=%3\$s]een %5\$s van %4\$s[/zrl]";
-App::$strings["%1\$s, %2\$s commented on [zrl=%3\$s]your %4\$s[/zrl]"] = "%1\$s, %2\$s gaf een reactie op [zrl=%3\$s]jouw %4\$s[/zrl]";
-App::$strings["[Hubzilla:Notify] Comment to conversation #%1\$d by %2\$s"] = "[Hubzilla:Notificatie] Reactie op conversatie #%1\$d door %2\$s";
-App::$strings["%1\$s, %2\$s commented on an item/conversation you have been following."] = "%1\$s, %2\$s gaf een reactie op een bericht/conversatie die jij volgt.";
-App::$strings["Please visit %s to view and/or reply to the conversation."] = "Bezoek %s om de conversatie te bekijken en/of er op te reageren.";
-App::$strings["[Hubzilla:Notify] %s posted to your profile wall"] = "[Hubzilla:Notificatie] %s heeft een bericht op jouw kanaal geplaatst";
-App::$strings["%1\$s, %2\$s posted to your profile wall at %3\$s"] = "%1\$s, %2\$s heeft om %3\$s een bericht op jouw kanaal geplaatst";
-App::$strings["%1\$s, %2\$s posted to [zrl=%3\$s]your wall[/zrl]"] = "%1\$s, %2\$s heeft een bericht op [zrl=%3\$s]jouw kanaal[/zrl] geplaatst";
-App::$strings["[Hubzilla:Notify] %s tagged you"] = "[Hubzilla:Notificatie] %s heeft je genoemd";
-App::$strings["%1\$s, %2\$s tagged you at %3\$s"] = "%1\$s, %2\$s noemde jou op %3\$s";
-App::$strings["%1\$s, %2\$s [zrl=%3\$s]tagged you[/zrl]."] = "%1\$s, %2\$s [zrl=%3\$s]noemde jou[/zrl].";
-App::$strings["[Hubzilla:Notify] %1\$s poked you"] = "[Hubzilla:Notificatie] %1\$s heeft je aangestoten";
-App::$strings["%1\$s, %2\$s poked you at %3\$s"] = "%1\$s, %2\$s heeft je aangestoten op %3\$s";
-App::$strings["%1\$s, %2\$s [zrl=%2\$s]poked you[/zrl]."] = "%1\$s, %2\$s [zrl=%2\$s]heeft je aangestoten[/zrl].";
-App::$strings["[Hubzilla:Notify] %s tagged your post"] = "[Hubzilla:Notificatie] %s heeft jouw bericht getagd";
-App::$strings["%1\$s, %2\$s tagged your post at %3\$s"] = "%1\$s, %2\$s heeft jouw bericht om %3\$s getagd";
-App::$strings["%1\$s, %2\$s tagged [zrl=%3\$s]your post[/zrl]"] = "%1\$s, %2\$s heeft [zrl=%3\$s]jouw bericht[/zrl] getagd";
-App::$strings["[Hubzilla:Notify] Introduction received"] = "[Hubzilla:Notificatie] Connectieverzoek ontvangen";
-App::$strings["%1\$s, you've received an new connection request from '%2\$s' at %3\$s"] = "%1\$s, je hebt een nieuw connectieverzoek ontvangen van '%2\$s' op %3\$s";
-App::$strings["%1\$s, you've received [zrl=%2\$s]a new connection request[/zrl] from %3\$s."] = "%1\$s, je hebt een [zrl=%2\$s]nieuw connectieverzoek[/zrl] ontvangen van %3\$s.";
-App::$strings["You may visit their profile at %s"] = "Je kan het profiel bekijken op %s";
-App::$strings["Please visit %s to approve or reject the connection request."] = "Bezoek %s om het connectieverzoek te accepteren of af te wijzen.";
-App::$strings["[Hubzilla:Notify] Friend suggestion received"] = "[Hubzilla:Notificatie] Kanaalvoorstel ontvangen";
-App::$strings["%1\$s, you've received a friend suggestion from '%2\$s' at %3\$s"] = "%1\$s, je hebt een kanaalvoorstel ontvangen van '%2\$s' om %3\$s";
-App::$strings["%1\$s, you've received [zrl=%2\$s]a friend suggestion[/zrl] for %3\$s from %4\$s."] = "%1\$s, je hebt [zrl=%2\$s]een kanaalvoorstel[/zrl] ontvangen voor %3\$s van %4\$s.";
-App::$strings["Name:"] = "Naam:";
-App::$strings["Photo:"] = "Foto:";
-App::$strings["Please visit %s to approve or reject the suggestion."] = "Bezoek %s om het voorstel te accepteren of af te wijzen.";
-App::$strings["[Hubzilla:Notify]"] = "[Hubzilla:Notificatie]";
-App::$strings["This event has been added to your calendar."] = "Dit evenement is aan jouw agenda toegevoegd.";
-App::$strings["Not specified"] = "Niet aangegeven";
-App::$strings["Needs Action"] = "Actie vereist";
-App::$strings["Completed"] = "Voltooid";
-App::$strings["In Process"] = "In behandeling";
-App::$strings["Cancelled"] = "Geannuleerd";
-App::$strings["General Features"] = "Algemene functies";
-App::$strings["Content Expiration"] = "Inhoud laten verlopen";
-App::$strings["Remove posts/comments and/or private messages at a future time"] = "Berichten, reacties en/of privéberichten na een bepaalde tijd verwijderen";
-App::$strings["Multiple Profiles"] = "Meerdere profielen";
-App::$strings["Ability to create multiple profiles"] = "Mogelijkheid om meerdere profielen aan te maken";
-App::$strings["Advanced Profiles"] = "Geavanceerde profielen";
-App::$strings["Additional profile sections and selections"] = "Extra onderdelen en keuzes voor je profiel";
-App::$strings["Profile Import/Export"] = "Profiel importen/exporteren";
-App::$strings["Save and load profile details across sites/channels"] = "Profielgegevens opslaan en in andere hubs/kanalen gebruiken.";
-App::$strings["Web Pages"] = "Webpagina's";
-App::$strings["Provide managed web pages on your channel"] = "Sta beheerde webpagina's op jouw kanaal toe";
-App::$strings["Hide Rating"] = "Beoordelingen verbergen";
-App::$strings["Hide the rating buttons on your channel and profile pages. Note: People can still rate you somewhere else."] = "Verbergt de beoordelingsknoppen op jouw kanaal- en profielpagina's. Let op: Mensen kunnen jou nog steeds ergens anders beoordelen. ";
-App::$strings["Private Notes"] = "Privé-aantekeningen";
-App::$strings["Enables a tool to store notes and reminders (note: not encrypted)"] = "Een eenvoudige toepassing om aantekeningen en herinneringen in te bewaren (let op: niet versleuteld)";
-App::$strings["Navigation Channel Select"] = "Kanaal kiezen in navigatiemenu";
-App::$strings["Change channels directly from within the navigation dropdown menu"] = "Kies een ander kanaal direct vanuit het dropdown-menu op de navigatiebalk";
-App::$strings["Photo Location"] = "Fotolocatie";
-App::$strings["If location data is available on uploaded photos, link this to a map."] = "Wanneer in de geüploade foto's locatiegegevens aanwezig zijn, link dit dan aan een kaart.";
-App::$strings["Access Controlled Chatrooms"] = "Chatkanalen met toegangscontrole ";
-App::$strings["Provide chatrooms and chat services with access control."] = "Chatkanalen en chatdiensten met toegangscontrole aanbieden.";
-App::$strings["Smart Birthdays"] = "Slimme verjaardagen";
-App::$strings["Make birthday events timezone aware in case your friends are scattered across the planet."] = "Maak verjaardagen bewust van tijdzones. Voor het geval dat jouw vrienden over de hele wereld verspreid zijn.";
-App::$strings["Expert Mode"] = "Expertmodus";
-App::$strings["Enable Expert Mode to provide advanced configuration options"] = "Schakel de expertmodus in voor geavanceerde instellingen";
-App::$strings["Premium Channel"] = "Premiumkanaal";
-App::$strings["Allows you to set restrictions and terms on those that connect with your channel"] = "Stelt je in staat om beperkingen en voorwaarden in te stellen voor jouw kanaal";
-App::$strings["Post Composition Features"] = "Functies voor het opstellen van berichten";
-App::$strings["Large Photos"] = "Grote foto's";
-App::$strings["Include large (1024px) photo thumbnails in posts. If not enabled, use small (640px) photo thumbnails"] = "Gebruik grotere foto's (1024px) in berichten. Wanneer dit is uitgeschakeld worden er kleinere foto's (640px) gebruikt.";
-App::$strings["Channel Sources"] = "Kanaalbronnen";
-App::$strings["Automatically import channel content from other channels or feeds"] = "Automatisch inhoud uit andere kanalen of feeds importeren.";
-App::$strings["Even More Encryption"] = "Extra encryptie";
-App::$strings["Allow optional encryption of content end-to-end with a shared secret key"] = "Sta toe dat inhoud extra end-to-end wordt versleuteld met een gedeelde geheime sleutel.";
-App::$strings["Enable Voting Tools"] = "Peilingen inschakelen";
-App::$strings["Provide a class of post which others can vote on"] = "Maakt het mogelijk om een bericht op te stellen, waar mensen op kunnen stemmen.";
-App::$strings["Delayed Posting"] = "Berichten uitstellen";
-App::$strings["Allow posts to be published at a later date"] = "Maakt het mogelijk dat berichten op een toekomstig moment gepubliceerd kunnen worden.";
-App::$strings["Suppress Duplicate Posts/Comments"] = "Dubbele berichten/reacties tegenhouden";
-App::$strings["Prevent posts with identical content to be published with less than two minutes in between submissions."] = "Voorkomt dat berichten en reacties met identieke inhoud en die binnen twee minuten zijn verstuurd, worden gepubliceerd. ";
-App::$strings["Network and Stream Filtering"] = "Netwerk- en streamfilter";
-App::$strings["Search by Date"] = "Zoek op datum";
-App::$strings["Ability to select posts by date ranges"] = "Mogelijkheid om berichten op datum te filteren ";
-App::$strings["Privacy Groups"] = "Privacygroepen";
-App::$strings["Enable management and selection of privacy groups"] = "Beheer en selectie van privacygroepen inschakelen";
-App::$strings["Saved Searches"] = "Opgeslagen zoekopdrachten";
-App::$strings["Save search terms for re-use"] = "Sla zoekopdrachten op voor hergebruik";
-App::$strings["Network Personal Tab"] = "Persoonlijke netwerktab";
-App::$strings["Enable tab to display only Network posts that you've interacted on"] = "Sta het toe dat de tab netwerkberichten toont waarmee je interactie had";
-App::$strings["Network New Tab"] = "Nieuwe netwerktab";
-App::$strings["Enable tab to display all new Network activity"] = "Laat de tab alle nieuwe netwerkactiviteit tonen";
-App::$strings["Affinity Tool"] = "Verwantschapsfilter";
-App::$strings["Filter stream activity by depth of relationships"] = "Filter wat je in jouw grid ziet op hoe goed je iemand kent of mag";
-App::$strings["Connection Filtering"] = "Berichtenfilters";
-App::$strings["Filter incoming posts from connections based on keywords/content"] = "Filter binnenkomende berichten van connecties aan de hand van trefwoorden en taal";
-App::$strings["Suggest Channels"] = "Kanalen voorstellen";
-App::$strings["Show channel suggestions"] = "Voor jou mogelijk interessante kanalen voorstellen";
-App::$strings["Post/Comment Tools"] = "Bericht- en reactiehulpmiddelen";
-App::$strings["Community Tagging"] = "Taggen door anderen";
-App::$strings["Ability to tag existing posts"] = "Geeft andere mensen de mogelijkheid om jouw (bestaande) berichten te taggen";
-App::$strings["Post Categories"] = "Categorieën berichten";
-App::$strings["Add categories to your posts"] = "Voeg categorieën toe aan je berichten";
-App::$strings["Ability to file posts under folders"] = "Mogelijkheid om berichten in mappen op te slaan";
-App::$strings["Dislike Posts"] = "Vind berichten niet leuk";
-App::$strings["Ability to dislike posts/comments"] = "Mogelijkheid om berichten en reacties niet leuk te vinden";
-App::$strings["Star Posts"] = "Geef berichten een ster";
-App::$strings["Ability to mark special posts with a star indicator"] = "Mogelijkheid om speciale berichten met een ster te markeren";
-App::$strings["Tag Cloud"] = "Tagwolk";
-App::$strings["Provide a personal tag cloud on your channel page"] = "Zorgt voor een persoonlijke wolk met tags op jouw kanaalpagina";
-App::$strings["Channel is blocked on this site."] = "Kanaal is op deze hub geblokkeerd.";
-App::$strings["Channel location missing."] = "Ontbrekende kanaallocatie.";
-App::$strings["Response from remote channel was incomplete."] = "Antwoord van het kanaal op afstand was niet volledig.";
-App::$strings["Channel was deleted and no longer exists."] = "Kanaal is verwijderd en bestaat niet meer.";
-App::$strings["Protocol disabled."] = "Protocol uitgeschakeld.";
-App::$strings["Channel discovery failed."] = "Kanaal ontdekken mislukt.";
-App::$strings["Cannot connect to yourself."] = "Kan niet met jezelf verbinden";
-App::$strings["A deleted group with this name was revived. Existing item permissions <strong>may</strong> apply to this group and any future members. If this is not what you intended, please create another group with a different name."] = "Een verwijderde collectie met deze naam is gereactiveerd. Bestaande itemrechten <strong>kunnen</strong> van toepassing zijn op deze collectie en toekomstige leden. Wanneer je dit niet zo bedoeld hebt, moet je een nieuwe collectie met een andere naam aanmaken.";
-App::$strings["Add new connections to this privacy group"] = "Voeg nieuwe connecties aan deze privacygroep toe";
-App::$strings["All Channels"] = "Alle kanalen";
-App::$strings["edit"] = "bewerken";
-App::$strings["Edit group"] = "Privacygroep bewerken";
-App::$strings["Add privacy group"] = "Privacygroep toevoegen";
-App::$strings["Channels not in any privacy group"] = "Kanalen die zich in geen enkele privacygroep bevinden";
-App::$strings["add"] = "toevoegen";
-App::$strings["Invalid data packet"] = "Datapakket ongeldig";
-App::$strings["Unable to verify channel signature"] = "Kanaalkenmerk kon niet worden geverifieerd. ";
-App::$strings["Unable to verify site signature for %s"] = "Hubkenmerk voor %s kon niet worden geverifieerd";
-App::$strings["invalid target signature"] = "ongeldig doelkenmerk";
-App::$strings["Logout"] = "Uitloggen";
-App::$strings["End this session"] = "Beëindig deze sessie";
-App::$strings["Home"] = "Home";
-App::$strings["Your posts and conversations"] = "Jouw kanaal";
-App::$strings["Your profile page"] = "Jouw profielpagina";
-App::$strings["Manage/Edit profiles"] = "Beheer/wijzig profielen";
-App::$strings["Edit your profile"] = "Jouw profiel bewerken";
-App::$strings["Your photos"] = "Jouw foto's";
-App::$strings["Your files"] = "Jouw bestanden";
-App::$strings["Your chatrooms"] = "Jouw chatkanalen";
-App::$strings["Your bookmarks"] = "Jouw bladwijzers";
-App::$strings["Your webpages"] = "Jouw webpagina's";
-App::$strings["Sign in"] = "Inloggen";
-App::$strings["%s - click to logout"] = "%s - klik om uit te loggen";
-App::$strings["Remote authentication"] = "Authenticatie op afstand";
-App::$strings["Click to authenticate to your home hub"] = "Authenticeer jezelf via (bijvoorbeeld) jouw hub";
-App::$strings["Home Page"] = "Homepage";
-App::$strings["Register"] = "Registreren";
-App::$strings["Create an account"] = "Maak een account aan";
-App::$strings["Help and documentation"] = "Hulp en documentatie";
-App::$strings["Apps"] = "Apps";
-App::$strings["Applications, utilities, links, games"] = "Apps";
-App::$strings["Search site @name, #tag, ?docs, content"] = "Zoek een @kanaal, doorzoek inhoud hub met tekst en #tags, of doorzoek ?documentatie ";
-App::$strings["Channel Directory"] = "Kanalengids";
-App::$strings["Your grid"] = "Jouw grid";
-App::$strings["Mark all grid notifications seen"] = "Markeer alle gridnotificaties als bekeken";
-App::$strings["Channel home"] = "Jouw kanaal";
-App::$strings["Mark all channel notifications seen"] = "Alle kanaalnotificaties als gelezen markeren";
-App::$strings["Connections"] = "Connecties";
-App::$strings["Notices"] = "Notificaties";
-App::$strings["Notifications"] = "Notificaties";
-App::$strings["See all notifications"] = "Alle notificaties weergeven";
-App::$strings["Mark all system notifications seen"] = "Markeer alle systeemnotificaties als bekeken";
-App::$strings["Private mail"] = "Privéberichten";
-App::$strings["See all private messages"] = "Alle privéberichten weergeven";
-App::$strings["Mark all private messages seen"] = "Markeer alle privéberichten als bekeken";
-App::$strings["Inbox"] = "Postvak IN";
-App::$strings["Outbox"] = "Postvak UIT";
-App::$strings["New Message"] = "Nieuw bericht";
-App::$strings["Event Calendar"] = "Agenda";
-App::$strings["See all events"] = "Alle gebeurtenissen weergeven";
-App::$strings["Mark all events seen"] = "Markeer alle gebeurtenissen als bekeken";
-App::$strings["Manage Your Channels"] = "Beheer je kanalen";
-App::$strings["Account/Channel Settings"] = "Account-/kanaal-instellingen";
-App::$strings["Admin"] = "Beheer";
-App::$strings["Site Setup and Configuration"] = "Hub instellen en beheren";
-App::$strings["@name, #tag, ?doc, content"] = "@kanaal, #tag, inhoud, ?hulp";
-App::$strings["Please wait..."] = "Wachten aub...";
-App::$strings["System"] = "Systeem";
-App::$strings["Create Personal App"] = "Persoonlijke app maken";
-App::$strings["Edit Personal App"] = "Persoonlijke app bewerken";
-App::$strings["Ignore/Hide"] = "Negeren/Verbergen";
-App::$strings["Suggestions"] = "Voorgestelde kanalen";
-App::$strings["See more..."] = "Meer...";
-App::$strings["You have %1$.0f of %2$.0f allowed connections."] = "Je hebt %1$.0f van de %2$.0f toegestane connecties.";
-App::$strings["Add New Connection"] = "Nieuwe connectie toevoegen";
-App::$strings["Enter channel address"] = "Vul kanaaladres in";
-App::$strings["Examples: bob@example.com, https://example.com/barbara"] = "Voorbeelden: bob@example.com, http://example.com/barbara";
-App::$strings["Notes"] = "Aantekeningen";
-App::$strings["Save"] = "Opslaan";
-App::$strings["Remove term"] = "Verwijder zoekterm";
-App::$strings["Archives"] = "Archieven";
-App::$strings["Me"] = "Ik";
-App::$strings["Family"] = "Familie";
-App::$strings["Acquaintances"] = "Kennissen";
-App::$strings["All"] = "Alles";
-App::$strings["Refresh"] = "Vernieuwen";
-App::$strings["Account settings"] = "Account";
-App::$strings["Channel settings"] = "Kanaal";
-App::$strings["Additional features"] = "Extra functies";
-App::$strings["Feature/Addon settings"] = "Plugin-instellingen";
-App::$strings["Display settings"] = "Weergave";
-App::$strings["Manage locations"] = "Locaties beheren";
-App::$strings["Export channel"] = "Kanaal exporteren";
-App::$strings["Connected apps"] = "Verbonden applicaties";
-App::$strings["Connection Default Permissions"] = "Standaard permissies voor connecties";
-App::$strings["Premium Channel Settings"] = "Instellingen premiumkanaal";
-App::$strings["Private Mail Menu"] = "Privéberichten";
-App::$strings["Combined View"] = "Gecombineerd postvak";
-App::$strings["Conversations"] = "Conversaties";
-App::$strings["Received Messages"] = "Ontvangen berichten";
-App::$strings["Sent Messages"] = "Verzonden berichten";
-App::$strings["No messages."] = "Geen berichten";
-App::$strings["Delete conversation"] = "Verwijder conversatie";
-App::$strings["Events Menu"] = "Agenda-menu";
-App::$strings["Day View"] = "Dag tonen";
-App::$strings["Week View"] = "Week tonen";
-App::$strings["Month View"] = "Maand tonen";
-App::$strings["Export"] = "Exporteren";
-App::$strings["Import"] = "Importeren";
-App::$strings["Events Tools"] = "Agenda-hulpmiddelen";
-App::$strings["Export Calendar"] = "Exporteren";
-App::$strings["Import Calendar"] = "Importeren";
-App::$strings["Overview"] = "Overzicht";
-App::$strings["Chat Members"] = "Chatleden";
-App::$strings["Bookmarked Chatrooms"] = "Bladwijzers van chatkanalen";
-App::$strings["Suggested Chatrooms"] = "Voorgestelde chatkanalen";
-App::$strings["photo/image"] = "foto/afbeelding";
-App::$strings["Click to show more"] = "Klik voor meer";
-App::$strings["Rating Tools"] = "Beoordelingen";
-App::$strings["Rate Me"] = "Beoordeel mij";
-App::$strings["View Ratings"] = "Bekijk beoordelingen";
-App::$strings["Public Hubs"] = "Openbare hubs";
-App::$strings["Forums"] = "Forums";
-App::$strings["Tasks"] = "Taken";
-App::$strings["Documentation"] = "Documentatie";
-App::$strings["Project/Site Information"] = "Project- en hub-informatie";
-App::$strings["For Members"] = "Voor leden";
-App::$strings["For Administrators"] = "Voor beheerders";
-App::$strings["For Developers"] = "Voor ontwikkelaars";
-App::$strings["Site"] = "Hub-instellingen";
-App::$strings["Accounts"] = "Accounts";
-App::$strings["Member registrations waiting for confirmation"] = "Accounts die op goedkeuring wachten";
-App::$strings["Channels"] = "Kanalen";
-App::$strings["Security"] = "Beveiliging";
-App::$strings["Plugins"] = "Plugins";
-App::$strings["Themes"] = "Thema's";
-App::$strings["Inspect queue"] = "Inspecteer berichtenwachtrij";
-App::$strings["Profile Fields"] = "Profielvelden";
-App::$strings["DB updates"] = "Database-updates";
-App::$strings["Logs"] = "Logboeken";
-App::$strings["Plugin Features"] = "Plugin-opties";
-App::$strings["View Photo"] = "Foto weergeven";
-App::$strings["Edit Album"] = "Album bewerken";
-App::$strings["Tags"] = "Tags";
-App::$strings["Keywords"] = "Trefwoorden";
-App::$strings["have"] = "heb";
-App::$strings["has"] = "heeft";
-App::$strings["want"] = "wil";
-App::$strings["wants"] = "wil";
-App::$strings["likes"] = "vindt dit leuk";
-App::$strings["dislikes"] = "vindt dit niet leuk";
-App::$strings["Delete this item?"] = "Dit item verwijderen?";
-App::$strings["[-] show less"] = "[-] minder reacties weergeven";
-App::$strings["[+] expand"] = "[+] uitklappen";
-App::$strings["[-] collapse"] = "[-] inklappen";
-App::$strings["Password too short"] = "Wachtwoord te kort";
-App::$strings["Passwords do not match"] = "Wachtwoorden komen niet overeen";
-App::$strings["everybody"] = "iedereen";
-App::$strings["Secret Passphrase"] = "Geheim wachtwoord";
-App::$strings["Passphrase hint"] = "Wachtwoordhint";
-App::$strings["Notice: Permissions have changed but have not yet been submitted."] = "Mededeling: de permissies zijn veranderd, maar zijn nog niet opgeslagen.";
-App::$strings["close all"] = "Alles sluiten";
-App::$strings["Nothing new here"] = "Niets nieuw hier";
-App::$strings["Rate This Channel (this is public)"] = "Beoordeel dit kanaal (dit is openbaar)";
-App::$strings["Rating"] = "Beoordeling";
-App::$strings["Describe (optional)"] = "Omschrijving (optioneel)";
-App::$strings["Please enter a link URL"] = "Vul een URL in:";
-App::$strings["Unsaved changes. Are you sure you wish to leave this page?"] = "Niet opgeslagen wijzigingen. Ben je er zeker van dat je deze pagina wil verlaten?";
-App::$strings["Location"] = "Locatie";
-App::$strings["timeago.prefixAgo"] = "timeago.prefixAgo";
-App::$strings["timeago.prefixFromNow"] = "timeago.prefixFromNow";
-App::$strings["ago"] = "geleden";
-App::$strings["from now"] = "vanaf nu";
-App::$strings["less than a minute"] = "minder dan een minuut";
-App::$strings["about a minute"] = "ongeveer een minuut";
-App::$strings["%d minutes"] = "%d minuten";
-App::$strings["about an hour"] = "ongeveer een uur";
-App::$strings["about %d hours"] = "ongeveer %d uren";
-App::$strings["a day"] = "een dag";
-App::$strings["%d days"] = "%d dagen";
-App::$strings["about a month"] = "ongeveer een maand";
-App::$strings["%d months"] = "%d maanden";
-App::$strings["about a year"] = "ongeveer een jaar";
-App::$strings["%d years"] = "%d jaren";
-App::$strings[" "] = " ";
-App::$strings["timeago.numbers"] = "timeago.numbers";
-App::$strings["January"] = "januari";
-App::$strings["February"] = "februari";
-App::$strings["March"] = "maart";
-App::$strings["April"] = "april";
-App::$strings["__ctx:long__ May"] = "mei";
-App::$strings["June"] = "juni";
-App::$strings["July"] = "juli";
-App::$strings["August"] = "augustus";
-App::$strings["September"] = "september";
-App::$strings["October"] = "oktober";
-App::$strings["November"] = "november";
-App::$strings["December"] = "december";
-App::$strings["Jan"] = "jan";
-App::$strings["Feb"] = "feb";
-App::$strings["Mar"] = "mrt";
-App::$strings["Apr"] = "apr";
-App::$strings["__ctx:short__ May"] = "mei";
-App::$strings["Jun"] = "jun";
-App::$strings["Jul"] = "jul";
-App::$strings["Aug"] = "aug";
-App::$strings["Sep"] = "sep";
-App::$strings["Oct"] = "okt";
-App::$strings["Nov"] = "nov";
-App::$strings["Dec"] = "dec";
-App::$strings["Sunday"] = "zondag";
-App::$strings["Monday"] = "maandag";
-App::$strings["Tuesday"] = "dinsdag";
-App::$strings["Wednesday"] = "woensdag";
-App::$strings["Thursday"] = "donderdag";
-App::$strings["Friday"] = "vrijdag";
-App::$strings["Saturday"] = "zaterdag";
-App::$strings["Sun"] = "zo";
-App::$strings["Mon"] = "ma";
-App::$strings["Tue"] = "di";
-App::$strings["Wed"] = "wo";
-App::$strings["Thu"] = "do";
-App::$strings["Fri"] = "vr";
-App::$strings["Sat"] = "za";
-App::$strings["__ctx:calendar__ today"] = "vandaag";
-App::$strings["__ctx:calendar__ month"] = "maand";
-App::$strings["__ctx:calendar__ week"] = "week";
-App::$strings["__ctx:calendar__ day"] = "dag";
-App::$strings["__ctx:calendar__ All day"] = "hele dag";
-App::$strings["No recipient provided."] = "Geen ontvanger opgegeven.";
-App::$strings["[no subject]"] = "[geen onderwerp]";
-App::$strings["Unable to determine sender."] = "Afzender kan niet bepaald worden.";
-App::$strings["Stored post could not be verified."] = "Opgeslagen bericht kon niet worden geverifieerd.";
-App::$strings["Cannot create a duplicate channel identifier on this system. Import failed."] = "Kan geen dubbele kanaal-identificator op deze hub aanmaken. Importeren mislukt.";
-App::$strings["Channel clone failed. Import failed."] = "Het klonen van het kanaal is mislukt. Importeren mislukt.";
-App::$strings["Cloned channel not found. Import failed."] = "Gekloond kanaal niet gevonden. Importeren mislukt.";
-App::$strings["Embedded content"] = "Ingesloten (embedded) inhoud";
-App::$strings["Embedding disabled"] = "Insluiten (embedding) uitgeschakeld";
-App::$strings["New Page"] = "Nieuwe pagina";
-App::$strings["View"] = "Weergeven";
-App::$strings["Actions"] = "Acties";
-App::$strings["Page Link"] = "Paginalink";
-App::$strings["Title"] = "Titel";
-App::$strings["Created"] = "Aangemaakt";
-App::$strings["Edited"] = "Bewerkt";
-App::$strings["Can view my normal stream and posts"] = "Kan mijn normale kanaalstream en berichten bekijken";
-App::$strings["Can view my default channel profile"] = "Kan mijn standaard kanaalprofiel bekijken";
-App::$strings["Can view my connections"] = "Kan een lijst met mijn connecties bekijken";
-App::$strings["Can view my file storage and photos"] = "Kan mijn foto's en andere bestanden bekijken";
-App::$strings["Can view my webpages"] = "Kan mijn pagina's bekijken";
-App::$strings["Can send me their channel stream and posts"] = "Kan mij de inhoud van hun kanaal en berichten sturen";
-App::$strings["Can post on my channel page (\"wall\")"] = "Kan een bericht in mijn kanaal plaatsen";
-App::$strings["Can comment on or like my posts"] = "Kan op mijn berichten reageren of deze (niet) leuk vinden";
-App::$strings["Can send me private mail messages"] = "Kan mij privéberichten sturen";
-App::$strings["Can like/dislike stuff"] = "Kan dingen leuk of niet leuk vinden";
-App::$strings["Profiles and things other than posts/comments"] = "Profielen en dingen, buiten berichten en reacties";
-App::$strings["Can forward to all my channel contacts via post @mentions"] = "Kan naar al mijn kanaalconnecties berichten doorsturen met behulp van @vermeldingen+";
-App::$strings["Advanced - useful for creating group forum channels"] = "Geavanceerd - nuttig voor groepforums";
-App::$strings["Can chat with me (when available)"] = "Kan met mij chatten (wanneer beschikbaar)";
-App::$strings["Can write to my file storage and photos"] = "Kan foto's en andere bestanden aan mijn bestandsopslag toevoegen";
-App::$strings["Can edit my webpages"] = "Kan mijn pagina's bewerken";
-App::$strings["Can source my public posts in derived channels"] = "Kan mijn openbare berichten als bron voor andere kanalen gebruiken";
-App::$strings["Somewhat advanced - very useful in open communities"] = "Enigszins geavanceerd (erg nuttig voor kanalen van forums/groepen)";
-App::$strings["Can administer my channel resources"] = "Kan mijn kanaal beheren";
-App::$strings["Extremely advanced. Leave this alone unless you know what you are doing"] = "Zeer geavanceerd. Laat dit met rust, behalve als je weet wat je doet.";
-App::$strings["Social Networking"] = "Sociaal netwerk";
-App::$strings["Social - Mostly Public"] = "Sociaal - Vrijwel alles openbaar";
-App::$strings["Social - Restricted"] = "Sociaal - Beperkt zichtbaar";
-App::$strings["Social - Private"] = "Sociaal - Verborgen kanaal";
-App::$strings["Community Forum"] = "Groepsforum";
-App::$strings["Forum - Mostly Public"] = "Forum - Vrijwel alles openbaar";
-App::$strings["Forum - Restricted"] = "Forum - Beperkt zichtbaar";
-App::$strings["Forum - Private"] = "Forum - Verborgen kanaal";
-App::$strings["Feed Republish"] = "Feed herpubliceren";
-App::$strings["Feed - Mostly Public"] = "Feed - Vrijwel alles openbaar";
-App::$strings["Feed - Restricted"] = "Feed - Beperkt zichtbaar";
-App::$strings["Special Purpose"] = "Speciaal doel";
-App::$strings["Special - Celebrity/Soapbox"] = "Speciaal - Beroemdheid/alleen volgen";
-App::$strings["Special - Group Repository"] = "Speciaal - Groepsopslag";
-App::$strings["Custom/Expert Mode"] = "Expertmodus/handmatig aanpassen";
-App::$strings["prev"] = "vorige";
-App::$strings["first"] = "eerste";
-App::$strings["last"] = "laatste";
-App::$strings["next"] = "volgende";
-App::$strings["older"] = "ouder";
-App::$strings["newer"] = "nieuwer";
-App::$strings["No connections"] = "Geen connecties";
-App::$strings["View all %s connections"] = "Toon alle %s connecties";
-App::$strings["poke"] = "aanstoten";
-App::$strings["ping"] = "ping";
-App::$strings["pinged"] = "gepingd";
-App::$strings["prod"] = "por";
-App::$strings["prodded"] = "gepord";
-App::$strings["slap"] = "slaan";
-App::$strings["slapped"] = "sloeg";
-App::$strings["finger"] = "finger";
-App::$strings["fingered"] = "gefingerd";
-App::$strings["rebuff"] = "afpoeieren";
-App::$strings["rebuffed"] = "afgepoeierd";
-App::$strings["happy"] = "gelukkig";
-App::$strings["sad"] = "bedroefd";
-App::$strings["mellow"] = "mellow";
-App::$strings["tired"] = "moe";
-App::$strings["perky"] = "parmantig";
-App::$strings["angry"] = "boos";
-App::$strings["stupefied"] = "verbijsterd";
-App::$strings["puzzled"] = "verward";
-App::$strings["interested"] = "geïnteresseerd";
-App::$strings["bitter"] = "verbitterd";
-App::$strings["cheerful"] = "vrolijk";
-App::$strings["alive"] = "levendig";
-App::$strings["annoyed"] = "geërgerd";
-App::$strings["anxious"] = "bezorgd";
-App::$strings["cranky"] = "humeurig";
-App::$strings["disturbed"] = "verontrust";
-App::$strings["frustrated"] = "gefrustreerd ";
-App::$strings["depressed"] = "gedeprimeerd";
-App::$strings["motivated"] = "gemotiveerd";
-App::$strings["relaxed"] = "ontspannen";
-App::$strings["surprised"] = "verrast";
-App::$strings["May"] = "mei";
-App::$strings["Unknown Attachment"] = "Onbekende bijlage";
-App::$strings["unknown"] = "onbekend";
-App::$strings["remove category"] = "categorie verwijderen";
-App::$strings["remove from file"] = "uit map verwijderen";
-App::$strings["Click to open/close"] = "Klik om te openen of te sluiten";
-App::$strings["Link to Source"] = "Originele locatie";
-App::$strings["default"] = "standaard";
-App::$strings["Page layout"] = "Pagina-lay-out";
-App::$strings["You can create your own with the layouts tool"] = "Je kan jouw eigen lay-out ontwerpen onder lay-outs";
-App::$strings["Page content type"] = "Opmaaktype pagina";
-App::$strings["Select an alternate language"] = "Kies een andere taal";
-App::$strings["activity"] = "activiteit";
-App::$strings["Design Tools"] = "Ontwerp-hulpmiddelen";
-App::$strings["Blocks"] = "Blokken";
-App::$strings["Menus"] = "Menu's";
-App::$strings["Layouts"] = "Lay-outs";
-App::$strings["Pages"] = "Pagina's";
-App::$strings["Public Timeline"] = "Openbare tijdlijn";
-App::$strings["Remote privacy information not available."] = "Privacy-informatie op afstand niet beschikbaar.";
-App::$strings["Visible to:"] = "Zichtbaar voor:";
App::$strings["Some blurb about what to do when you're new here"] = "Welkom op \$Projectname. Klik op de tab ontdekken of klik rechtsboven op de <a href=\"directory\">kanalengids</a>, om kanalen te vinden. Rechtsboven vind je ook <a href=\"directory\">apps</a>, waar je vrijwel alle functies van \$Projectname kunt vinden. Voor <a href=\"directory\">hulp</a> met \$Projectname klik je op het vraagteken.";
App::$strings["network"] = "netwerk";
App::$strings["RSS"] = "RSS";
-App::$strings["Unable to find your hub."] = "Niet in staat om je hub te vinden";
-App::$strings["Post successful."] = "Verzenden bericht geslaagd.";
App::$strings["Theme settings updated."] = "Thema-instellingen bijgewerkt.";
+App::$strings["Item not found."] = "Item niet gevonden.";
App::$strings["# Accounts"] = "# accounts";
App::$strings["# blocked accounts"] = "# geblokkeerde accounts";
App::$strings["# expired accounts"] = "# verlopen accounts";
@@ -1054,17 +56,23 @@ App::$strings["Registered channels"] = "Geregistreerde kanalen";
App::$strings["Active plugins"] = "Ingeschakelde plugins";
App::$strings["Version"] = "Versie";
App::$strings["Site settings updated."] = "Hub-instellingen bijgewerkt.";
+App::$strings["Default"] = "Standaard";
App::$strings["mobile"] = "mobiel";
App::$strings["experimental"] = "experimenteel";
App::$strings["unsupported"] = "Niet ondersteund";
+App::$strings["No"] = "Nee";
App::$strings["Yes - with approval"] = "Ja - met goedkeuring";
+App::$strings["Yes"] = "Ja";
App::$strings["My site is not a public server"] = "Mijn \$Projectname-hub is niet openbaar";
App::$strings["My site has paid access only"] = "Mijn \$Projectname-hub kent alleen betaalde toegang";
App::$strings["My site has free access only"] = "Mijn \$Projectname-hub kent alleen gratis toegang";
App::$strings["My site offers free accounts with optional paid upgrades"] = "Mijn \$Projectname-hub biedt gratis accounts aan met betaalde uitbreidingen als optie";
+App::$strings["Site"] = "Hub-instellingen";
+App::$strings["Submit"] = "Opslaan";
App::$strings["Registration"] = "Registratie";
App::$strings["File upload"] = "Bestand uploaden";
App::$strings["Policies"] = "Beleid";
+App::$strings["Advanced"] = "Geavanceerd";
App::$strings["Site name"] = "Naam van deze \$Projectname-hub";
App::$strings["Banner/Logo"] = "Banner/logo";
App::$strings["Administrator Information"] = "Informatie over de beheerder van deze hub";
@@ -1102,8 +110,10 @@ App::$strings["Force publish"] = "Dwing kanaalvermelding af";
App::$strings["Check to force all profiles on this site to be listed in the site directory."] = "Vink dit aan om af te dwingen dat alle kanalen op deze hub in de kanalengids worden vermeld.";
App::$strings["Import Public Streams"] = "Openbare streams importeren";
App::$strings["Import and allow access to public content pulled from other sites. Warning: this content is unmoderated."] = "Toegang verlenen tot openbare berichten die vanuit andere hubs worden geïmporteerd. Waarschuwing: de inhoud van deze berichten wordt niet gemodereerd.";
-App::$strings["login on Homepage"] = "Inlogformulier op de homepagina";
+App::$strings["Login on Homepage"] = "Inlogformulier op de homepagina";
App::$strings["Present a login box to visitors on the home page if no other content has been configured."] = "Toon een inlogformulier voor bezoekers op de homepagina wanneer geen andere inhoud is geconfigureerd. ";
+App::$strings["Enable context help"] = "Schakel contextuele hulp in";
+App::$strings["Display contextual help for the current page when the help button is pressed."] = "Toon hulp en documentatie voor de op dat moment getoonde pagina, wanneer op de hulp-knop wordt geklikt.";
App::$strings["Directory Server URL"] = "Server-URL voor de kanalengids";
App::$strings["Default directory server"] = "Standaardserver voor de kanalengids";
App::$strings["Proxy user"] = "Gebruikersnaam proxy";
@@ -1130,6 +140,7 @@ App::$strings["for channel"] = "voor kanaal";
App::$strings["on server"] = "op hub";
App::$strings["Status"] = "Status";
App::$strings["Server"] = "Hubbeheer";
+App::$strings["Security"] = "Beveiliging";
App::$strings["Block public"] = "Openbare toegang blokkeren";
App::$strings["Check to block public access to all otherwise public personal pages on this site unless you are currently authenticated."] = "Vink dit aan om alle normaliter openbare persoonlijke pagina's op deze hub alleen toegankelijk te maken voor leden die zich hebben geauthenticeerd.";
App::$strings["Allow communications only from these sites"] = "Alleen communicatie met deze hubs toestaan";
@@ -1175,11 +186,13 @@ App::$strings["Users"] = "Accounts";
App::$strings["select all"] = "alles selecteren";
App::$strings["User registrations waiting for confirm"] = "Accounts die op goedkeuring wachten";
App::$strings["Request date"] = "Tijd/datum verzoek";
+App::$strings["Email"] = "E-mail";
App::$strings["No registrations."] = "Geen verzoeken.";
App::$strings["Approve"] = "Goedkeuren";
App::$strings["Deny"] = "Afkeuren";
App::$strings["Block"] = "Blokkeren";
App::$strings["Unblock"] = "Deblokkeren";
+App::$strings["All Channels"] = "Alle kanalen";
App::$strings["Register date"] = "Geregistreerd";
App::$strings["Last login"] = "Laatste keer ingelogd";
App::$strings["Expires"] = "Verloopt";
@@ -1204,10 +217,12 @@ App::$strings["Channel '%s' censored"] = "Kanaal '%s' gecensureerd";
App::$strings["Channel '%s' uncensored"] = "Kanaal '%s' ongecensureerd";
App::$strings["Channel '%s' code allowed"] = "Scripts toegestaan voor kanaal '%s'";
App::$strings["Channel '%s' code disallowed"] = "Scripts niet toegestaan voor kanaal '%s'";
+App::$strings["Channels"] = "Kanalen";
App::$strings["Censor"] = "Censureren";
App::$strings["Uncensor"] = "Niet censureren";
App::$strings["Allow Code"] = "Scripts toestaan";
App::$strings["Disallow Code"] = "Scripts niet toestaan";
+App::$strings["Channel"] = "Kanaal";
App::$strings["UID"] = "UID";
App::$strings["Address"] = "Kanaaladres";
App::$strings["Selected channels will be deleted!\\n\\nEverything that was posted in these channels on this site will be permanently deleted!\\n\\nAre you sure?"] = "Geselecteerde kanalen worden verwijderd!\\n\\nAlles wat in deze kanalen op deze hub werd gepubliceerd wordt definitief verwijderd!\\n\\nWeet je het zeker?";
@@ -1216,7 +231,9 @@ App::$strings["Plugin %s disabled."] = "Plugin %s uitgeschakeld.";
App::$strings["Plugin %s enabled."] = "Plugin %s ingeschakeld";
App::$strings["Disable"] = "Uitschakelen";
App::$strings["Enable"] = "Inschakelen";
+App::$strings["Plugins"] = "Plugins";
App::$strings["Toggle"] = "Omschakelen";
+App::$strings["Settings"] = "Instellingen";
App::$strings["Author: "] = "Auteur: ";
App::$strings["Maintainer: "] = "Beheerder: ";
App::$strings["Minimum project version: "] = "Minimum versie Hubzilla: ";
@@ -1226,9 +243,11 @@ App::$strings["Requires: "] = "Vereist: ";
App::$strings["Disabled - version incompatibility"] = "Uitgeschakeld - versie is incompatibel";
App::$strings["No themes found."] = "Geen thema's gevonden";
App::$strings["Screenshot"] = "Schermafdruk";
+App::$strings["Themes"] = "Thema's";
App::$strings["[Experimental]"] = "[Experimenteel]";
App::$strings["[Unsupported]"] = "[Niet ondersteund]";
App::$strings["Log settings updated."] = "Logboek-instellingen bijgewerkt.";
+App::$strings["Logs"] = "Logboeken";
App::$strings["Clear"] = "Leegmaken";
App::$strings["Debugging"] = "Debuggen";
App::$strings["Log file"] = "Logbestand";
@@ -1242,8 +261,10 @@ App::$strings["Field Name"] = "Veldnaam";
App::$strings["Label on profile pages"] = "Tekstlabel voor op profielpagina's";
App::$strings["Help text"] = "Helptekst";
App::$strings["Additional info (optional)"] = "Extra informatie (optioneel)";
+App::$strings["Save"] = "Opslaan";
App::$strings["Field definition not found"] = "Velddefinitie niet gevonden";
App::$strings["Edit Profile Field"] = "Profielveld bewerken";
+App::$strings["Profile Fields"] = "Profielvelden";
App::$strings["Basic Profile Fields"] = "Standaard profielvelden";
App::$strings["Advanced Profile Fields"] = "Geavanceerde profielvelden";
App::$strings["(In addition to basic fields)"] = "(als toevoeging op de standaard velden)";
@@ -1254,13 +275,13 @@ App::$strings["Authorize application connection"] = "Geef toestemming voor appli
App::$strings["Return to your app and insert this Securty Code:"] = "Ga terug naar je app en voeg deze beveiligingscode in:";
App::$strings["Please login to continue."] = "Inloggen om verder te kunnen gaan.";
App::$strings["Do you want to authorize this application to access your posts and contacts, and/or create new posts for you?"] = "Wil je deze applicatie toestemming geven om jouw berichten en connecties te zien, en/of nieuwe berichten voor jou te plaatsen?";
-App::$strings["OpenID protocol error. No ID returned."] = "OpenID-protocolfout. Geen ID terugontvangen.";
App::$strings["App installed."] = "App geïnstalleerd";
App::$strings["Malformed app."] = "Misvormde app.";
App::$strings["Embed code"] = "Insluitcode";
App::$strings["Edit App"] = "App bewerken";
App::$strings["Create App"] = "App maken";
App::$strings["Name of app"] = "Naam van app";
+App::$strings["Required"] = "Vereist";
App::$strings["Location (URL) of app"] = "Locatie (URL) van app";
App::$strings["Description"] = "Omschrijving";
App::$strings["Photo icon URL"] = "URL van pictogram";
@@ -1268,130 +289,50 @@ App::$strings["80 x 80 pixels - optional"] = "80 x 80 pixels (optioneel)";
App::$strings["Version ID"] = "Versie-ID";
App::$strings["Price of app"] = "Prijs van de app";
App::$strings["Location (URL) to purchase app"] = "Locatie (URL) om de app aan te schaffen";
+App::$strings["Apps"] = "Apps";
+App::$strings["Item not available."] = "Item is niet aanwezig.";
App::$strings["Invalid item."] = "Ongeldig item.";
App::$strings["Channel not found."] = "Kanaal niet gevonden.";
-App::$strings["Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."] = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";
-App::$strings["Item not available."] = "Item is niet aanwezig.";
-App::$strings["This setting requires special processing and editing has been blocked."] = "Deze instelling vereist een speciaal proces en bewerken is geblokkeerd.";
-App::$strings["Configuration Editor"] = "Configuratiebewerker";
-App::$strings["Warning: Changing some settings could render your channel inoperable. Please leave this page unless you are comfortable with and knowledgeable about how to correctly use this feature."] = "Waarschuwing: het veranderen van sommige instellingen kunnen jouw kanaal onklaar maken. Verlaat deze pagina, tenzij je weet waar je mee bezig bent en voldoende kennis bezit over hoe je deze functies moet gebruiken. ";
-App::$strings["Layout updated."] = "Lay-out bijgewerkt.";
-App::$strings["Edit System Page Description"] = "Systeempagina's bewerken";
-App::$strings["Layout not found."] = "Lay-out niet gevonden.";
-App::$strings["Module Name:"] = "Modulenaam:";
-App::$strings["Layout Help"] = "Lay-out-hulp";
-App::$strings["Item not found"] = "Item niet gevonden";
-App::$strings["Item is not editable"] = "Item is niet te bewerken";
-App::$strings["Delete item?"] = "Item verwijderen?";
-App::$strings["Insert YouTube video"] = "YouTube-video invoegen";
-App::$strings["Insert Vorbis [.ogg] video"] = "Vorbis-video [.ogg] invoegen";
-App::$strings["Insert Vorbis [.ogg] audio"] = "Vorbis-audio [.ogg] invoegen";
-App::$strings["Edit post"] = "Bericht bewerken";
-App::$strings["Page owner information could not be retrieved."] = "Informatie over de pagina-eigenaar werd niet ontvangen.";
-App::$strings["Album not found."] = "Album niet gevonden.";
-App::$strings["Delete Album"] = "Verwijder album";
-App::$strings["Multiple storage folders exist with this album name, but within different directories. Please remove the desired folder or folders using the Files manager"] = "Er bestaan meerdere submappen met deze albumnaam, maar verspreidt over verschillende mappen. Verwijder de gewenste map(pen) met de bestandsbeheerder.";
-App::$strings["Delete Photo"] = "Verwijder foto";
-App::$strings["Public access denied."] = "Openbare toegang geweigerd.";
-App::$strings["No photos selected"] = "Geen foto's geselecteerd";
-App::$strings["Access to this item is restricted."] = "Toegang tot dit item is beperkt.";
-App::$strings["%1$.2f MB of %2$.2f MB photo storage used."] = "%1$.2f MB van %2$.2f MB aan foto-opslag gebruikt.";
-App::$strings["%1$.2f MB photo storage used."] = "%1$.2f MB aan foto-opslag gebruikt.";
-App::$strings["Upload Photos"] = "Foto's uploaden";
-App::$strings["Enter an album name"] = "Vul een albumnaam in";
-App::$strings["or select an existing album (doubleclick)"] = "of kies een bestaand album (dubbelklikken)";
-App::$strings["Create a status post for this upload"] = "Plaats een bericht voor deze upload.";
-App::$strings["Caption (optional):"] = "Bijschrift (optioneel):";
-App::$strings["Description (optional):"] = "Omschrijving (optioneel):";
-App::$strings["Album name could not be decoded"] = "Albumnaam kon niet gedecodeerd worden";
-App::$strings["Contact Photos"] = "Connectiefoto's";
-App::$strings["Show Newest First"] = "Nieuwste eerst weergeven";
-App::$strings["Show Oldest First"] = "Oudste eerst weergeven";
-App::$strings["Permission denied. Access to this item may be restricted."] = "Toegang geweigerd. Toegang tot dit item kan zijn beperkt.";
-App::$strings["Photo not available"] = "Foto niet aanwezig";
-App::$strings["Use as profile photo"] = "Als profielfoto gebruiken";
-App::$strings["Use as cover photo"] = "Als omslagfoto gebruiken";
-App::$strings["Private Photo"] = "Privéfoto";
-App::$strings["Previous"] = "Vorige";
-App::$strings["View Full Size"] = "Volledige grootte weergeven";
-App::$strings["Next"] = "Volgende";
-App::$strings["Remove"] = "Verwijderen";
-App::$strings["Edit photo"] = "Foto bewerken";
-App::$strings["Rotate CW (right)"] = "Draai met de klok mee (naar rechts)";
-App::$strings["Rotate CCW (left)"] = "Draai tegen de klok in (naar links)";
-App::$strings["Enter a new album name"] = "Vul een nieuwe albumnaam in";
-App::$strings["or select an existing one (doubleclick)"] = "of kies een bestaand album (dubbelklikken)";
-App::$strings["Caption"] = "Bijschrift";
-App::$strings["Add a Tag"] = "Tag toevoegen";
-App::$strings["Example: @bob, @Barbara_Jensen, @jim@example.com"] = "Voorbeeld: @bob, @Barbara_Jansen, @jan@voorbeeld.nl";
-App::$strings["Flag as adult in album view"] = "Markeer als voor volwassenen in albumweergave";
-App::$strings["In This Photo:"] = "Op deze foto:";
-App::$strings["Map"] = "Kaart";
-App::$strings["View Album"] = "Album weergeven";
-App::$strings["Recent Photos"] = "Recente foto's";
+App::$strings["Block Name"] = "Bloknaam";
+App::$strings["Blocks"] = "Blokken";
+App::$strings["Block Title"] = "Bloktitel";
+App::$strings["Created"] = "Aangemaakt";
+App::$strings["Edited"] = "Bewerkt";
+App::$strings["Share"] = "Delen";
+App::$strings["View"] = "Weergeven";
App::$strings["Bookmark added"] = "Bladwijzer toegevoegd";
App::$strings["My Bookmarks"] = "Mijn bladwijzers";
App::$strings["My Connections Bookmarks"] = "Bladwijzers van mijn connecties";
-App::$strings["Menu not found."] = "Menu niet gevonden.";
-App::$strings["Unable to create element."] = "Niet in staat om onderdeel aan te maken.";
-App::$strings["Unable to update menu element."] = "Menu-onderdeel kan niet worden geüpdatet.";
-App::$strings["Unable to add menu element."] = "Menu-onderdeel kan niet worden toegevoegd.";
-App::$strings["Not found."] = "Niet gevonden.";
-App::$strings["Menu Item Permissions"] = "Permissies menu-item";
-App::$strings["(click to open/close)"] = "(klik om te openen/sluiten)";
-App::$strings["Link Name"] = "Linknaam";
-App::$strings["Link or Submenu Target"] = "Linkdoel of submenu-doel";
-App::$strings["Enter URL of the link or select a menu name to create a submenu"] = "Geef de URL van de link of kies een menunaam om een submenu aan te maken";
-App::$strings["Use magic-auth if available"] = "Gebruik magic-auth wanneer beschikbaar";
-App::$strings["Open link in new window"] = "Open link in nieuw venster";
-App::$strings["Order in list"] = "Volgorde in lijst";
-App::$strings["Higher numbers will sink to bottom of listing"] = "Hogere nummers komen onderaan de lijst terecht";
-App::$strings["Submit and finish"] = "Opslaan en afsluiten";
-App::$strings["Submit and continue"] = "Opslaan en doorgaan";
-App::$strings["Menu:"] = "Menu:";
-App::$strings["Link Target"] = "Linkdoel";
-App::$strings["Edit menu"] = "Menu bewerken";
-App::$strings["Edit element"] = "Onderdeel bewerken";
-App::$strings["Drop element"] = "Onderdeel verwijderen";
-App::$strings["New element"] = "Nieuw element";
-App::$strings["Edit this menu container"] = "Deze menu-container bewerken";
-App::$strings["Add menu element"] = "Menu-element toevoegen";
-App::$strings["Delete this menu item"] = "Dit menu-item verwijderen";
-App::$strings["Edit this menu item"] = "Dit menu-item bewerken";
-App::$strings["Menu item not found."] = "Menu-item niet gevonden.";
-App::$strings["Menu item deleted."] = "Menu-item verwijderd.";
-App::$strings["Menu item could not be deleted."] = "Menu-item kon niet worden verwijderd.";
-App::$strings["Edit Menu Element"] = "Menu-element bewerken";
-App::$strings["Link text"] = "Linktekst";
-App::$strings["sent you a private message"] = "stuurde jou een privébericht";
-App::$strings["added your channel"] = "voegde jouw kanaal toe";
-App::$strings["posted an event"] = "plaatste een gebeurtenis";
+App::$strings["everybody"] = "iedereen";
App::$strings["Permissions denied."] = "Permissies niet toegestaan";
App::$strings["l, F j"] = "l j F";
+App::$strings["Link to Source"] = "Originele locatie";
App::$strings["Edit Event"] = "Gebeurtenis bewerken";
App::$strings["Create Event"] = "Gebeurtenis aanmaken";
+App::$strings["Previous"] = "Vorige";
+App::$strings["Next"] = "Volgende";
+App::$strings["Export"] = "Exporteren";
+App::$strings["Import"] = "Importeren";
App::$strings["Today"] = "Vandaag";
App::$strings["You must be logged in to see this page."] = "Je moet zijn ingelogd om deze pagina te kunnen bekijken.";
App::$strings["Posts and comments"] = "Berichten en reacties";
App::$strings["Only posts"] = "Alleen berichten";
App::$strings["Insufficient permissions. Request redirected to profile page."] = "Onvoldoende permissies. Doorgestuurd naar profielpagina.";
App::$strings["Public"] = "Openbaar";
-App::$strings["Poke somebody"] = "Iemand aanstoten";
-App::$strings["Poke/Prod"] = "Aanstoten/porren";
-App::$strings["Poke, prod or do other things to somebody"] = "Iemand bijvoorbeeld aanstoten of poren";
-App::$strings["Recipient"] = "Ontvanger";
-App::$strings["Choose what you wish to do to recipient"] = "Kies wat je met de ontvanger wil doen";
-App::$strings["Make this post private"] = "Maak dit bericht privé";
App::$strings["Room not found"] = "Chatkanaal niet gevonden";
App::$strings["Leave Room"] = "Chatkanaal verlaten";
App::$strings["Delete Room"] = "Chatkanaal verwijderen";
App::$strings["I am away right now"] = "Ik ben momenteel afwezig";
App::$strings["I am online"] = "Ik ben online";
App::$strings["Bookmark this room"] = "Chatkanaal aan bladwijzers toevoegen";
+App::$strings["Please enter a link URL:"] = "Vul een URL in:";
+App::$strings["Encrypt text"] = "Tekst versleutelen";
+App::$strings["Insert web link"] = "Weblink invoegen";
App::$strings["Feature disabled."] = "Functie uitgeschakeld.";
App::$strings["New Chatroom"] = "Nieuw chatkanaal";
App::$strings["Chatroom name"] = "Naam chatkanaal";
App::$strings["Expiration of chats (minutes)"] = "Aantal minuten voordat chatberichten worden verwijderd";
+App::$strings["Permissions"] = "Permissies";
App::$strings["%1\$s's Chatrooms"] = "Chatkanalen van %1\$s";
App::$strings["No chatrooms available"] = "Geen chatkanalen beschikbaar";
App::$strings["Create New"] = "Nieuwe aanmaken";
@@ -1399,7 +340,6 @@ App::$strings["Expiration"] = "Verloopt na";
App::$strings["min"] = "min";
App::$strings["Away"] = "Afwezig";
App::$strings["Online"] = "Online";
-App::$strings["Fetching URL returns error: %1\$s"] = "Ophalen URL gaf een foutmelding terug: %1\$s";
App::$strings["No channel."] = "Geen kanaal.";
App::$strings["Common connections"] = "Veel voorkomende connecties";
App::$strings["No connections in common."] = "Geen gemeenschappelijke connecties.";
@@ -1412,11 +352,12 @@ App::$strings["Potential connections will then see the following text before pro
App::$strings["By continuing, I certify that I have complied with any instructions provided on this page."] = "Door verder te gaan ga ik automatisch akkoord met alle voorwaarden en aanwijzingen op deze pagina.";
App::$strings["(No specific instructions have been provided by the channel owner.)"] = "(Er zijn geen speciale voorwaarden en aanwijzingen door de kanaal-eigenaar verstrekt) ";
App::$strings["Restricted or Premium Channel"] = "Beperkt of premiumkanaal";
-App::$strings["Set your current mood and tell your friends"] = "Noteer je huidige stemming en toon het aan je connecties";
App::$strings["Blocked"] = "Geblokkeerd";
App::$strings["Ignored"] = "Genegeerd";
App::$strings["Hidden"] = "Verborgen";
App::$strings["Archived"] = "Gearchiveerd";
+App::$strings["New"] = "Nieuw";
+App::$strings["All"] = "Alles";
App::$strings["New Connections"] = "Nieuwe connecties";
App::$strings["Show pending (new) connections"] = "Nog te accepteren (nieuwe) connecties weergeven";
App::$strings["All Connections"] = "Alle connecties";
@@ -1436,23 +377,11 @@ App::$strings["Approve connection"] = "Connectie accepteren";
App::$strings["Ignore connection"] = "Connectie negeren";
App::$strings["Ignore"] = "Negeren";
App::$strings["Recent activity"] = "Recente activiteit";
+App::$strings["Connections"] = "Connecties";
+App::$strings["Search"] = "Zoeken";
App::$strings["Search your connections"] = "Doorzoek jouw connecties";
App::$strings["Connections search"] = "Connecties zoeken";
-App::$strings["Image uploaded but image cropping failed."] = "Afbeelding geüpload, maar afbeelding kon niet worden bijgesneden. ";
-App::$strings["Image resize failed."] = "Afbeelding kon niet van grootte veranderd worden.";
-App::$strings["Shift-reload the page or clear browser cache if the new photo does not display immediately."] = "Vernieuw de pagina met shift+R of shift+F5, of leeg je browserbuffer, wanneer de nieuwe foto niet meteen wordt weergegeven.";
-App::$strings["Image upload failed."] = "Uploaden afbeelding mislukt";
-App::$strings["Unable to process image."] = "Niet in staat om afbeelding te verwerken.";
-App::$strings["Photo not available."] = "Foto niet beschikbaar.";
-App::$strings["Upload File:"] = "Bestand uploaden:";
-App::$strings["Select a profile:"] = "Kies een profiel:";
-App::$strings["Upload Profile Photo"] = "Profielfoto uploaden";
-App::$strings["or"] = "of";
-App::$strings["skip this step"] = "sla deze stap over";
-App::$strings["select a photo from your photo albums"] = "Kies een foto uit jouw fotoalbums";
-App::$strings["Crop Image"] = "Afbeelding bijsnijden";
-App::$strings["Please adjust the image cropping for optimum viewing."] = "Snij de afbeelding zo uit dat deze optimaal wordt weergegeven.";
-App::$strings["Done Editing"] = "Klaar met bewerken";
+App::$strings["Find"] = "Vinden";
App::$strings["Could not access contact record."] = "Kon geen toegang krijgen tot de connectie-gegevens.";
App::$strings["Could not locate selected profile."] = "Kon het gekozen profiel niet vinden.";
App::$strings["Connection updated."] = "Connectie bijgewerkt.";
@@ -1462,6 +391,7 @@ App::$strings["Could not access address book record."] = "Kon geen toegang krijg
App::$strings["Refresh failed - channel is currently unavailable."] = "Vernieuwen mislukt - kanaal is momenteel niet beschikbaar";
App::$strings["Unable to set address book parameters."] = "Niet in staat om de parameters van connecties in te stellen.";
App::$strings["Connection has been removed."] = "Connectie is verwijderd";
+App::$strings["View Profile"] = "Profiel weergeven";
App::$strings["View %s's profile"] = "Profiel van %s weergeven";
App::$strings["Refresh Permissions"] = "Permissies vernieuwen";
App::$strings["Fetch updated permissions"] = "Aangepaste permissies ophalen";
@@ -1481,18 +411,25 @@ App::$strings["Hide"] = "Verbergen";
App::$strings["Hide or Unhide this connection from your other connections"] = "Deze connectie verbergen (of niet meer verbergen) voor jouw andere connecties";
App::$strings["This connection is hidden!"] = "Deze connectie is verborgen!";
App::$strings["Delete this connection"] = "Deze connectie verwijderen";
+App::$strings["Me"] = "Ik";
+App::$strings["Family"] = "Familie";
+App::$strings["Friends"] = "Vrienden";
+App::$strings["Acquaintances"] = "Kennissen";
App::$strings["Approve this connection"] = "Deze connectie accepteren";
App::$strings["Accept connection to allow communication"] = "Keur deze connectie goed om communicatie toe te staan";
App::$strings["Set Affinity"] = "Verwantschapsfilter instellen";
App::$strings["Set Profile"] = "Profiel instellen";
App::$strings["Set Affinity & Profile"] = "Verwantschapsfilter en profiel instellen";
App::$strings["none"] = "geen";
+App::$strings["Connection Default Permissions"] = "Standaard permissies voor connecties";
+App::$strings["Connection: %s"] = "Connectie: %s";
App::$strings["Apply these permissions automatically"] = "Deze permissies automatisch toepassen";
App::$strings["Connection requests will be approved without your interaction"] = "Connectieverzoeken zullen automatisch worden geaccepteerd";
App::$strings["This connection's primary address is"] = "Het primaire kanaaladres van deze connectie is";
App::$strings["Available locations:"] = "Beschikbare locaties:";
App::$strings["The permissions indicated on this page will be applied to all new connections."] = "Permissies die op deze pagina staan vermeld worden op alle nieuwe connecties toegepast.";
App::$strings["Slide to adjust your degree of friendship"] = "Schuif om te bepalen hoe goed je iemand kent en/of mag";
+App::$strings["Rating"] = "Beoordeling";
App::$strings["Slide to adjust your rating"] = "Gebruik de schuif om je beoordeling te geven";
App::$strings["Optionally explain your rating"] = "Verklaar jouw beoordeling (niet verplicht)";
App::$strings["Custom Filter"] = "Berichtenfilter";
@@ -1509,6 +446,404 @@ App::$strings["Individual Permissions"] = "Individuele permissies";
App::$strings["Some permissions may be inherited from your channel's <a href=\"settings\"><strong>privacy settings</strong></a>, which have higher priority than individual settings. You can <strong>not</strong> change those settings here."] = "Sommige permissies worden mogelijk overgeërfd van de <a href=\"settings\">privacy-instellingen</a> van jouw kanaal, die een hogere prioriteit hebben dan deze individuele instellingen. Je kan je deze overgeërfde permissies hier <strong>niet</strong> veranderen.";
App::$strings["Some permissions may be inherited from your channel's <a href=\"settings\"><strong>privacy settings</strong></a>, which have higher priority than individual settings. You can change those settings here but they wont have any impact unless the inherited setting changes."] = "Sommige permissies worden mogelijk overgeërfd van de <a href=\"settings\">privacy-instellingen</a> van jouw kanaal, die een hogere prioriteit hebben dan deze individuele permissies. Je kan de permissies hier veranderen, maar die hebben geen effect, tenzij de overgeërfde permissies worden veranderd. ";
App::$strings["Last update:"] = "Laatste wijziging:";
+App::$strings["Image uploaded but image cropping failed."] = "Afbeelding geüpload, maar afbeelding kon niet worden bijgesneden. ";
+App::$strings["Cover Photos"] = "Omslagfoto's";
+App::$strings["Image resize failed."] = "Afbeelding kon niet van grootte veranderd worden.";
+App::$strings["Unable to process image"] = "Afbeelding kan niet verwerkt worden";
+App::$strings["Image upload failed."] = "Uploaden afbeelding mislukt";
+App::$strings["Unable to process image."] = "Niet in staat om afbeelding te verwerken.";
+App::$strings["female"] = "vrouw";
+App::$strings["%1\$s updated her %2\$s"] = "%1\$s heeft haar %2\$s bijgewerkt";
+App::$strings["male"] = "man";
+App::$strings["%1\$s updated his %2\$s"] = "%1\$s heeft zijn %2\$s bijgewerkt";
+App::$strings["%1\$s updated their %2\$s"] = "De %2\$s van %1\$s is bijgewerkt";
+App::$strings["cover photo"] = "omslagfoto";
+App::$strings["Photo not available."] = "Foto niet beschikbaar.";
+App::$strings["Upload File:"] = "Bestand uploaden:";
+App::$strings["Select a profile:"] = "Kies een profiel:";
+App::$strings["Upload Cover Photo"] = "Omslagfoto uploaden";
+App::$strings["or"] = "of";
+App::$strings["skip this step"] = "sla deze stap over";
+App::$strings["select a photo from your photo albums"] = "Kies een foto uit jouw fotoalbums";
+App::$strings["Crop Image"] = "Afbeelding bijsnijden";
+App::$strings["Please adjust the image cropping for optimum viewing."] = "Snij de afbeelding zo uit dat deze optimaal wordt weergegeven.";
+App::$strings["Done Editing"] = "Klaar met bewerken";
+App::$strings["\$Projectname channel"] = "\$Projectname-kanaal";
+App::$strings["Public access denied."] = "Openbare toegang geweigerd.";
+App::$strings["%d rating"] = array(
+ 0 => "%d beoordeling",
+ 1 => "%d beoordelingen",
+);
+App::$strings["Gender: "] = "Geslacht:";
+App::$strings["Status: "] = "Status: ";
+App::$strings["Homepage: "] = "Homepage: ";
+App::$strings["Age:"] = "Leeftijd:";
+App::$strings["Location:"] = "Plaats:";
+App::$strings["Description:"] = "Omschrijving:";
+App::$strings["Hometown:"] = "Oorspronkelijk uit:";
+App::$strings["About:"] = "Over:";
+App::$strings["Connect"] = "Verbinden";
+App::$strings["Public Forum:"] = "Openbaar forum:";
+App::$strings["Keywords: "] = "Trefwoorden: ";
+App::$strings["Don't suggest"] = "Niet voorstellen";
+App::$strings["Common connections:"] = "Gemeenschappelijke connecties:";
+App::$strings["Global Directory"] = "Volledige kanalengids";
+App::$strings["Local Directory"] = "Lokale kanalengids";
+App::$strings["Finding:"] = "Gezocht naar:";
+App::$strings["Channel Suggestions"] = "Voorgestelde kanalen";
+App::$strings["next page"] = "volgende pagina";
+App::$strings["previous page"] = "vorige pagina";
+App::$strings["Sort options"] = "Sorteeropties";
+App::$strings["Alphabetic"] = "Alfabetisch";
+App::$strings["Reverse Alphabetic"] = "Omgekeerd alfabetisch";
+App::$strings["Newest to Oldest"] = "Nieuw naar oud";
+App::$strings["Oldest to Newest"] = "Oud naar nieuw";
+App::$strings["No entries (some entries may be hidden)."] = "Niets gevonden (sommige kanalen kunnen verborgen zijn).";
+App::$strings["This site is not a directory server"] = "Deze hub is geen kanalengidshub (directoryserver)";
+App::$strings["This directory server requires an access token"] = "Deze kanalengidshub (directoryserver) heeft een toegangs-token nodig";
+App::$strings["Permission denied"] = "Toegang geweigerd";
+App::$strings["Invalid message"] = "Ongeldig bericht";
+App::$strings["no results"] = "geen resultaten";
+App::$strings["Delivery report for %1\$s"] = "Afleveringsrapport voor %1\$s";
+App::$strings["channel sync processed"] = "kanaalsync verwerkt";
+App::$strings["queued"] = "in wachtrij";
+App::$strings["posted"] = "verstuurd";
+App::$strings["accepted for delivery"] = "geaccepteerd om afgeleverd te worden";
+App::$strings["updated"] = "geüpdatet";
+App::$strings["update ignored"] = "update genegeerd";
+App::$strings["permission denied"] = "toegang geweigerd";
+App::$strings["recipient not found"] = "ontvanger niet gevonden";
+App::$strings["mail recalled"] = "Privébericht ingetrokken";
+App::$strings["duplicate mail received"] = "dubbel privébericht ontvangen";
+App::$strings["mail delivered"] = "privébericht afgeleverd";
+App::$strings["Item not found"] = "Item niet gevonden";
+App::$strings["Delete block?"] = "Blok verwijderen";
+App::$strings["Bold"] = "Vet";
+App::$strings["Italic"] = "Cursief";
+App::$strings["Underline"] = "Onderstrepen";
+App::$strings["Quote"] = "Citeren";
+App::$strings["Code"] = "Broncode";
+App::$strings["Upload photo"] = "Foto uploaden";
+App::$strings["Attach file"] = "Bestand toevoegen";
+App::$strings["Insert YouTube video"] = "YouTube-video invoegen";
+App::$strings["Insert Vorbis [.ogg] video"] = "Vorbis-video [.ogg] invoegen";
+App::$strings["Insert Vorbis [.ogg] audio"] = "Vorbis-audio [.ogg] invoegen";
+App::$strings["Set your location"] = "Locatie instellen";
+App::$strings["Clear browser location"] = "Locatie van webbrowser wissen";
+App::$strings["Please wait"] = "Even wachten";
+App::$strings["Permission settings"] = "Permissies";
+App::$strings["Public post"] = "Openbaar bericht";
+App::$strings["Title (optional)"] = "Titel (optioneel)";
+App::$strings["Categories (optional, comma-separated list)"] = "Categorieën (optioneel, door komma's gescheiden lijst)";
+App::$strings["Example: bob@example.com, mary@example.com"] = "Voorbeeld: bob@voorbeeld.nl, mary@voorbeeld.be";
+App::$strings["Preview"] = "Voorvertoning";
+App::$strings["Set expiration date"] = "Verloopdatum instellen";
+App::$strings["Edit Block"] = "Blok bewerken";
+App::$strings["Delete layout?"] = "Lay-out verwijderen?";
+App::$strings["Layout Description (Optional)"] = "Lay-out-omschrijving (optioneel)";
+App::$strings["Layout Name"] = "Naam lay-out";
+App::$strings["Edit Layout"] = "Lay-out bewerken";
+App::$strings["Item is not editable"] = "Item is niet te bewerken";
+App::$strings["Expires YYYY-MM-DD HH:MM"] = "Verloopt op DD-MM-YYYY om HH:MM";
+App::$strings["Delete item?"] = "Item verwijderen?";
+App::$strings["Toggle voting"] = "Peiling in- of uitschakelen";
+App::$strings["OK"] = "OK";
+App::$strings["Cancel"] = "Annuleren";
+App::$strings["Edit post"] = "Bericht bewerken";
+App::$strings["Delete webpage?"] = "Webpagina verwijderen?";
+App::$strings["Page link title"] = "Titel van paginalink";
+App::$strings["Edit Webpage"] = "Webpagina bewerken";
+App::$strings["Calendar entries imported."] = "Agenda-items geïmporteerd.";
+App::$strings["No calendar entries found."] = "Geen agenda-items gevonden.";
+App::$strings["Event can not end before it has started."] = "Gebeurtenis kan niet eindigen voordat het is begonnen";
+App::$strings["Unable to generate preview."] = "Niet in staat om voorvertoning te genereren";
+App::$strings["Event title and start time are required."] = "Titel en begintijd van gebeurtenis zijn vereist.";
+App::$strings["Event not found."] = "Gebeurtenis niet gevonden";
+App::$strings["event"] = "gebeurtenis";
+App::$strings["Edit event title"] = "Titel bewerken";
+App::$strings["Event title"] = "Titel";
+App::$strings["Categories (comma-separated list)"] = "Categorieën (door komma's gescheiden lijst)";
+App::$strings["Edit Category"] = "Categorie";
+App::$strings["Category"] = "Categorie";
+App::$strings["Edit start date and time"] = "Begindatum en -tijd bewerken";
+App::$strings["Start date and time"] = "Begindatum en -tijd";
+App::$strings["Finish date and time are not known or not relevant"] = "Einddatum en -tijd zijn niet bekend of niet van toepassing";
+App::$strings["Edit finish date and time"] = "Einddatum en -tijd bewerken";
+App::$strings["Finish date and time"] = "Einddatum en -tijd";
+App::$strings["Adjust for viewer timezone"] = "Aanpassen aan de tijdzone van wie deze gebeurtenis bekijkt";
+App::$strings["Important for events that happen in a particular place. Not practical for global holidays."] = "Belangrijk voor gebeurtenissen die op een bepaalde locatie plaatsvinden. Niet praktisch voor wereldwijde feestdagen.";
+App::$strings["Edit Description"] = "Omschrijving bewerken";
+App::$strings["Edit Location"] = "Locatie bewerken";
+App::$strings["Location"] = "Locatie";
+App::$strings["Share this event"] = "Deel deze gebeurtenis";
+App::$strings["Advanced Options"] = "Geavanceerde opties";
+App::$strings["Edit event"] = "Gebeurtenis bewerken";
+App::$strings["Delete event"] = "Gebeurtenis verwijderen";
+App::$strings["calendar"] = "agenda";
+App::$strings["Event removed"] = "Gebeurtenis verwijderd";
+App::$strings["Failed to remove event"] = "Verwijderen gebeurtenis mislukt";
+App::$strings["Photos"] = "Foto's";
+App::$strings["Share content from Firefox to \$Projectname"] = "Deel webpagina's vanuit Firefox met ";
+App::$strings["Activate the Firefox \$Projectname provider"] = "Activeer de \$Projectname-service in Firefox";
+App::$strings["Save to Folder:"] = "Bewaar in map: ";
+App::$strings["- select -"] = "- kies map -";
+App::$strings["Permission Denied."] = "Toegang geweigerd";
+App::$strings["File not found."] = "Bestand niet gevonden.";
+App::$strings["Edit file permissions"] = "Bestandsrechten bewerken";
+App::$strings["Set/edit permissions"] = "Rechten instellen/bewerken";
+App::$strings["Include all files and sub folders"] = "Toepassen op alle bestanden en submappen";
+App::$strings["Return to file list"] = "Terugkeren naar bestandlijst ";
+App::$strings["Copy/paste this code to attach file to a post"] = "Kopieer/plak deze code om het bestand aan een bericht te koppelen";
+App::$strings["Copy/paste this URL to link file from a web page"] = "Kopieer/plak deze URL om het bestand aan een externe webpagina te koppelen";
+App::$strings["Share this file"] = "Dit bestand delen";
+App::$strings["Show URL to this file"] = "Toon URL van dit bestand";
+App::$strings["Notify your contacts about this file"] = "Jouw connecties over dit bestand berichten";
+App::$strings["Channel added."] = "Kanaal toegevoegd.";
+App::$strings["Contact not found."] = "Contact niet gevonden";
+App::$strings["Friend suggestion sent."] = "Kanaalvoorstel verzonden.";
+App::$strings["Suggest Friends"] = "Kanalen voorstellen";
+App::$strings["Suggest a friend for %s"] = "Stel een kanaal voor aan %s";
+App::$strings["Privacy group created."] = "Privacygroep aangemaakt";
+App::$strings["Could not create privacy group."] = "Kon privacygroep niet aanmaken";
+App::$strings["Privacy group not found."] = "Privacygroep niet gevonden";
+App::$strings["Privacy group updated."] = "Privacygroep bijgewerkt";
+App::$strings["Create a group of channels."] = "Privacygroep met kanalen aanmaken";
+App::$strings["Privacy group name: "] = "Naam privacygroep: ";
+App::$strings["Members are visible to other channels"] = "Kanalen in deze privacygroep zijn zichtbaar voor andere kanalen";
+App::$strings["Privacy group removed."] = "Privacygroep verwijderd.";
+App::$strings["Unable to remove privacy group."] = "Verwijderen privacygroep mislukt";
+App::$strings["Privacy group editor"] = "Privacygroep bewerken";
+App::$strings["Members"] = "Kanalen";
+App::$strings["All Connected Channels"] = "Alle kanaalconnecties";
+App::$strings["Click on a channel to add or remove."] = "Klik op een kanaal om deze toe te voegen of te verwijderen.";
+App::$strings["Documentation Search"] = "Zoek documentatie";
+App::$strings["Help:"] = "Hulp:";
+App::$strings["Help"] = "Hulp";
+App::$strings["\$Projectname Documentation"] = "\$Projectname-documentatie";
+App::$strings["\$Projectname"] = "\$Projectname";
+App::$strings["Welcome to %s"] = "Welkom op %s";
+App::$strings["First Name"] = "Voornaam";
+App::$strings["Last Name"] = "Achternaam";
+App::$strings["Nickname"] = "Bijnaam";
+App::$strings["Full Name"] = "Volledige naam";
+App::$strings["Profile Photo"] = "Profielfoto";
+App::$strings["Profile Photo 16px"] = "Profielfoto 16px";
+App::$strings["Profile Photo 32px"] = "Profielfoto 32px";
+App::$strings["Profile Photo 48px"] = "Profielfoto 48px";
+App::$strings["Profile Photo 64px"] = "Profielfoto 64px";
+App::$strings["Profile Photo 80px"] = "Profielfoto 80px";
+App::$strings["Profile Photo 128px"] = "Profielfoto 128px";
+App::$strings["Timezone"] = "Tijdzone";
+App::$strings["Homepage URL"] = "URL homepagina";
+App::$strings["Language"] = "Taal";
+App::$strings["Birth Year"] = "Geboortejaar";
+App::$strings["Birth Month"] = "Geboortemaand";
+App::$strings["Birth Day"] = "Geboortedag";
+App::$strings["Birthdate"] = "Geboortedatum";
+App::$strings["Gender"] = "Geslacht";
+App::$strings["Male"] = "Man";
+App::$strings["Female"] = "Vrouw";
+App::$strings["webpage"] = "Webpagina";
+App::$strings["block"] = "blok";
+App::$strings["layout"] = "lay-out";
+App::$strings["menu"] = "menu";
+App::$strings["%s element installed"] = "%s onderdeel geïnstalleerd";
+App::$strings["%s element installation failed"] = "Installatie %s-element mislukt";
+App::$strings["Your service plan only allows %d channels."] = "Jouw abonnement staat maar %d kanalen toe.";
+App::$strings["Nothing to import."] = "Niets gevonden om te importeren";
+App::$strings["Unable to download data from old server"] = "Niet in staat om gegevens van de oude hub te downloaden";
+App::$strings["Imported file is empty."] = "Geïmporteerde bestand is leeg";
+App::$strings["Warning: Database versions differ by %1\$d updates."] = "Waarschuwing: database-versies lopen %1\$d updates achter.";
+App::$strings["Cloned channel not found. Import failed."] = "Gekloond kanaal niet gevonden. Importeren mislukt.";
+App::$strings["No channel. Import failed."] = "Geen kanaal. Importeren mislukt.";
+App::$strings["Import completed."] = "Import voltooid.";
+App::$strings["You must be logged in to use this feature."] = "Je moet ingelogd zijn om dit onderdeel te kunnen gebruiken.";
+App::$strings["Import Channel"] = "Kanaal importeren";
+App::$strings["Use this form to import an existing channel from a different server/hub. You may retrieve the channel identity from the old server/hub via the network or provide an export file."] = "Gebruik dit formulier om een bestaand kanaal te importeren van een andere hub. Je kan de kanaal-identiteit van de oude hub via het netwerk ontvangen of een exportbestand verstrekken.";
+App::$strings["File to Upload"] = "Bestand om te uploaden";
+App::$strings["Or provide the old server/hub details"] = "Of vul de gegevens van de oude hub in";
+App::$strings["Your old identity address (xyz@example.com)"] = "Jouw oude kanaaladres (xyz@example.com)";
+App::$strings["Your old login email address"] = "Het e-mailadres van je oude account";
+App::$strings["Your old login password"] = "Wachtwoord van jouw oude account";
+App::$strings["For either option, please choose whether to make this hub your new primary address, or whether your old location should continue this role. You will be able to post from either location, but only one can be marked as the primary location for files, photos, and media."] = "Voor elke optie geldt dat je moet kiezen of je jouw primaire kanaaladres op deze hub wil instellen of dat jouw oude hub deze rol blijft vervullen.";
+App::$strings["Make this hub my primary location"] = "Stel deze hub als mijn primaire locatie in";
+App::$strings["Import existing posts if possible (experimental - limited by available memory"] = "Importeer bestaande berichten wanneer mogelijk (experimenteel - afhankelijk van beschikbaar servergeheugen)";
+App::$strings["This process may take several minutes to complete. Please submit the form only once and leave this page open until finished."] = "Dit proces kan enkele minuten in beslag nemen. Klik maar één keer op opslaan en verlaat deze pagina niet alvorens het proces is voltooid.";
+App::$strings["Import completed"] = "Importeren voltooid";
+App::$strings["Import Items"] = "Importeer items";
+App::$strings["Use this form to import existing posts and content from an export file."] = "Gebruik dit formulier om bestaande berichten en andere inhoud vanuit een exportbestand te importeren.";
+App::$strings["Total invitation limit exceeded."] = "Limiet voor aantal uitnodigingen overschreden.";
+App::$strings["%s : Not a valid email address."] = "%s : Geen geldig e-mailadres.";
+App::$strings["Please join us on \$Projectname"] = "Uitnodiging voor \$Projectname";
+App::$strings["Invitation limit exceeded. Please contact your site administrator."] = "Limiet voor aantal uitnodigingen overschreden. Neem contact op met je hub-beheerder.";
+App::$strings["%s : Message delivery failed."] = "%s: Aflevering bericht mislukt.";
+App::$strings["%d message sent."] = array(
+ 0 => "%d bericht verzonden.",
+ 1 => "%d berichten verzonden.",
+);
+App::$strings["You have no more invitations available"] = "Je hebt geen uitnodigingen meer beschikbaar";
+App::$strings["Send invitations"] = "Uitnodigingen verzenden";
+App::$strings["Enter email addresses, one per line:"] = "Voer e-mailadressen in, één per regel:";
+App::$strings["Your message:"] = "Jouw bericht:";
+App::$strings["Please join my community on \$Projectname."] = "Hierbij nodig ik je uit om mij, en andere vrienden en kennissen, op \$Projectname te vergezellen. Lees meer over \$Projectname op http://hubzilla.org";
+App::$strings["You will need to supply this invitation code:"] = "Je moet deze uitnodigingscode opgeven:";
+App::$strings["1. Register at any \$Projectname location (they are all inter-connected)"] = "1. Registreer je op een willekeurige \$Projectname-hub (ze zijn allemaal onderling met elkaar verbonden):";
+App::$strings["2. Enter my \$Projectname network address into the site searchbar."] = "2. Nadat je bent ingelogd en een kanaal hebt aangemaakt kan je mijn \$Projectname-kanaaladres in het zoekveld invullen:";
+App::$strings["or visit"] = "of bezoek";
+App::$strings["3. Click [Connect]"] = "3. Klik op [+ Verbinden]";
+App::$strings["Unable to locate original post."] = "Niet in staat om de originele locatie van het bericht te vinden. ";
+App::$strings["Empty post discarded."] = "Leeg bericht geannuleerd";
+App::$strings["Executable content type not permitted to this channel."] = "Uitvoerbare bestanden zijn niet toegestaan op dit kanaal.";
+App::$strings["Duplicate post suppressed."] = "Dubbel bericht tegengehouden.";
+App::$strings["System error. Post not saved."] = "Systeemfout. Bericht niet opgeslagen.";
+App::$strings["Unable to obtain post information from database."] = "Niet in staat om informatie over dit bericht uit de database te verkrijgen.";
+App::$strings["You have reached your limit of %1$.0f top level posts."] = "Je hebt jouw limiet van %1$.0f berichten bereikt.";
+App::$strings["You have reached your limit of %1$.0f webpages."] = "Je hebt jouw limiet van %1$.0f webpagina's bereikt.";
+App::$strings["Layouts"] = "Lay-outs";
+App::$strings["Comanche page description language help"] = "Hulp met de paginabeschrijvingstaal Comanche";
+App::$strings["Layout Description"] = "Lay-out-omschrijving";
+App::$strings["Download PDL file"] = "Download PDL-bestand";
+App::$strings["Like/Dislike"] = "Leuk/niet leuk";
+App::$strings["This action is restricted to members."] = "Deze actie kan alleen door \$Projectname-leden worden uitgevoerd.";
+App::$strings["Please <a href=\"rmagic\">login with your \$Projectname ID</a> or <a href=\"register\">register as a new \$Projectname member</a> to continue."] = "Je dient <a href=\"rmagic\">in te loggen met je \$Projectname-account</a> of <a href=\"register\">een nieuw \$Projectname-account aan te maken</a> om verder te kunnen gaan.";
+App::$strings["Invalid request."] = "Ongeldig verzoek";
+App::$strings["channel"] = "kanaal";
+App::$strings["thing"] = "ding";
+App::$strings["Channel unavailable."] = "Kanaal niet beschikbaar.";
+App::$strings["Previous action reversed."] = "Vorige actie omgedraaid";
+App::$strings["photo"] = "foto";
+App::$strings["status"] = "bericht";
+App::$strings["%1\$s likes %2\$s's %3\$s"] = "%1\$s vindt %3\$s van %2\$s leuk";
+App::$strings["%1\$s doesn't like %2\$s's %3\$s"] = "%1\$s vindt %3\$s van %2\$s niet leuk";
+App::$strings["%1\$s agrees with %2\$s's %3\$s"] = "%1\$s is het eens met %2\$s's %3\$s";
+App::$strings["%1\$s doesn't agree with %2\$s's %3\$s"] = "%1\$s is het niet eens met %2\$s's %3\$s";
+App::$strings["%1\$s abstains from a decision on %2\$s's %3\$s"] = "%1\$s onthoudt zich van een besluit over %2\$s's %3\$s";
+App::$strings["%1\$s is attending %2\$s's %3\$s"] = "%1\$s is aanwezig op %2\$s's %3\$s";
+App::$strings["%1\$s is not attending %2\$s's %3\$s"] = "%1\$s is niet aanwezig op %2\$s's %3\$s";
+App::$strings["%1\$s may attend %2\$s's %3\$s"] = "%1\$s is mogelijk aanwezig op %2\$s's %3\$s";
+App::$strings["Action completed."] = "Actie voltooid";
+App::$strings["Thank you."] = "Bedankt";
+App::$strings["Remote privacy information not available."] = "Privacy-informatie op afstand niet beschikbaar.";
+App::$strings["Visible to:"] = "Zichtbaar voor:";
+App::$strings["Location not found."] = "Locatie niet gevonden.";
+App::$strings["Location lookup failed."] = "Opzoeken locatie mislukt";
+App::$strings["Please select another location to become primary before removing the primary location."] = "Kies eerst een andere primaire locatie alvorens de huidige primaire locatie te verwijderen.";
+App::$strings["Syncing locations"] = "Locaties synchronizeren";
+App::$strings["No locations found."] = "Geen locaties gevonden.";
+App::$strings["Manage Channel Locations"] = "Kanaallocaties beheren";
+App::$strings["Primary"] = "Primair";
+App::$strings["Drop"] = "Verwijderen";
+App::$strings["Sync Now"] = "Nu synchroniseren";
+App::$strings["Please wait several minutes between consecutive operations."] = "Wacht enkele minuten tussen opeenvolgende handelingen.";
+App::$strings["When possible, drop a location by logging into that website/hub and removing your channel."] = "Wij adviseren, wanneer dit (nog) mogelijk is, de locatie te verwijderen door op de hub van de kloon in te loggen en het kanaal daar te verwijderen.";
+App::$strings["Use this form to drop the location if the hub is no longer operating."] = "Gebruik dit formulier om de locatie te verwijderen wanneer de hub van de kloon niet meer operationeel is.";
+App::$strings["No valid account found."] = "Geen geldige account gevonden.";
+App::$strings["Password reset request issued. Check your email."] = "Het verzoek om je wachtwoord opnieuw in te stellen is behandeld. Controleer je e-mail.";
+App::$strings["Site Member (%s)"] = "Lid van hub (%s)";
+App::$strings["Password reset requested at %s"] = "Verzoek tot het opnieuw instellen van een wachtwoord op %s is ingediend";
+App::$strings["Request could not be verified. (You may have previously submitted it.) Password reset failed."] = "Het verzoek kon niet worden geverifieerd. (Mogelijk heb je al eerder een verzoek ingediend.) Opnieuw instellen van wachtwoord is mislukt.";
+App::$strings["Password Reset"] = "Wachtwoord vergeten?";
+App::$strings["Your password has been reset as requested."] = "Jouw wachtwoord is opnieuw ingesteld zoals je had verzocht.";
+App::$strings["Your new password is"] = "Jouw nieuwe wachtwoord is";
+App::$strings["Save or copy your new password - and then"] = "Kopieer of sla je nieuwe wachtwoord op - en";
+App::$strings["click here to login"] = "klik dan hier om in te loggen";
+App::$strings["Your password may be changed from the <em>Settings</em> page after successful login."] = "Jouw wachtwoord kan worden veranderd onder <em>instellingen</em>, nadat je succesvol bent ingelogd.";
+App::$strings["Your password has changed at %s"] = "Jouw wachtwoord op %s is veranderd";
+App::$strings["Forgot your Password?"] = "Wachtwoord vergeten?";
+App::$strings["Enter your email address and submit to have your password reset. Then check your email for further instructions."] = "Voer je e-mailadres in en verstuur deze om je wachtwoord opnieuw in te stellen. Controleer hierna hier je e-mail voor verdere instructies.";
+App::$strings["Email Address"] = "E-mailadres";
+App::$strings["Reset"] = "Opnieuw instellen";
+App::$strings["Hub not found."] = "Hub niet gevonden.";
+App::$strings["Unable to lookup recipient."] = "Niet in staat om ontvanger op te zoeken.";
+App::$strings["Unable to communicate with requested channel."] = "Niet in staat om met het aangevraagde kanaal te communiceren.";
+App::$strings["Cannot verify requested channel."] = "Kan opgevraagd kanaal niet verifieren";
+App::$strings["Selected channel has private message restrictions. Send failed."] = "Gekozen kanaal heeft restricties voor privéberichten. Verzenden mislukt.";
+App::$strings["Messages"] = "Berichten";
+App::$strings["Message recalled."] = "Bericht ingetrokken.";
+App::$strings["Conversation removed."] = "Conversatie verwijderd";
+App::$strings["Requested channel is not in this network"] = "Opgevraagd kanaal is niet in dit netwerk beschikbaar";
+App::$strings["Send Private Message"] = "Privébericht versturen";
+App::$strings["To:"] = "Aan:";
+App::$strings["Subject:"] = "Onderwerp:";
+App::$strings["Send"] = "Verzenden";
+App::$strings["Delete message"] = "Bericht verwijderen";
+App::$strings["Delivery report"] = "Afleveringsrapport";
+App::$strings["Recall message"] = "Bericht intrekken";
+App::$strings["Message has been recalled."] = "Bericht is ingetrokken.";
+App::$strings["Delete Conversation"] = "Verwijder conversatie";
+App::$strings["No secure communications available. You <strong>may</strong> be able to respond from the sender's profile page."] = "Geen veilige communicatie beschikbaar. <strong>Mogelijk</strong> kan je reageren op de kanaalpagina van de afzender.";
+App::$strings["Send Reply"] = "Antwoord versturen";
+App::$strings["Your message for %s (%s):"] = "Jouw privébericht aan %s (%s):";
+App::$strings["You have created %1$.0f of %2$.0f allowed channels."] = "Je hebt %1$.0f van totaal %2$.0f toegestane kanalen aangemaakt.";
+App::$strings["Create a new channel"] = "Nieuw kanaal aanmaken";
+App::$strings["Channel Manager"] = "Kanaalbeheer";
+App::$strings["Current Channel"] = "Huidig kanaal";
+App::$strings["Switch to one of your channels by selecting it."] = "Activeer een van jouw andere kanalen door er op te klikken.";
+App::$strings["Default Channel"] = "Standaardkanaal";
+App::$strings["Make Default"] = "Als standaard instellen";
+App::$strings["%d new messages"] = "%d nieuwe berichten";
+App::$strings["%d new introductions"] = "%d nieuwe connectieverzoeken";
+App::$strings["Delegated Channel"] = "Uitbesteed kanaal";
+App::$strings["Profile Match"] = "Profielovereenkomst";
+App::$strings["No keywords to match. Please add keywords to your default profile."] = "Je hebt geen trefwoorden waarmee overeenkomsten gevonden kunnen worden. Voeg enkele trefwoorden aan je standaardprofiel toe.";
+App::$strings["is interested in:"] = "is geïnteresseerd in:";
+App::$strings["No matches"] = "Geen overeenkomsten";
+App::$strings["Unable to update menu."] = "Niet in staat om menu aan te passen";
+App::$strings["Unable to create menu."] = "Niet in staat om menu aan te maken.";
+App::$strings["Menu Name"] = "Menunaam";
+App::$strings["Unique name (not visible on webpage) - required"] = "Unieke naam vereist (niet zichtbaar op webpagina)";
+App::$strings["Menu Title"] = "Menutitel";
+App::$strings["Visible on webpage - leave empty for no title"] = "Zichtbaar op webpagina (leeg laten voor geen titel)";
+App::$strings["Allow Bookmarks"] = "Bladwijzers toestaan";
+App::$strings["Menu may be used to store saved bookmarks"] = "Menu kan gebruikt worden om bladwijzers in op te slaan";
+App::$strings["Submit and proceed"] = "Opslaan en doorgaan";
+App::$strings["Menus"] = "Menu's";
+App::$strings["Bookmarks allowed"] = "Bladwijzers toegestaan";
+App::$strings["Delete this menu"] = "Menu verwijderen";
+App::$strings["Edit menu contents"] = "Bewerk de inhoud van het menu";
+App::$strings["Edit this menu"] = "Dit menu bewerken";
+App::$strings["Menu could not be deleted."] = "Menu kon niet verwijderd worden.";
+App::$strings["Menu not found."] = "Menu niet gevonden.";
+App::$strings["Edit Menu"] = "Menu bewerken";
+App::$strings["Add or remove entries to this menu"] = "Items aan dit menu toevoegen of verwijder";
+App::$strings["Menu name"] = "Naam van menu";
+App::$strings["Must be unique, only seen by you"] = "Moet uniek zijn en is alleen zichtbaar voor jou.";
+App::$strings["Menu title"] = "Titel van menu";
+App::$strings["Menu title as seen by others"] = "Titel van menu zoals anderen dat zien.";
+App::$strings["Allow bookmarks"] = "Bladwijzers toestaan";
+App::$strings["Not found."] = "Niet gevonden.";
+App::$strings["Unable to create element."] = "Niet in staat om onderdeel aan te maken.";
+App::$strings["Unable to update menu element."] = "Menu-onderdeel kan niet worden geüpdatet.";
+App::$strings["Unable to add menu element."] = "Menu-onderdeel kan niet worden toegevoegd.";
+App::$strings["Menu Item Permissions"] = "Permissies menu-item";
+App::$strings["(click to open/close)"] = "(klik om te openen/sluiten)";
+App::$strings["Link Name"] = "Linknaam";
+App::$strings["Link or Submenu Target"] = "Linkdoel of submenu-doel";
+App::$strings["Enter URL of the link or select a menu name to create a submenu"] = "Geef de URL van de link of kies een menunaam om een submenu aan te maken";
+App::$strings["Use magic-auth if available"] = "Gebruik magic-auth wanneer beschikbaar";
+App::$strings["Open link in new window"] = "Open link in nieuw venster";
+App::$strings["Order in list"] = "Volgorde in lijst";
+App::$strings["Higher numbers will sink to bottom of listing"] = "Hogere nummers komen onderaan de lijst terecht";
+App::$strings["Submit and finish"] = "Opslaan en afsluiten";
+App::$strings["Submit and continue"] = "Opslaan en doorgaan";
+App::$strings["Menu:"] = "Menu:";
+App::$strings["Link Target"] = "Linkdoel";
+App::$strings["Edit menu"] = "Menu bewerken";
+App::$strings["Edit element"] = "Onderdeel bewerken";
+App::$strings["Drop element"] = "Onderdeel verwijderen";
+App::$strings["New element"] = "Nieuw element";
+App::$strings["Edit this menu container"] = "Deze menu-container bewerken";
+App::$strings["Add menu element"] = "Menu-element toevoegen";
+App::$strings["Delete this menu item"] = "Dit menu-item verwijderen";
+App::$strings["Edit this menu item"] = "Dit menu-item bewerken";
+App::$strings["Menu item not found."] = "Menu-item niet gevonden.";
+App::$strings["Menu item deleted."] = "Menu-item verwijderd.";
+App::$strings["Menu item could not be deleted."] = "Menu-item kon niet worden verwijderd.";
+App::$strings["Edit Menu Element"] = "Menu-element bewerken";
+App::$strings["Link text"] = "Linktekst";
+App::$strings["__ctx:mood__ %1\$s is %2\$s"] = "%1\$s is %2\$s";
+App::$strings["Mood"] = "Stemming";
+App::$strings["Set your current mood and tell your friends"] = "Noteer je huidige stemming en toon het aan je connecties";
App::$strings["No such group"] = "Collectie niet gevonden";
App::$strings["No such channel"] = "Niet zo'n kanaal";
App::$strings["forum"] = "forum";
@@ -1516,8 +851,115 @@ App::$strings["Search Results For:"] = "Zoekresultaten voor:";
App::$strings["Privacy group is empty"] = "Privacygroep is leeg";
App::$strings["Privacy group: "] = "Privacygroep: ";
App::$strings["Invalid connection."] = "Ongeldige connectie.";
-App::$strings["Cover Photos"] = "Omslagfoto's";
-App::$strings["Upload Cover Photo"] = "Omslagfoto uploaden";
+App::$strings["Name or caption"] = "Naam";
+App::$strings["Examples: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \"Aviation Group\""] = "Voorbeelden: \"Jan Pietersen\", \"Willems weblog\", \"Computerforum\"";
+App::$strings["Choose a short nickname"] = "Korte bijnaam";
+App::$strings["Your nickname will be used to create an easy to remember channel address e.g. nickname%s"] = "Deze bijnaam wordt gebruikt om een makkelijk te onthouden kanaaladres van jouw kanaal aan te maken, die je dan met anderen kunt delen. Bijvoorbeeld: bijnaam%s";
+App::$strings["Channel role and privacy"] = "Kanaaltype en privacy";
+App::$strings["Select a channel role with your privacy requirements."] = "Kies een kanaaltype met het door jou gewenste privacyniveau.";
+App::$strings["Read more about roles"] = "Lees meer over kanaaltypes";
+App::$strings["Create Channel"] = "Kanaal aanmaken";
+App::$strings["A channel is your identity on this network. It can represent a person, a blog, or a forum to name a few. Channels can make connections with other channels to share information with highly detailed permissions."] = "Een kanaal is jouw identiteit in dit netwerk. Het kan bijvoorbeeld een persoon, een blog of een forum vertegenwoordigen. Door met elkaar te verbinden kunnen kanalen, met behulp van uitgebreide permissies, informatie uitwisselen.";
+App::$strings["or <a href=\"import\">import an existing channel</a> from another location."] = "Of <a href=\"import\">importeer een bestaand kanaal</a> vanaf een andere locatie";
+App::$strings["Invalid request identifier."] = "Ongeldige verzoek identificator (request identifier)";
+App::$strings["Discard"] = "Annuleren";
+App::$strings["No more system notifications."] = "Geen systeemnotificaties meer.";
+App::$strings["System Notifications"] = "Systeemnotificaties";
+App::$strings["Mark all system notifications seen"] = "Markeer alle systeemnotificaties als bekeken";
+App::$strings["Unable to find your hub."] = "Niet in staat om je hub te vinden";
+App::$strings["Post successful."] = "Verzenden bericht geslaagd.";
+App::$strings["OpenID protocol error. No ID returned."] = "OpenID-protocolfout. Geen ID terugontvangen.";
+App::$strings["Login failed."] = "Inloggen mislukt.";
+App::$strings["Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."] = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";
+App::$strings["This setting requires special processing and editing has been blocked."] = "Deze instelling vereist een speciaal proces en bewerken is geblokkeerd.";
+App::$strings["Configuration Editor"] = "Configuratiebewerker";
+App::$strings["Warning: Changing some settings could render your channel inoperable. Please leave this page unless you are comfortable with and knowledgeable about how to correctly use this feature."] = "Waarschuwing: het veranderen van sommige instellingen kunnen jouw kanaal onklaar maken. Verlaat deze pagina, tenzij je weet waar je mee bezig bent en voldoende kennis bezit over hoe je deze functies moet gebruiken. ";
+App::$strings["Layout updated."] = "Lay-out bijgewerkt.";
+App::$strings["Edit System Page Description"] = "Systeempagina's bewerken";
+App::$strings["Layout not found."] = "Lay-out niet gevonden.";
+App::$strings["Module Name:"] = "Modulenaam:";
+App::$strings["Layout Help"] = "Lay-out-hulp";
+App::$strings["Page owner information could not be retrieved."] = "Informatie over de pagina-eigenaar werd niet ontvangen.";
+App::$strings["Profile Photos"] = "Profielfoto's";
+App::$strings["Album not found."] = "Album niet gevonden.";
+App::$strings["Delete Album"] = "Verwijder album";
+App::$strings["Multiple storage folders exist with this album name, but within different directories. Please remove the desired folder or folders using the Files manager"] = "Er bestaan meerdere submappen met deze albumnaam, maar verspreidt over verschillende mappen. Verwijder de gewenste map(pen) met de bestandsbeheerder.";
+App::$strings["Delete Photo"] = "Verwijder foto";
+App::$strings["No photos selected"] = "Geen foto's geselecteerd";
+App::$strings["Access to this item is restricted."] = "Toegang tot dit item is beperkt.";
+App::$strings["%1$.2f MB of %2$.2f MB photo storage used."] = "%1$.2f MB van %2$.2f MB aan foto-opslag gebruikt.";
+App::$strings["%1$.2f MB photo storage used."] = "%1$.2f MB aan foto-opslag gebruikt.";
+App::$strings["Upload Photos"] = "Foto's uploaden";
+App::$strings["Enter an album name"] = "Vul een albumnaam in";
+App::$strings["or select an existing album (doubleclick)"] = "of kies een bestaand album (dubbelklikken)";
+App::$strings["Create a status post for this upload"] = "Plaats een bericht voor deze upload.";
+App::$strings["Caption (optional):"] = "Bijschrift (optioneel):";
+App::$strings["Description (optional):"] = "Omschrijving (optioneel):";
+App::$strings["Album name could not be decoded"] = "Albumnaam kon niet gedecodeerd worden";
+App::$strings["Contact Photos"] = "Connectiefoto's";
+App::$strings["Show Newest First"] = "Nieuwste eerst weergeven";
+App::$strings["Show Oldest First"] = "Oudste eerst weergeven";
+App::$strings["View Photo"] = "Foto weergeven";
+App::$strings["Edit Album"] = "Album bewerken";
+App::$strings["Permission denied. Access to this item may be restricted."] = "Toegang geweigerd. Toegang tot dit item kan zijn beperkt.";
+App::$strings["Photo not available"] = "Foto niet aanwezig";
+App::$strings["Use as profile photo"] = "Als profielfoto gebruiken";
+App::$strings["Use as cover photo"] = "Als omslagfoto gebruiken";
+App::$strings["Private Photo"] = "Privéfoto";
+App::$strings["View Full Size"] = "Volledige grootte weergeven";
+App::$strings["Remove"] = "Verwijderen";
+App::$strings["Edit photo"] = "Foto bewerken";
+App::$strings["Rotate CW (right)"] = "Draai met de klok mee (naar rechts)";
+App::$strings["Rotate CCW (left)"] = "Draai tegen de klok in (naar links)";
+App::$strings["Enter a new album name"] = "Vul een nieuwe albumnaam in";
+App::$strings["or select an existing one (doubleclick)"] = "of kies een bestaand album (dubbelklikken)";
+App::$strings["Caption"] = "Bijschrift";
+App::$strings["Add a Tag"] = "Tag toevoegen";
+App::$strings["Example: @bob, @Barbara_Jensen, @jim@example.com"] = "Voorbeeld: @bob, @Barbara_Jansen, @jan@voorbeeld.nl";
+App::$strings["Flag as adult in album view"] = "Markeer als voor volwassenen in albumweergave";
+App::$strings["I like this (toggle)"] = "Vind ik leuk";
+App::$strings["I don't like this (toggle)"] = "Vind ik niet leuk";
+App::$strings["This is you"] = "Dit ben jij";
+App::$strings["Comment"] = "Reactie";
+App::$strings["__ctx:title__ Likes"] = "vinden dit leuk";
+App::$strings["__ctx:title__ Dislikes"] = "vinden dit niet leuk";
+App::$strings["__ctx:title__ Agree"] = "eens";
+App::$strings["__ctx:title__ Disagree"] = "oneens";
+App::$strings["__ctx:title__ Abstain"] = "onthoudingen";
+App::$strings["__ctx:title__ Attending"] = "aanwezig";
+App::$strings["__ctx:title__ Not attending"] = "niet aanwezig";
+App::$strings["__ctx:title__ Might attend"] = "mogelijk aanwezig";
+App::$strings["View all"] = "Toon alles";
+App::$strings["__ctx:noun__ Like"] = array(
+ 0 => "vindt dit leuk",
+ 1 => "vinden dit leuk",
+);
+App::$strings["__ctx:noun__ Dislike"] = array(
+ 0 => "vindt dit niet leuk",
+ 1 => "vinden dit niet leuk",
+);
+App::$strings["In This Photo:"] = "Op deze foto:";
+App::$strings["Map"] = "Kaart";
+App::$strings["__ctx:noun__ Likes"] = "vinden dit leuk";
+App::$strings["__ctx:noun__ Dislikes"] = "vinden dit niet leuk";
+App::$strings["Close"] = "Sluiten";
+App::$strings["View Album"] = "Album weergeven";
+App::$strings["Recent Photos"] = "Recente foto's";
+App::$strings["sent you a private message"] = "stuurde jou een privébericht";
+App::$strings["added your channel"] = "voegde jouw kanaal toe";
+App::$strings["g A l F d"] = "G:i, l d F";
+App::$strings["[today]"] = "[vandaag]";
+App::$strings["posted an event"] = "plaatste een gebeurtenis";
+App::$strings["Poke"] = "Aanstoten";
+App::$strings["Poke somebody"] = "Iemand aanstoten";
+App::$strings["Poke/Prod"] = "Aanstoten/porren";
+App::$strings["Poke, prod or do other things to somebody"] = "Iemand bijvoorbeeld aanstoten of poren";
+App::$strings["Recipient"] = "Ontvanger";
+App::$strings["Choose what you wish to do to recipient"] = "Kies wat je met de ontvanger wil doen";
+App::$strings["Make this post private"] = "Maak dit bericht privé";
+App::$strings["Fetching URL returns error: %1\$s"] = "Ophalen URL gaf een foutmelding terug: %1\$s";
+App::$strings["Shift-reload the page or clear browser cache if the new photo does not display immediately."] = "Vernieuw de pagina met shift+R of shift+F5, of leeg je browserbuffer, wanneer de nieuwe foto niet meteen wordt weergegeven.";
+App::$strings["Upload Profile Photo"] = "Profielfoto uploaden";
App::$strings["Profile not found."] = "Profiel niet gevonden.";
App::$strings["Profile deleted."] = "Profiel verwijderd.";
App::$strings["Profile-"] = "Profiel-";
@@ -1532,7 +974,6 @@ App::$strings["Dislikes"] = "Houdt niet van";
App::$strings["Work/Employment"] = "Werk/arbeid";
App::$strings["Religion"] = "Religie";
App::$strings["Political Views"] = "Politieke overtuigingen";
-App::$strings["Gender"] = "Geslacht";
App::$strings["Sexual Preference"] = "Seksuele voorkeur";
App::$strings["Homepage"] = "Homepage";
App::$strings["Interests"] = "Interesses";
@@ -1540,12 +981,16 @@ App::$strings["Profile updated."] = "Profiel bijgewerkt";
App::$strings["Hide your connections list from viewers of this profile"] = "Laat de lijst met connecties niet aan bezoekers van dit profiel zien.";
App::$strings["Edit Profile Details"] = "Profiel bewerken";
App::$strings["View this profile"] = "Profiel weergeven";
+App::$strings["Edit visibility"] = "Zichtbaarheid bewerken";
App::$strings["Change cover photo"] = "Omslagfoto wijzigen";
+App::$strings["Change profile photo"] = "Profielfoto veranderen";
App::$strings["Create a new profile using these settings"] = "Een nieuw profiel aanmaken met dit profiel als basis";
App::$strings["Clone this profile"] = "Dit profiel klonen";
App::$strings["Delete this profile"] = "Dit profiel verwijderen";
App::$strings["Add profile things"] = "Dingen aan je profiel toevoegen";
+App::$strings["Personal"] = "Persoonlijk";
App::$strings["Relation"] = "Relatie";
+App::$strings["Miscellaneous"] = "Diversen";
App::$strings["Import profile from file"] = "Profiel vanuit bestand importeren";
App::$strings["Export profile to file"] = "Profiel naar bestand exporteren";
App::$strings["Your gender"] = "Jouw geslacht";
@@ -1564,7 +1009,6 @@ App::$strings["Who (if applicable)"] = "Wie (wanneer van toepassing)";
App::$strings["Examples: cathy123, Cathy Williams, cathy@example.com"] = "Voorbeelden: petra123, Petra Jansen, petra@voorbeeld.nl";
App::$strings["Since (date)"] = "Sinds (datum)";
App::$strings["Tell us about yourself"] = "Vertel ons iets over jezelf";
-App::$strings["Homepage URL"] = "URL homepagina";
App::$strings["Hometown"] = "Oorspronkelijk uit";
App::$strings["Political views"] = "Politieke overtuigingen";
App::$strings["Religious views"] = "Religieuze overtuigingen";
@@ -1579,119 +1023,32 @@ App::$strings["Love/Romance"] = "Liefde/romantiek";
App::$strings["School/Education"] = "School/opleiding";
App::$strings["Contact information and social networks"] = "Contactinformatie en sociale netwerken";
App::$strings["My other channels"] = "Mijn andere kanalen";
-App::$strings["\$Projectname channel"] = "\$Projectname-kanaal";
+App::$strings["Profile Image"] = "Profielfoto";
+App::$strings["Edit Profiles"] = "Bewerk profielen";
App::$strings["Invalid profile identifier."] = "Ongeldige profiel-identificator";
App::$strings["Profile Visibility Editor"] = "Zichtbaarheid profiel ";
+App::$strings["Profile"] = "Profiel";
App::$strings["Click on a contact to add or remove."] = "Klik op een connectie om deze toe te voegen of te verwijderen";
App::$strings["Visible To"] = "Zichtbaar voor";
-App::$strings["%d rating"] = array(
- 0 => "%d beoordeling",
- 1 => "%d beoordelingen",
-);
-App::$strings["Gender: "] = "Geslacht:";
-App::$strings["Status: "] = "Status: ";
-App::$strings["Homepage: "] = "Homepage: ";
-App::$strings["Description:"] = "Omschrijving:";
-App::$strings["Public Forum:"] = "Openbaar forum:";
-App::$strings["Keywords: "] = "Trefwoorden: ";
-App::$strings["Don't suggest"] = "Niet voorstellen";
-App::$strings["Common connections:"] = "Gemeenschappelijke connecties:";
-App::$strings["Global Directory"] = "Volledige kanalengids";
-App::$strings["Local Directory"] = "Lokale kanalengids";
-App::$strings["Finding:"] = "Gezocht naar:";
-App::$strings["next page"] = "volgende pagina";
-App::$strings["previous page"] = "vorige pagina";
-App::$strings["Sort options"] = "Sorteeropties";
-App::$strings["Alphabetic"] = "Alfabetisch";
-App::$strings["Reverse Alphabetic"] = "Omgekeerd alfabetisch";
-App::$strings["Newest to Oldest"] = "Nieuw naar oud";
-App::$strings["Oldest to Newest"] = "Oud naar nieuw";
-App::$strings["No entries (some entries may be hidden)."] = "Niets gevonden (sommige kanalen kunnen verborgen zijn).";
-App::$strings["This site is not a directory server"] = "Deze hub is geen kanalengidshub (directoryserver)";
-App::$strings["This directory server requires an access token"] = "Deze kanalengidshub (directoryserver) heeft een toegangs-token nodig";
+App::$strings["Public Hubs"] = "Openbare hubs";
App::$strings["The listed hubs allow public registration for the \$Projectname network. All hubs in the network are interlinked so membership on any of them conveys membership in the network as a whole. Some hubs may require subscription or provide tiered service plans. The hub itself <strong>may</strong> provide additional details."] = "Op de hier weergegeven hubs kan iedereen zich voor het \$Projectname-netwerk aanmelden. Alle hubs in het netwerk zijn met elkaar verbonden, dus maakt het qua lidmaatschap niet uit waar je je aanmeldt. Op sommige hubs heb je eerst goedkeuring nodig en sommige hubs vereisen een financiële tegemoetkoming voor bepaalde uitbreidingen. <strong>Mogelijk</strong> wordt hierover op de hub zelf meer informatie gegeven.";
App::$strings["Hub URL"] = "Hub-URL";
App::$strings["Access Type"] = "Toegangs-<br/>&nbsp;type";
App::$strings["Registration Policy"] = "Registratie-<br/>&nbsp;beleid";
+App::$strings["Ratings"] = "Beoordelingen";
App::$strings["Rate"] = "Beoordeel";
-App::$strings["Invalid message"] = "Ongeldig bericht";
-App::$strings["no results"] = "geen resultaten";
-App::$strings["Delivery report for %1\$s"] = "Afleveringsrapport voor %1\$s";
-App::$strings["channel sync processed"] = "kanaalsync verwerkt";
-App::$strings["queued"] = "in wachtrij";
-App::$strings["posted"] = "verstuurd";
-App::$strings["accepted for delivery"] = "geaccepteerd om afgeleverd te worden";
-App::$strings["updated"] = "geüpdatet";
-App::$strings["update ignored"] = "update genegeerd";
-App::$strings["permission denied"] = "toegang geweigerd";
-App::$strings["recipient not found"] = "ontvanger niet gevonden";
-App::$strings["mail recalled"] = "Privébericht ingetrokken";
-App::$strings["duplicate mail received"] = "dubbel privébericht ontvangen";
-App::$strings["mail delivered"] = "privébericht afgeleverd";
-App::$strings["Delete block?"] = "Blok verwijderen";
-App::$strings["Edit Block"] = "Blok bewerken";
-App::$strings["You have created %1$.0f of %2$.0f allowed channels."] = "Je hebt %1$.0f van totaal %2$.0f toegestane kanalen aangemaakt.";
-App::$strings["Name or caption"] = "Naam";
-App::$strings["Examples: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \"Aviation Group\""] = "Voorbeelden: \"Jan Pietersen\", \"Willems weblog\", \"Computerforum\"";
-App::$strings["Choose a short nickname"] = "Korte bijnaam";
-App::$strings["Your nickname will be used to create an easy to remember channel address e.g. nickname%s"] = "Deze bijnaam wordt gebruikt om een makkelijk te onthouden kanaaladres van jouw kanaal aan te maken, die je dan met anderen kunt delen. Bijvoorbeeld: bijnaam%s";
-App::$strings["Channel role and privacy"] = "Kanaaltype en privacy";
-App::$strings["Select a channel role with your privacy requirements."] = "Kies een kanaaltype met het door jou gewenste privacyniveau.";
-App::$strings["Read more about roles"] = "Lees meer over kanaaltypes";
-App::$strings["Create Channel"] = "Kanaal aanmaken";
-App::$strings["A channel is your identity on this network. It can represent a person, a blog, or a forum to name a few. Channels can make connections with other channels to share information with highly detailed permissions."] = "Een kanaal is jouw identiteit in dit netwerk. Het kan bijvoorbeeld een persoon, een blog of een forum vertegenwoordigen. Door met elkaar te verbinden kunnen kanalen, met behulp van uitgebreide permissies, informatie uitwisselen.";
-App::$strings["or <a href=\"import\">import an existing channel</a> from another location."] = "Of <a href=\"import\">importeer een bestaand kanaal</a> vanaf een andere locatie";
-App::$strings["Delete layout?"] = "Lay-out verwijderen?";
-App::$strings["Layout Description (Optional)"] = "Lay-out-omschrijving (optioneel)";
-App::$strings["Layout Name"] = "Naam lay-out";
-App::$strings["Edit Layout"] = "Lay-out bewerken";
App::$strings["Website:"] = "Website:";
App::$strings["Remote Channel [%s] (not yet known on this site)"] = "Kanaal op afstand [%s] (nog niet op deze hub bekend)";
App::$strings["Rating (this information is public)"] = "Beoordeling (deze informatie is openbaar)";
App::$strings["Optionally explain your rating (this information is public)"] = "Verklaar jouw beoordeling (niet verplicht, deze informatie is openbaar)";
-App::$strings["Page Title"] = "Paginatitel";
-App::$strings["Delete webpage?"] = "Webpagina verwijderen?";
-App::$strings["Page link title"] = "Titel van paginalink";
-App::$strings["Edit Webpage"] = "Webpagina bewerken";
-App::$strings["Block Name"] = "Bloknaam";
-App::$strings["Block Title"] = "Bloktitel";
App::$strings["No ratings"] = "Geen beoordelingen";
App::$strings["Rating: "] = "Beoordeling: ";
App::$strings["Website: "] = "Website: ";
App::$strings["Description: "] = "Omschrijving: ";
-App::$strings["Calendar entries imported."] = "Agenda-items geïmporteerd.";
-App::$strings["No calendar entries found."] = "Geen agenda-items gevonden.";
-App::$strings["Event can not end before it has started."] = "Gebeurtenis kan niet eindigen voordat het is begonnen";
-App::$strings["Unable to generate preview."] = "Niet in staat om voorvertoning te genereren";
-App::$strings["Event title and start time are required."] = "Titel en begintijd van gebeurtenis zijn vereist.";
-App::$strings["Event not found."] = "Gebeurtenis niet gevonden";
-App::$strings["Edit event title"] = "Titel bewerken";
-App::$strings["Event title"] = "Titel";
-App::$strings["Categories (comma-separated list)"] = "Categorieën (door komma's gescheiden lijst)";
-App::$strings["Edit Category"] = "Categorie";
-App::$strings["Category"] = "Categorie";
-App::$strings["Edit start date and time"] = "Begindatum en -tijd bewerken";
-App::$strings["Start date and time"] = "Begindatum en -tijd";
-App::$strings["Finish date and time are not known or not relevant"] = "Einddatum en -tijd zijn niet bekend of niet van toepassing";
-App::$strings["Edit finish date and time"] = "Einddatum en -tijd bewerken";
-App::$strings["Finish date and time"] = "Einddatum en -tijd";
-App::$strings["Adjust for viewer timezone"] = "Aanpassen aan de tijdzone van wie deze gebeurtenis bekijkt";
-App::$strings["Important for events that happen in a particular place. Not practical for global holidays."] = "Belangrijk voor gebeurtenissen die op een bepaalde locatie plaatsvinden. Niet praktisch voor wereldwijde feestdagen.";
-App::$strings["Edit Description"] = "Omschrijving bewerken";
-App::$strings["Edit Location"] = "Locatie bewerken";
-App::$strings["Share this event"] = "Deel deze gebeurtenis";
-App::$strings["Advanced Options"] = "Geavanceerde opties";
-App::$strings["Edit event"] = "Gebeurtenis bewerken";
-App::$strings["Delete event"] = "Gebeurtenis verwijderen";
-App::$strings["calendar"] = "agenda";
-App::$strings["Event removed"] = "Gebeurtenis verwijderd";
-App::$strings["Failed to remove event"] = "Verwijderen gebeurtenis mislukt";
App::$strings["Select a bookmark folder"] = "Kies een bladwijzermap";
App::$strings["Save Bookmark"] = "Bladwijzer opslaan";
App::$strings["URL of bookmark"] = "URL van bladwijzer";
App::$strings["Or enter new bookmark folder name"] = "Of geef de naam op van een nieuwe bladwijzermap";
-App::$strings["Share content from Firefox to \$Projectname"] = "Deel webpagina's vanuit Firefox met ";
-App::$strings["Activate the Firefox \$Projectname provider"] = "Activeer de \$Projectname-service in Firefox";
App::$strings["Maximum daily site registrations exceeded. Please try again tomorrow."] = "Maximum toegestane dagelijkse registraties op deze \$Projectname-hub bereikt. Probeer het morgen (UTC) nogmaals.";
App::$strings["Please indicate acceptance of the Terms of Service. Registration failed."] = "Registratie mislukt. De gebruiksvoorwaarden dienen wel geaccepteerd te worden.";
App::$strings["Passwords do not match."] = "Wachtwoorden komen niet met elkaar overeen.";
@@ -1712,24 +1069,9 @@ App::$strings["Please enter your invitation code"] = "Vul jouw uitnodigingscode
App::$strings["no"] = "Nee";
App::$strings["yes"] = "Ja";
App::$strings["Membership on this site is by invitation only."] = "Registreren op deze \$Projectname-hub kan alleen op uitnodiging.";
+App::$strings["Register"] = "Registreren";
App::$strings["Proceed to create your first channel"] = "Volgende stap: aanmaken van jouw eerste kanaal";
App::$strings["Please login."] = "Inloggen.";
-App::$strings["- select -"] = "- kies map -";
-App::$strings["Invalid request identifier."] = "Ongeldige verzoek identificator (request identifier)";
-App::$strings["Discard"] = "Annuleren";
-App::$strings["No more system notifications."] = "Geen systeemnotificaties meer.";
-App::$strings["System Notifications"] = "Systeemnotificaties";
-App::$strings["Permission Denied."] = "Toegang geweigerd";
-App::$strings["File not found."] = "Bestand niet gevonden.";
-App::$strings["Edit file permissions"] = "Bestandsrechten bewerken";
-App::$strings["Set/edit permissions"] = "Rechten instellen/bewerken";
-App::$strings["Include all files and sub folders"] = "Toepassen op alle bestanden en submappen";
-App::$strings["Return to file list"] = "Terugkeren naar bestandlijst ";
-App::$strings["Copy/paste this code to attach file to a post"] = "Kopieer/plak deze code om het bestand aan een bericht te koppelen";
-App::$strings["Copy/paste this URL to link file from a web page"] = "Kopieer/plak deze URL om het bestand aan een externe webpagina te koppelen";
-App::$strings["Share this file"] = "Dit bestand delen";
-App::$strings["Show URL to this file"] = "Toon URL van dit bestand";
-App::$strings["Notify your contacts about this file"] = "Jouw connecties over dit bestand berichten";
App::$strings["Account removals are not allowed within 48 hours of changing the account password."] = "Het verwijderen van een account is niet toegestaan binnen 48 uur nadat het wachtwoord is veranderd.";
App::$strings["Remove This Account"] = "Verwijder dit account";
App::$strings["WARNING: "] = "WAARSCHUWING: ";
@@ -1739,45 +1081,24 @@ App::$strings["Please enter your password for verification:"] = "Vul je wachtwoo
App::$strings["Remove this account, all its channels and all its channel clones from the network"] = "Dit account, al zijn kanalen en alle klonen van zijn kanalen uit het \$Projectname-netwerk verwijderen";
App::$strings["By default only the instances of the channels located on this hub will be removed from the network"] = "Standaard worden alleen de kanalen die zich op deze hub bevinden uit het \$Projectname-netwerk verwijderd";
App::$strings["Remove Account"] = "Account verwijderen";
-App::$strings["Channel added."] = "Kanaal toegevoegd.";
App::$strings["Channel removals are not allowed within 48 hours of changing the account password."] = "Het verwijderen van een kanaal is niet toegestaan binnen 48 uur nadat het wachtwoord van het account is veranderd.";
App::$strings["Remove This Channel"] = "Verwijder dit kanaal";
App::$strings["This channel will be completely removed from the network. "] = "Dit kanaal wordt volledig uit het \$Projectname-netwerk verwijderd.";
App::$strings["Remove this channel and all its clones from the network"] = "Dit kanaal en alle klonen hiervan uit het \$Projectname-netwerk verwijderen";
App::$strings["By default only the instance of the channel located on this hub will be removed from the network"] = "Standaard wordt alleen het kanaal dat zich op deze hub bevindt uit het \$Projectname-netwerk verwijderd";
App::$strings["Remove Channel"] = "Kanaal verwijderen";
-App::$strings["Contact not found."] = "Contact niet gevonden";
-App::$strings["Friend suggestion sent."] = "Kanaalvoorstel verzonden.";
-App::$strings["Suggest Friends"] = "Kanalen voorstellen";
-App::$strings["Suggest a friend for %s"] = "Stel een kanaal voor aan %s";
App::$strings["We encountered a problem while logging in with the OpenID you provided. Please check the correct spelling of the ID."] = "We hebben een probleem ontdekt tijdens het inloggen met de OpenID die je hebt verstrekt. Controleer de ID op typefouten.";
App::$strings["The error message was:"] = "Het foutbericht was:";
App::$strings["Authentication failed."] = "Authenticatie mislukt.";
App::$strings["Remote Authentication"] = "Authenticatie op afstand";
App::$strings["Enter your channel address (e.g. channel@example.com)"] = "Vul jouw kanaaladres in (bijv. channel@example.com)";
App::$strings["Authenticate"] = "Authenticeren";
-App::$strings["Documentation Search"] = "Zoek documentatie";
-App::$strings["Help:"] = "Hulp:";
-App::$strings["\$Projectname Documentation"] = "\$Projectname-documentatie";
-App::$strings["Privacy group created."] = "Privacygroep aangemaakt";
-App::$strings["Could not create privacy group."] = "Kon privacygroep niet aanmaken";
-App::$strings["Privacy group updated."] = "Privacygroep bijgewerkt";
-App::$strings["Create a group of channels."] = "Privacygroep met kanalen aanmaken";
-App::$strings["Privacy group name: "] = "Naam privacygroep: ";
-App::$strings["Members are visible to other channels"] = "Kanalen in deze privacygroep zijn zichtbaar voor andere kanalen";
-App::$strings["Privacy group removed."] = "Privacygroep verwijderd.";
-App::$strings["Unable to remove privacy group."] = "Verwijderen privacygroep mislukt";
-App::$strings["Privacy group editor"] = "Privacygroep bewerken";
-App::$strings["Members"] = "Kanalen";
-App::$strings["All Connected Channels"] = "Alle kanaalconnecties";
-App::$strings["Click on a channel to add or remove."] = "Klik op een kanaal om deze toe te voegen of te verwijderen.";
App::$strings["Items tagged with: %s"] = "Items getagd met %s";
App::$strings["Search results for: %s"] = "Zoekresultaten voor %s";
-App::$strings["\$Projectname"] = "\$Projectname";
-App::$strings["Welcome to %s"] = "Welkom op %s";
App::$strings["No service class restrictions found."] = "Geen abonnementsbeperkingen gevonden.";
App::$strings["Name is required"] = "Naam is vereist";
App::$strings["Key and Secret are required"] = "Key en secret zijn vereist";
+App::$strings["Update"] = "Bijwerken";
App::$strings["Not valid email."] = "Geen geldig e-mailadres.";
App::$strings["Protected email address. Cannot change to that email."] = "Beschermd e-mailadres. Kan dat e-mailadres niet gebruiken.";
App::$strings["System failure storing new email. Please try again."] = "Systeemfout opslaan van nieuwe e-mail. Probeer het nog een keer.";
@@ -1849,6 +1170,7 @@ App::$strings["Allow us to suggest you as a potential friend to new members?"] =
App::$strings["Your channel address is"] = "Jouw kanaaladres is";
App::$strings["Channel Settings"] = "Kanaal-instellingen";
App::$strings["Basic Settings"] = "Basis-instellingen";
+App::$strings["Full Name:"] = "Volledige naam:";
App::$strings["Your Timezone:"] = "Jouw tijdzone:";
App::$strings["Default Post Location:"] = "Standaardlocatie bericht:";
App::$strings["Geographical location to display on your posts"] = "Geografische locatie die bij het bericht moet worden vermeld";
@@ -1917,21 +1239,6 @@ App::$strings["Personal menu to display in your channel pages"] = "Persoonlijk m
App::$strings["Remove this channel."] = "Verwijder dit kanaal.";
App::$strings["Firefox Share \$Projectname provider"] = "\$Projectname-service voor Firefox Share";
App::$strings["Start calendar week on monday"] = "Begin in de agenda de week op maandag";
-App::$strings["First Name"] = "Voornaam";
-App::$strings["Last Name"] = "Achternaam";
-App::$strings["Nickname"] = "Bijnaam";
-App::$strings["Full Name"] = "Volledige naam";
-App::$strings["Profile Photo 16px"] = "Profielfoto 16px";
-App::$strings["Profile Photo 32px"] = "Profielfoto 32px";
-App::$strings["Profile Photo 48px"] = "Profielfoto 48px";
-App::$strings["Profile Photo 64px"] = "Profielfoto 64px";
-App::$strings["Profile Photo 80px"] = "Profielfoto 80px";
-App::$strings["Profile Photo 128px"] = "Profielfoto 128px";
-App::$strings["Timezone"] = "Tijdzone";
-App::$strings["Birth Year"] = "Geboortejaar";
-App::$strings["Birth Month"] = "Geboortemaand";
-App::$strings["Birth Day"] = "Geboortedag";
-App::$strings["Birthdate"] = "Geboortedatum";
App::$strings["\$Projectname Server - Setup"] = "\$Projectname Hub - Setup";
App::$strings["Could not connect to database."] = "Could not connect to database.";
App::$strings["Could not connect to specified site URL. Possible SSL certificate or DNS issue."] = "Could not connect to specified hub URL. Possible SSL certificate or DNS issue.";
@@ -2018,52 +1325,10 @@ App::$strings["The database configuration file \".htconfig.php\" could not be wr
App::$strings["Errors encountered creating database tables."] = "Errors encountered creating database tables.";
App::$strings["<h1>What next</h1>"] = "<h1>What next</h1>";
App::$strings["IMPORTANT: You will need to [manually] setup a scheduled task for the poller."] = "IMPORTANT: You will need to [manually] setup a scheduled task for the poller.";
-App::$strings["%s element installed"] = "%s onderdeel geïnstalleerd";
-App::$strings["%s element installation failed"] = "Installatie %s-element mislukt";
-App::$strings["Your service plan only allows %d channels."] = "Jouw abonnement staat maar %d kanalen toe.";
-App::$strings["Nothing to import."] = "Niets gevonden om te importeren";
-App::$strings["Unable to download data from old server"] = "Niet in staat om gegevens van de oude hub te downloaden";
-App::$strings["Imported file is empty."] = "Geïmporteerde bestand is leeg";
-App::$strings["Warning: Database versions differ by %1\$d updates."] = "Waarschuwing: database-versies lopen %1\$d updates achter.";
-App::$strings["No channel. Import failed."] = "Geen kanaal. Importeren mislukt.";
-App::$strings["You must be logged in to use this feature."] = "Je moet ingelogd zijn om dit onderdeel te kunnen gebruiken.";
-App::$strings["Import Channel"] = "Kanaal importeren";
-App::$strings["Use this form to import an existing channel from a different server/hub. You may retrieve the channel identity from the old server/hub via the network or provide an export file."] = "Gebruik dit formulier om een bestaand kanaal te importeren van een andere hub. Je kan de kanaal-identiteit van de oude hub via het netwerk ontvangen of een exportbestand verstrekken.";
-App::$strings["File to Upload"] = "Bestand om te uploaden";
-App::$strings["Or provide the old server/hub details"] = "Of vul de gegevens van de oude hub in";
-App::$strings["Your old identity address (xyz@example.com)"] = "Jouw oude kanaaladres (xyz@example.com)";
-App::$strings["Your old login email address"] = "Het e-mailadres van je oude account";
-App::$strings["Your old login password"] = "Wachtwoord van jouw oude account";
-App::$strings["For either option, please choose whether to make this hub your new primary address, or whether your old location should continue this role. You will be able to post from either location, but only one can be marked as the primary location for files, photos, and media."] = "Voor elke optie geldt dat je moet kiezen of je jouw primaire kanaaladres op deze hub wil instellen of dat jouw oude hub deze rol blijft vervullen.";
-App::$strings["Make this hub my primary location"] = "Stel deze hub als mijn primaire locatie in";
-App::$strings["Import existing posts if possible (experimental - limited by available memory"] = "Importeer bestaande berichten wanneer mogelijk (experimenteel - afhankelijk van beschikbaar servergeheugen)";
-App::$strings["This process may take several minutes to complete. Please submit the form only once and leave this page open until finished."] = "Dit proces kan enkele minuten in beslag nemen. Klik maar één keer op opslaan en verlaat deze pagina niet alvorens het proces is voltooid.";
-App::$strings["Import completed"] = "Importeren voltooid";
-App::$strings["Import Items"] = "Importeer items";
-App::$strings["Use this form to import existing posts and content from an export file."] = "Gebruik dit formulier om bestaande berichten en andere inhoud vanuit een exportbestand te importeren.";
App::$strings["Files: shared with me"] = "Bestanden: met mij gedeeld";
App::$strings["NEW"] = "NIEUW";
App::$strings["Remove all files"] = "Verwijder alle bestanden";
App::$strings["Remove this file"] = "Verwijder dit bestand";
-App::$strings["Total invitation limit exceeded."] = "Limiet voor aantal uitnodigingen overschreden.";
-App::$strings["%s : Not a valid email address."] = "%s : Geen geldig e-mailadres.";
-App::$strings["Please join us on \$Projectname"] = "Uitnodiging voor \$Projectname";
-App::$strings["Invitation limit exceeded. Please contact your site administrator."] = "Limiet voor aantal uitnodigingen overschreden. Neem contact op met je hub-beheerder.";
-App::$strings["%s : Message delivery failed."] = "%s: Aflevering bericht mislukt.";
-App::$strings["%d message sent."] = array(
- 0 => "%d bericht verzonden.",
- 1 => "%d berichten verzonden.",
-);
-App::$strings["You have no more invitations available"] = "Je hebt geen uitnodigingen meer beschikbaar";
-App::$strings["Send invitations"] = "Uitnodigingen verzenden";
-App::$strings["Enter email addresses, one per line:"] = "Voer e-mailadressen in, één per regel:";
-App::$strings["Your message:"] = "Jouw bericht:";
-App::$strings["Please join my community on \$Projectname."] = "Hierbij nodig ik je uit om mij, en andere vrienden en kennissen, op \$Projectname te vergezellen. Lees meer over \$Projectname op http://hubzilla.org";
-App::$strings["You will need to supply this invitation code:"] = "Je moet deze uitnodigingscode opgeven:";
-App::$strings["1. Register at any \$Projectname location (they are all inter-connected)"] = "1. Registreer je op een willekeurige \$Projectname-hub (ze zijn allemaal onderling met elkaar verbonden):";
-App::$strings["2. Enter my \$Projectname network address into the site searchbar."] = "2. Nadat je bent ingelogd en een kanaal hebt aangemaakt kan je mijn \$Projectname-kanaaladres in het zoekveld invullen:";
-App::$strings["or visit"] = "of bezoek";
-App::$strings["3. Click [Connect]"] = "3. Klik op [+ Verbinden]";
App::$strings["Version %s"] = "Versie %s";
App::$strings["Installed plugins/addons/apps:"] = "Ingeschakelde plugins en apps:";
App::$strings["No installed plugins/addons/apps"] = "Geen ingeschakelde plugins en apps";
@@ -2077,48 +1342,11 @@ App::$strings["Bug reports and issues: please visit"] = "Bugrapporten en andere
App::$strings["\$projectname issues"] = "\$projectname-issues";
App::$strings["Suggestions, praise, etc. - please email \"redmatrix\" at librelist - dot com"] = "Voorstellen, lofbetuigingen, enz. - e-mail \"redmatrix\" at librelist - dot com";
App::$strings["Site Administrators"] = "Hubbeheerders: ";
-App::$strings["Unable to locate original post."] = "Niet in staat om de originele locatie van het bericht te vinden. ";
-App::$strings["Empty post discarded."] = "Leeg bericht geannuleerd";
-App::$strings["Executable content type not permitted to this channel."] = "Uitvoerbare bestanden zijn niet toegestaan op dit kanaal.";
-App::$strings["Duplicate post suppressed."] = "Dubbel bericht tegengehouden.";
-App::$strings["System error. Post not saved."] = "Systeemfout. Bericht niet opgeslagen.";
-App::$strings["Unable to obtain post information from database."] = "Niet in staat om informatie over dit bericht uit de database te verkrijgen.";
-App::$strings["You have reached your limit of %1$.0f top level posts."] = "Je hebt jouw limiet van %1$.0f berichten bereikt.";
-App::$strings["You have reached your limit of %1$.0f webpages."] = "Je hebt jouw limiet van %1$.0f webpagina's bereikt.";
-App::$strings["Comanche page description language help"] = "Hulp met de paginabeschrijvingstaal Comanche";
-App::$strings["Layout Description"] = "Lay-out-omschrijving";
-App::$strings["Download PDL file"] = "Download PDL-bestand";
-App::$strings["Like/Dislike"] = "Leuk/niet leuk";
-App::$strings["This action is restricted to members."] = "Deze actie kan alleen door \$Projectname-leden worden uitgevoerd.";
-App::$strings["Please <a href=\"rmagic\">login with your \$Projectname ID</a> or <a href=\"register\">register as a new \$Projectname member</a> to continue."] = "Je dient <a href=\"rmagic\">in te loggen met je \$Projectname-account</a> of <a href=\"register\">een nieuw \$Projectname-account aan te maken</a> om verder te kunnen gaan.";
-App::$strings["Invalid request."] = "Ongeldig verzoek";
-App::$strings["thing"] = "ding";
-App::$strings["Channel unavailable."] = "Kanaal niet beschikbaar.";
-App::$strings["Previous action reversed."] = "Vorige actie omgedraaid";
-App::$strings["%1\$s agrees with %2\$s's %3\$s"] = "%1\$s is het eens met %2\$s's %3\$s";
-App::$strings["%1\$s doesn't agree with %2\$s's %3\$s"] = "%1\$s is het niet eens met %2\$s's %3\$s";
-App::$strings["%1\$s abstains from a decision on %2\$s's %3\$s"] = "%1\$s onthoudt zich van een besluit over %2\$s's %3\$s";
-App::$strings["%1\$s is attending %2\$s's %3\$s"] = "%1\$s is aanwezig op %2\$s's %3\$s";
-App::$strings["%1\$s is not attending %2\$s's %3\$s"] = "%1\$s is niet aanwezig op %2\$s's %3\$s";
-App::$strings["%1\$s may attend %2\$s's %3\$s"] = "%1\$s is mogelijk aanwezig op %2\$s's %3\$s";
-App::$strings["Action completed."] = "Actie voltooid";
-App::$strings["Thank you."] = "Bedankt";
-App::$strings["Location not found."] = "Locatie niet gevonden.";
-App::$strings["Location lookup failed."] = "Opzoeken locatie mislukt";
-App::$strings["Please select another location to become primary before removing the primary location."] = "Kies eerst een andere primaire locatie alvorens de huidige primaire locatie te verwijderen.";
-App::$strings["Syncing locations"] = "Locaties synchronizeren";
-App::$strings["No locations found."] = "Geen locaties gevonden.";
-App::$strings["Manage Channel Locations"] = "Kanaallocaties beheren";
-App::$strings["Primary"] = "Primair";
-App::$strings["Drop"] = "Verwijderen";
-App::$strings["Sync Now"] = "Nu synchroniseren";
-App::$strings["Please wait several minutes between consecutive operations."] = "Wacht enkele minuten tussen opeenvolgende handelingen.";
-App::$strings["When possible, drop a location by logging into that website/hub and removing your channel."] = "Wij adviseren, wanneer dit (nog) mogelijk is, de locatie te verwijderen door op de hub van de kloon in te loggen en het kanaal daar te verwijderen.";
-App::$strings["Use this form to drop the location if the hub is no longer operating."] = "Gebruik dit formulier om de locatie te verwijderen wanneer de hub van de kloon niet meer operationeel is.";
App::$strings["Failed to create source. No channel selected."] = "Aanmaken bron mislukt. Geen kanaal geselecteerd.";
App::$strings["Source created."] = "Bron aangemaakt.";
App::$strings["Source updated."] = "Bron aangemaakt.";
App::$strings["*"] = "*";
+App::$strings["Channel Sources"] = "Kanaalbronnen";
App::$strings["Manage remote sources of content for your channel."] = "Beheer externe bronnen met inhoud voor jouw kanaal";
App::$strings["New Source"] = "Nieuwe bron";
App::$strings["Import all or selected content from the following channel into this channel and distribute it according to your channel settings."] = "Importeer complete of gedeelde inhoud vanuit het volgende kanaal naar dit kanaal, en verdeel het vervolgens volgens jouw kanaalinstellingen.";
@@ -2130,83 +1358,16 @@ App::$strings["Edit Source"] = "Bron bewerken";
App::$strings["Delete Source"] = "Bron verwijderen";
App::$strings["Source removed"] = "Bron verwijderd";
App::$strings["Unable to remove source."] = "Verwijderen bron mislukt.";
-App::$strings["No valid account found."] = "Geen geldige account gevonden.";
-App::$strings["Password reset request issued. Check your email."] = "Het verzoek om je wachtwoord opnieuw in te stellen is behandeld. Controleer je e-mail.";
-App::$strings["Site Member (%s)"] = "Lid van hub (%s)";
-App::$strings["Password reset requested at %s"] = "Verzoek tot het opnieuw instellen van een wachtwoord op %s is ingediend";
-App::$strings["Request could not be verified. (You may have previously submitted it.) Password reset failed."] = "Het verzoek kon niet worden geverifieerd. (Mogelijk heb je al eerder een verzoek ingediend.) Opnieuw instellen van wachtwoord is mislukt.";
-App::$strings["Password Reset"] = "Wachtwoord vergeten?";
-App::$strings["Your password has been reset as requested."] = "Jouw wachtwoord is opnieuw ingesteld zoals je had verzocht.";
-App::$strings["Your new password is"] = "Jouw nieuwe wachtwoord is";
-App::$strings["Save or copy your new password - and then"] = "Kopieer of sla je nieuwe wachtwoord op - en";
-App::$strings["click here to login"] = "klik dan hier om in te loggen";
-App::$strings["Your password may be changed from the <em>Settings</em> page after successful login."] = "Jouw wachtwoord kan worden veranderd onder <em>instellingen</em>, nadat je succesvol bent ingelogd.";
-App::$strings["Your password has changed at %s"] = "Jouw wachtwoord op %s is veranderd";
-App::$strings["Forgot your Password?"] = "Wachtwoord vergeten?";
-App::$strings["Enter your email address and submit to have your password reset. Then check your email for further instructions."] = "Voer je e-mailadres in en verstuur deze om je wachtwoord opnieuw in te stellen. Controleer hierna hier je e-mail voor verdere instructies.";
-App::$strings["Email Address"] = "E-mailadres";
-App::$strings["Reset"] = "Opnieuw instellen";
-App::$strings["Hub not found."] = "Hub niet gevonden.";
App::$strings["%1\$s is following %2\$s's %3\$s"] = "%1\$s volgt het %3\$s van %2\$s";
App::$strings["%1\$s stopped following %2\$s's %3\$s"] = "%1\$s volgt het %3\$s van %2\$s niet meer";
-App::$strings["Unable to lookup recipient."] = "Niet in staat om ontvanger op te zoeken.";
-App::$strings["Unable to communicate with requested channel."] = "Niet in staat om met het aangevraagde kanaal te communiceren.";
-App::$strings["Cannot verify requested channel."] = "Kan opgevraagd kanaal niet verifieren";
-App::$strings["Selected channel has private message restrictions. Send failed."] = "Gekozen kanaal heeft restricties voor privéberichten. Verzenden mislukt.";
-App::$strings["Messages"] = "Berichten";
-App::$strings["Message recalled."] = "Bericht ingetrokken.";
-App::$strings["Conversation removed."] = "Conversatie verwijderd";
-App::$strings["Requested channel is not in this network"] = "Opgevraagd kanaal is niet in dit netwerk beschikbaar";
-App::$strings["Send Private Message"] = "Privébericht versturen";
-App::$strings["To:"] = "Aan:";
-App::$strings["Subject:"] = "Onderwerp:";
-App::$strings["Send"] = "Verzenden";
-App::$strings["Delete message"] = "Bericht verwijderen";
-App::$strings["Delivery report"] = "Afleveringsrapport";
-App::$strings["Recall message"] = "Bericht intrekken";
-App::$strings["Message has been recalled."] = "Bericht is ingetrokken.";
-App::$strings["Delete Conversation"] = "Verwijder conversatie";
-App::$strings["No secure communications available. You <strong>may</strong> be able to respond from the sender's profile page."] = "Geen veilige communicatie beschikbaar. <strong>Mogelijk</strong> kan je reageren op de kanaalpagina van de afzender.";
-App::$strings["Send Reply"] = "Antwoord versturen";
-App::$strings["Your message for %s (%s):"] = "Jouw privébericht aan %s (%s):";
App::$strings["No suggestions available. If this is a new site, please try again in 24 hours."] = "Geen voorgestelde kanalen gevonden. Wanneer dit een nieuwe hub is, probeer het dan over 24 uur weer.";
-App::$strings["Create a new channel"] = "Nieuw kanaal aanmaken";
-App::$strings["Current Channel"] = "Huidig kanaal";
-App::$strings["Switch to one of your channels by selecting it."] = "Activeer een van jouw andere kanalen door er op te klikken.";
-App::$strings["Default Channel"] = "Standaardkanaal";
-App::$strings["Make Default"] = "Als standaard instellen";
-App::$strings["%d new messages"] = "%d nieuwe berichten";
-App::$strings["%d new introductions"] = "%d nieuwe connectieverzoeken";
-App::$strings["Delegated Channel"] = "Uitbesteed kanaal";
+App::$strings["Ignore/Hide"] = "Negeren/Verbergen";
+App::$strings["post"] = "bericht";
+App::$strings["comment"] = "reactie";
App::$strings["%1\$s tagged %2\$s's %3\$s with %4\$s"] = "%1\$s heeft het %3\$s van %2\$s getagd met %4\$s";
-App::$strings["Profile Match"] = "Profielovereenkomst";
-App::$strings["No keywords to match. Please add keywords to your default profile."] = "Je hebt geen trefwoorden waarmee overeenkomsten gevonden kunnen worden. Voeg enkele trefwoorden aan je standaardprofiel toe.";
-App::$strings["is interested in:"] = "is geïnteresseerd in:";
-App::$strings["No matches"] = "Geen overeenkomsten";
App::$strings["Tag removed"] = "Tag verwijderd";
App::$strings["Remove Item Tag"] = "Verwijder item-tag";
App::$strings["Select a tag to remove: "] = "Kies een tag om te verwijderen";
-App::$strings["Unable to update menu."] = "Niet in staat om menu aan te passen";
-App::$strings["Unable to create menu."] = "Niet in staat om menu aan te maken.";
-App::$strings["Menu Name"] = "Menunaam";
-App::$strings["Unique name (not visible on webpage) - required"] = "Unieke naam vereist (niet zichtbaar op webpagina)";
-App::$strings["Menu Title"] = "Menutitel";
-App::$strings["Visible on webpage - leave empty for no title"] = "Zichtbaar op webpagina (leeg laten voor geen titel)";
-App::$strings["Allow Bookmarks"] = "Bladwijzers toestaan";
-App::$strings["Menu may be used to store saved bookmarks"] = "Menu kan gebruikt worden om bladwijzers in op te slaan";
-App::$strings["Submit and proceed"] = "Opslaan en doorgaan";
-App::$strings["Bookmarks allowed"] = "Bladwijzers toegestaan";
-App::$strings["Delete this menu"] = "Menu verwijderen";
-App::$strings["Edit menu contents"] = "Bewerk de inhoud van het menu";
-App::$strings["Edit this menu"] = "Dit menu bewerken";
-App::$strings["Menu could not be deleted."] = "Menu kon niet verwijderd worden.";
-App::$strings["Edit Menu"] = "Menu bewerken";
-App::$strings["Add or remove entries to this menu"] = "Items aan dit menu toevoegen of verwijder";
-App::$strings["Menu name"] = "Naam van menu";
-App::$strings["Must be unique, only seen by you"] = "Moet uniek zijn en is alleen zichtbaar voor jou.";
-App::$strings["Menu title"] = "Titel van menu";
-App::$strings["Menu title as seen by others"] = "Titel van menu zoals anderen dat zien.";
-App::$strings["Allow bookmarks"] = "Bladwijzers toestaan";
App::$strings["Thing updated"] = "Ding bijgewerkt";
App::$strings["Object store: failed"] = "Opslaan van ding mislukt";
App::$strings["Thing added"] = "Ding toegevoegd";
@@ -2234,8 +1395,849 @@ App::$strings["No connections."] = "Geen connecties.";
App::$strings["Visit %s's profile [%s]"] = "Bezoek het profiel van %s [%s]";
App::$strings["View Connections"] = "Connecties weergeven";
App::$strings["Source of Item"] = "Bron van item";
+App::$strings["Webpages"] = "Webpagina's";
+App::$strings["Actions"] = "Acties";
+App::$strings["Page Link"] = "Paginalink";
+App::$strings["Page Title"] = "Paginatitel";
App::$strings["Xchan Lookup"] = "Xchan opzoeken";
App::$strings["Lookup xchan beginning with (or webbie): "] = "Zoek een xchan (of webbie) die begint met:";
+App::$strings["No username found in import file."] = "Geen gebruikersnaam in het importbestand gevonden.";
+App::$strings["Unable to create a unique channel address. Import failed."] = "Niet in staat om een uniek kanaaladres aan te maken. Importeren is mislukt.";
+App::$strings["Cannot locate DNS info for database server '%s'"] = "Kan DNS-informatie voor databaseserver '%s' niet vinden";
+App::$strings["Unable to obtain identity information from database"] = "Niet in staat om identiteitsinformatie uit de database te verkrijgen";
+App::$strings["Empty name"] = "Ontbrekende naam";
+App::$strings["Name too long"] = "Naam te lang";
+App::$strings["No account identifier"] = "Geen account-identificator";
+App::$strings["Nickname is required."] = "Bijnaam is verplicht";
+App::$strings["Reserved nickname. Please choose another."] = "Deze naam is gereserveerd. Kies een andere.";
+App::$strings["Nickname has unsupported characters or is already being used on this site."] = "Deze naam heeft niet ondersteunde karakters of is al op deze hub in gebruik.";
+App::$strings["Unable to retrieve created identity"] = "Niet in staat om aangemaakte identiteit te vinden";
+App::$strings["Default Profile"] = "Standaardprofiel";
+App::$strings["Requested channel is not available."] = "Opgevraagd kanaal is niet beschikbaar.";
+App::$strings["Create New Profile"] = "Nieuw profiel aanmaken";
+App::$strings["Edit Profile"] = "Profiel bewerken";
+App::$strings["Visible to everybody"] = "Voor iedereen zichtbaar";
+App::$strings["Gender:"] = "Geslacht:";
+App::$strings["Status:"] = "Status:";
+App::$strings["Homepage:"] = "Homepagina:";
+App::$strings["Online Now"] = "Nu online";
+App::$strings["F d"] = "d F";
+App::$strings["Birthday Reminders"] = "Verjaardagsherinneringen";
+App::$strings["Birthdays this week:"] = "Verjaardagen deze week:";
+App::$strings["[No description]"] = "[Geen omschrijving]";
+App::$strings["Event Reminders"] = "Herinneringen";
+App::$strings["Events this week:"] = "Gebeurtenissen deze week:";
+App::$strings["Like this channel"] = "Vind dit kanaal leuk";
+App::$strings["j F, Y"] = "F j Y";
+App::$strings["j F"] = "F j";
+App::$strings["Birthday:"] = "Geboortedatum:";
+App::$strings["for %1\$d %2\$s"] = "voor %1\$d %2\$s";
+App::$strings["Sexual Preference:"] = "Seksuele voorkeur:";
+App::$strings["Tags:"] = "Tags:";
+App::$strings["Political Views:"] = "Politieke overtuigingen:";
+App::$strings["Religion:"] = "Religie:";
+App::$strings["Hobbies/Interests:"] = "Hobby's/interesses:";
+App::$strings["Likes:"] = "Houdt van:";
+App::$strings["Dislikes:"] = "Houdt niet van:";
+App::$strings["Contact information and Social Networks:"] = "Contactinformatie en sociale netwerken:";
+App::$strings["My other channels:"] = "Mijn andere kanalen";
+App::$strings["Musical interests:"] = "Muzikale interesses:";
+App::$strings["Books, literature:"] = "Boeken, literatuur:";
+App::$strings["Television:"] = "Televisie:";
+App::$strings["Film/dance/culture/entertainment:"] = "Films/dansen/cultuur/vermaak:";
+App::$strings["Love/Romance:"] = "Liefde/romantiek:";
+App::$strings["Work/employment:"] = "Werk/beroep:";
+App::$strings["School/education:"] = "School/opleiding:";
+App::$strings["Like this thing"] = "Vind dit ding leuk";
+App::$strings["created a new post"] = "maakte een nieuw bericht aan";
+App::$strings["commented on %s's post"] = "gaf een reactie op een bericht van %s";
+App::$strings["Private Message"] = "Niet voor iedereen zichtbaar";
+App::$strings["Select"] = "Kies";
+App::$strings["Save to Folder"] = "In map opslaan";
+App::$strings["I will attend"] = "Aanwezig";
+App::$strings["I will not attend"] = "Niet aanwezig";
+App::$strings["I might attend"] = "Mogelijk aanwezig";
+App::$strings["I agree"] = "Eens";
+App::$strings["I disagree"] = "Oneens";
+App::$strings["I abstain"] = "Onthouding";
+App::$strings["Add Star"] = "Ster toevoegen";
+App::$strings["Remove Star"] = "Ster verwijderen";
+App::$strings["Toggle Star Status"] = "Ster toevoegen of verwijderen";
+App::$strings["starred"] = "met ster";
+App::$strings["Message signature validated"] = "Berichtkenmerk gevalideerd";
+App::$strings["Message signature incorrect"] = "Berichtkenmerk onjuist";
+App::$strings["Add Tag"] = "Tag toevoegen";
+App::$strings["like"] = "vind dit leuk";
+App::$strings["dislike"] = "vind dit niet leuk";
+App::$strings["Share This"] = "Delen";
+App::$strings["share"] = "delen";
+App::$strings["Delivery Report"] = "Afleveringsrapport";
+App::$strings["%d comment"] = array(
+ 0 => "%d reactie",
+ 1 => "%d reacties weergeven",
+);
+App::$strings["View %s's profile - %s"] = "Profiel van %s bekijken - %s";
+App::$strings["to"] = "aan";
+App::$strings["via"] = "via";
+App::$strings["Wall-to-Wall"] = "Kanaal-naar-kanaal";
+App::$strings["via Wall-To-Wall:"] = "via kanaal-naar-kanaal";
+App::$strings["from %s"] = "van %s";
+App::$strings["last edited: %s"] = "laatst bewerkt: %s";
+App::$strings["Expires: %s"] = "Verloopt: %s";
+App::$strings["Save Bookmarks"] = "Bladwijzers opslaan";
+App::$strings["Add to Calendar"] = "Aan agenda toevoegen";
+App::$strings["Mark all seen"] = "Markeer alles als bekeken";
+App::$strings["[+] show all"] = "[+] alle";
+App::$strings["Image"] = "Afbeelding";
+App::$strings["Insert Link"] = "Link invoegen";
+App::$strings["Video"] = "Video";
+App::$strings["Not a valid email address"] = "Geen geldig e-mailadres";
+App::$strings["Your email domain is not among those allowed on this site"] = "Jouw e-maildomein is op deze hub niet toegestaan";
+App::$strings["Your email address is already registered at this site."] = "Jouw e-mailadres is al op deze hub geregistreerd.";
+App::$strings["An invitation is required."] = "Een uitnodiging is vereist";
+App::$strings["Invitation could not be verified."] = "Uitnodiging kon niet geverifieerd worden";
+App::$strings["Please enter the required information."] = "Vul de vereiste informatie in.";
+App::$strings["Failed to store account information."] = "Account-informatie kon niet opgeslagen worden.";
+App::$strings["Registration confirmation for %s"] = "Registratiebevestiging voor %s";
+App::$strings["Registration request at %s"] = "Registratiebevestiging voor %s";
+App::$strings["Administrator"] = "Beheerder";
+App::$strings["your registration password"] = "jouw registratiewachtwoord";
+App::$strings["Registration details for %s"] = "Registratiegegevens voor %s";
+App::$strings["Account approved."] = "Account goedgekeurd";
+App::$strings["Registration revoked for %s"] = "Registratie ingetrokken voor %s";
+App::$strings["Account verified. Please login."] = "Account is geverifieerd. Je kan inloggen.";
+App::$strings["Click here to upgrade."] = "Klik hier om te upgraden.";
+App::$strings["This action exceeds the limits set by your subscription plan."] = "Deze handeling overschrijdt de beperkingen die voor jouw abonnement gelden.";
+App::$strings["This action is not available under your subscription plan."] = "Deze handeling is niet mogelijk met jouw abonnement.";
+App::$strings["Currently Male"] = "Momenteel man";
+App::$strings["Currently Female"] = "Momenteel vrouw";
+App::$strings["Mostly Male"] = "Voornamelijk man";
+App::$strings["Mostly Female"] = "Voornamelijk vrouw";
+App::$strings["Transgender"] = "Transgender";
+App::$strings["Intersex"] = "Interseksueel";
+App::$strings["Transsexual"] = "Transseksueel";
+App::$strings["Hermaphrodite"] = "Hermafrodiet";
+App::$strings["Neuter"] = "Genderneutraal";
+App::$strings["Non-specific"] = "Niet gespecificeerd";
+App::$strings["Other"] = "Anders";
+App::$strings["Undecided"] = "Nog niet beslist";
+App::$strings["Males"] = "Mannen";
+App::$strings["Females"] = "Vrouwen";
+App::$strings["Gay"] = "Homoseksueel";
+App::$strings["Lesbian"] = "Lesbisch";
+App::$strings["No Preference"] = "Geen voorkeur";
+App::$strings["Bisexual"] = "Biseksueel";
+App::$strings["Autosexual"] = "Autoseksueel";
+App::$strings["Abstinent"] = "Seksuele onthouding";
+App::$strings["Virgin"] = "Maagd";
+App::$strings["Deviant"] = "Afwijkend";
+App::$strings["Fetish"] = "Fetisj";
+App::$strings["Oodles"] = "Veel";
+App::$strings["Nonsexual"] = "Aseksueel";
+App::$strings["Single"] = "Alleen";
+App::$strings["Lonely"] = "Eenzaam";
+App::$strings["Available"] = "Beschikbaar";
+App::$strings["Unavailable"] = "Niet beschikbaar";
+App::$strings["Has crush"] = "Heeft een oogje op iemand";
+App::$strings["Infatuated"] = "Smoorverliefd";
+App::$strings["Dating"] = "Aan het daten";
+App::$strings["Unfaithful"] = "Ontrouw";
+App::$strings["Sex Addict"] = "Seksverslaafd";
+App::$strings["Friends/Benefits"] = "Vriendschap plus";
+App::$strings["Casual"] = "Ongebonden/vluchtig";
+App::$strings["Engaged"] = "Verloofd";
+App::$strings["Married"] = "Getrouwd";
+App::$strings["Imaginarily married"] = "Denkbeeldig getrouwd";
+App::$strings["Partners"] = "Partners";
+App::$strings["Cohabiting"] = "Samenwonend";
+App::$strings["Common law"] = "Common-law-huwelijk";
+App::$strings["Happy"] = "Gelukkig";
+App::$strings["Not looking"] = "Niet op zoek";
+App::$strings["Swinger"] = "Swinger";
+App::$strings["Betrayed"] = "Verraden";
+App::$strings["Separated"] = "Uit elkaar";
+App::$strings["Unstable"] = "Onstabiel";
+App::$strings["Divorced"] = "Gescheiden";
+App::$strings["Imaginarily divorced"] = "Denkbeeldig gescheiden";
+App::$strings["Widowed"] = "Weduwnaar/weduwe";
+App::$strings["Uncertain"] = "Onzeker";
+App::$strings["It's complicated"] = "Het is ingewikkeld";
+App::$strings["Don't care"] = "Maakt mij niks uit";
+App::$strings["Ask me"] = "Vraag het me";
+App::$strings["Visible to your default audience"] = "Voor iedereen zichtbaar, mits niet anders ingesteld";
+App::$strings["Show"] = "Tonen";
+App::$strings["Don't show"] = "Niet tonen";
+App::$strings["Other networks and post services"] = "Andere netwerken en diensten";
+App::$strings[" and "] = " en ";
+App::$strings["public profile"] = "openbaar profiel";
+App::$strings["%1\$s changed %2\$s to &ldquo;%3\$s&rdquo;"] = "%1\$s veranderde %2\$s naar &ldquo;%3\$s&rdquo;";
+App::$strings["Visit %1\$s's %2\$s"] = "Bezoek het %2\$s van %1\$s";
+App::$strings["%1\$s has an updated %2\$s, changing %3\$s."] = "%1\$s heeft een aangepaste %2\$s, %3\$s veranderd.";
+App::$strings["Public Timeline"] = "Openbare tijdlijn";
+App::$strings["Site Admin"] = "Hubbeheerder";
+App::$strings["Bookmarks"] = "Bladwijzers";
+App::$strings["Address Book"] = "Connecties";
+App::$strings["Login"] = "Inloggen";
+App::$strings["Grid"] = "Grid";
+App::$strings["Channel Home"] = "Jouw kanaal";
+App::$strings["Events"] = "Agenda";
+App::$strings["Directory"] = "Kanalengids";
+App::$strings["Mail"] = "Privéberichten";
+App::$strings["Chat"] = "Chatten";
+App::$strings["Probe"] = "Onderzoeken";
+App::$strings["Suggest"] = "Voorstellen";
+App::$strings["Random Channel"] = "Willekeurig kanaal";
+App::$strings["Invite"] = "Uitnodigen ";
+App::$strings["Features"] = "Extra functies";
+App::$strings["Post"] = "Bericht";
+App::$strings["Install"] = "Installeren";
+App::$strings["Purchase"] = "Aanschaffen";
+App::$strings["view full size"] = "volledige grootte tonen";
+App::$strings["\$Projectname Notification"] = "\$Projectname-notificatie";
+App::$strings["\$projectname"] = "\$projectname";
+App::$strings["Thank You,"] = "Bedankt,";
+App::$strings["%s Administrator"] = "Beheerder %s";
+App::$strings["No Subject"] = "Geen onderwerp";
+App::$strings["Attachments:"] = "Bijlagen:";
+App::$strings["l F d, Y \\@ g:i A"] = "l d F Y \\@ G:i";
+App::$strings["\$Projectname event notification:"] = "Notificatie \$Projectname-gebeurtenis:";
+App::$strings["Starts:"] = "Start:";
+App::$strings["Finishes:"] = "Einde:";
+App::$strings["Image/photo"] = "Afbeelding/foto";
+App::$strings["Encrypted content"] = "Versleutelde inhoud";
+App::$strings["Install %s element: "] = "Installeer %s-element: ";
+App::$strings["This post contains an installable %s element, however you lack permissions to install it on this site."] = "Dit bericht heeft een te installeren %s-element, maar je hebt geen permissies om het op deze hub te installeren.";
+App::$strings["%1\$s wrote the following %2\$s %3\$s"] = "%1\$s schreef het volgende %2\$s %3\$s";
+App::$strings["Different viewers will see this text differently"] = "Deze tekst wordt per persoon anders weergeven.";
+App::$strings["$1 spoiler"] = "$1 spoiler";
+App::$strings["$1 wrote:"] = "$1 schreef:";
+App::$strings["%1\$s is now connected with %2\$s"] = "%1\$s is nu met %2\$s verbonden";
+App::$strings["%1\$s poked %2\$s"] = "%1\$s heeft %2\$s aangestoten";
+App::$strings["poked"] = "aangestoten";
+App::$strings["View %s's profile @ %s"] = "Bekijk het profiel van %s @ %s";
+App::$strings["Categories:"] = "Categorieën:";
+App::$strings["Filed under:"] = "Bewaard onder:";
+App::$strings["View in context"] = "In context bekijken";
+App::$strings["remove"] = "verwijderen";
+App::$strings["Loading..."] = "Aan het laden...";
+App::$strings["Delete Selected Items"] = "Verwijder de geselecteerde items";
+App::$strings["View Source"] = "Bron weergeven";
+App::$strings["Follow Thread"] = "Conversatie volgen";
+App::$strings["Unfollow Thread"] = "Conversatie niet meer volgen";
+App::$strings["Activity/Posts"] = "Activiteit/berichten connectie";
+App::$strings["Edit Connection"] = "Connectie bewerken";
+App::$strings["Message"] = "Bericht";
+App::$strings["%s likes this."] = "%s vindt dit leuk.";
+App::$strings["%s doesn't like this."] = "%s vindt dit niet leuk.";
+App::$strings["<span %1\$s>%2\$d people</span> like this."] = array(
+ 0 => "<span %1\$s>%2\$d persoon</span> vindt dit leuk.",
+ 1 => "<span %1\$s>%2\$d personen</span> vinden dit leuk.",
+);
+App::$strings["<span %1\$s>%2\$d people</span> don't like this."] = array(
+ 0 => "<span %1\$s>%2\$d persoon</span> vindt dit niet leuk.",
+ 1 => "<span %1\$s>%2\$d personen</span> vinden dit niet leuk.",
+);
+App::$strings["and"] = "en";
+App::$strings[", and %d other people"] = array(
+ 0 => ", en %d ander persoon",
+ 1 => ", en %d andere personen",
+);
+App::$strings["%s like this."] = "%s vinden dit leuk.";
+App::$strings["%s don't like this."] = "%s vinden dit niet leuk.";
+App::$strings["Visible to <strong>everybody</strong>"] = "Voor <strong>iedereen</strong> zichtbaar";
+App::$strings["Please enter a video link/URL:"] = "Vul een videolink/URL in:";
+App::$strings["Please enter an audio link/URL:"] = "Vul een audiolink/URL in:";
+App::$strings["Tag term:"] = "Tag:";
+App::$strings["Where are you right now?"] = "Waar bevind je je op dit moment?";
+App::$strings["Page link name"] = "Linknaam pagina";
+App::$strings["Post as"] = "Bericht plaatsen als";
+App::$strings["upload photo"] = "foto uploaden";
+App::$strings["attach file"] = "bestand toevoegen";
+App::$strings["web link"] = "Weblink";
+App::$strings["Insert video link"] = "Videolink invoegen";
+App::$strings["video link"] = "videolink";
+App::$strings["Insert audio link"] = "Audiolink invoegen";
+App::$strings["audio link"] = "audiolink";
+App::$strings["set location"] = "locatie instellen";
+App::$strings["clear location"] = "locatie wissen";
+App::$strings["permissions"] = "permissies";
+App::$strings["Set publish date"] = "Publicatiedatum instellen";
+App::$strings["Discover"] = "Ontdekken";
+App::$strings["Imported public streams"] = "Openbare streams importeren";
+App::$strings["Commented Order"] = "Nieuwe reacties bovenaan";
+App::$strings["Sort by Comment Date"] = "Berichten met nieuwe reacties bovenaan";
+App::$strings["Posted Order"] = "Nieuwe berichten bovenaan";
+App::$strings["Sort by Post Date"] = "Nieuwe berichten bovenaan";
+App::$strings["Posts that mention or involve you"] = "Alleen berichten die jou vermelden of waar je op een andere manier bij betrokken bent";
+App::$strings["Activity Stream - by date"] = "Activiteitenstroom - volgens datum";
+App::$strings["Starred"] = "Met ster";
+App::$strings["Favourite Posts"] = "Favoriete berichten";
+App::$strings["Spam"] = "Spam";
+App::$strings["Posts flagged as SPAM"] = "Berichten gemarkeerd als SPAM";
+App::$strings["Status Messages and Posts"] = "Berichten in dit kanaal";
+App::$strings["About"] = "Over";
+App::$strings["Profile Details"] = "Profiel";
+App::$strings["Photo Albums"] = "Fotoalbums";
+App::$strings["Files and Storage"] = "Bestanden en opslagruimte";
+App::$strings["Chatrooms"] = "Chatkanalen";
+App::$strings["Saved Bookmarks"] = "Opgeslagen bladwijzers";
+App::$strings["Manage Webpages"] = "Webpagina's beheren";
+App::$strings["__ctx:noun__ Attending"] = array(
+ 0 => "aanwezig",
+ 1 => "aanwezig",
+);
+App::$strings["__ctx:noun__ Not Attending"] = array(
+ 0 => "niet aanwezig",
+ 1 => "niet aanwezig",
+);
+App::$strings["__ctx:noun__ Undecided"] = array(
+ 0 => "nog niet beslist",
+ 1 => "nog niet beslist",
+);
+App::$strings["__ctx:noun__ Agree"] = array(
+ 0 => "eens",
+ 1 => "eens",
+);
+App::$strings["__ctx:noun__ Disagree"] = array(
+ 0 => "oneens",
+ 1 => "oneens",
+);
+App::$strings["__ctx:noun__ Abstain"] = array(
+ 0 => "onthouding",
+ 1 => "onthoudingen",
+);
+App::$strings["%1\$s's bookmarks"] = "Bladwijzers van %1\$s";
+App::$strings["Missing room name"] = "Naam chatkanaal ontbreekt";
+App::$strings["Duplicate room name"] = "Naam chatkanaal bestaat al";
+App::$strings["Invalid room specifier."] = "Ongeldige omschrijving chatkanaal";
+App::$strings["Room not found."] = "Chatkanaal niet gevonden";
+App::$strings["Room is full"] = "Chatkanaal is vol";
+App::$strings["New window"] = "Nieuw venster";
+App::$strings["Open the selected location in a different window or browser tab"] = "Open de geselecteerde locatie in een ander venster of tab";
+App::$strings["User '%s' deleted"] = "Account '%s' verwijderd";
+App::$strings["Logged out."] = "Uitgelogd.";
+App::$strings["Failed authentication"] = "Mislukte authenticatie";
+App::$strings["The form security token was not correct. This probably happened because the form has been opened for too long (>3 hours) before submitting it."] = "De beveiligings-token van het tekstvak was ongeldig. Dit is mogelijk het gevolg van dat er te lang (meer dan 3 uur) gewacht is om de tekst op te slaan. ";
+App::$strings["Frequently"] = "Regelmatig";
+App::$strings["Hourly"] = "Elk uur";
+App::$strings["Twice daily"] = "Twee keer per dag";
+App::$strings["Daily"] = "Dagelijks";
+App::$strings["Weekly"] = "Wekelijks";
+App::$strings["Monthly"] = "Maandelijks";
+App::$strings["Friendica"] = "Friendica";
+App::$strings["OStatus"] = "OStatus";
+App::$strings["GNU-Social"] = "GNU social";
+App::$strings["RSS/Atom"] = "RSS/Atom";
+App::$strings["Diaspora"] = "Diaspora";
+App::$strings["Facebook"] = "Facebook";
+App::$strings["Zot"] = "Zot";
+App::$strings["LinkedIn"] = "LinkedIn";
+App::$strings["XMPP/IM"] = "XMPP/IM";
+App::$strings["MySpace"] = "MySpace";
+App::$strings["%d invitation available"] = array(
+ 0 => "%d uitnodiging beschikbaar",
+ 1 => "%d uitnodigingen beschikbaar",
+);
+App::$strings["Find Channels"] = "Kanalen vinden";
+App::$strings["Enter name or interest"] = "Vul naam of interesse in";
+App::$strings["Connect/Follow"] = "Verbinden/volgen";
+App::$strings["Examples: Robert Morgenstein, Fishing"] = "Voorbeeld: Robert Morgenstein, vissen";
+App::$strings["Random Profile"] = "Willekeurig profiel";
+App::$strings["Invite Friends"] = "Vrienden uitnodigen";
+App::$strings["Advanced example: name=fred and country=iceland"] = "Geavanceerd voorbeeld (Engels): name=jan en country=nederland";
+App::$strings["Saved Folders"] = "Bewaarde mappen";
+App::$strings["Everything"] = "Alles";
+App::$strings["Categories"] = "Categorieën";
+App::$strings["%d connection in common"] = array(
+ 0 => "%d gemeenschappelijke connectie",
+ 1 => "%d gemeenschappelijke connecties",
+);
+App::$strings["show more"] = "meer connecties weergeven";
+App::$strings["Item was not found."] = "Item niet gevonden";
+App::$strings["No source file."] = "Geen bronbestand.";
+App::$strings["Cannot locate file to replace"] = "Kan het te vervangen bestand niet vinden";
+App::$strings["Cannot locate file to revise/update"] = "Kan het bestand wat aangepast moet worden niet vinden";
+App::$strings["File exceeds size limit of %d"] = "Bestand is groter dan de toegelaten %d";
+App::$strings["You have reached your limit of %1$.0f Mbytes attachment storage."] = "Je hebt jouw limiet van %1$.0f MB opslagruimte voor bijlagen bereikt.";
+App::$strings["File upload failed. Possible system limit or action terminated."] = "Uploaden van bestand mislukt. Mogelijk systeemlimiet bereikt of actie afgebroken.";
+App::$strings["Stored file could not be verified. Upload failed."] = "Opgeslagen bestand kon niet worden geverifieerd. Uploaden mislukt.";
+App::$strings["Path not available."] = "Pad niet beschikbaar.";
+App::$strings["Empty pathname"] = "Padnaam leeg";
+App::$strings["duplicate filename or path"] = "dubbele bestandsnaam of pad";
+App::$strings["Path not found."] = "Pad niet gevonden";
+App::$strings["mkdir failed."] = "directory aanmaken (mkdir) mislukt.";
+App::$strings["database storage failed."] = "opslag in database mislukt.";
+App::$strings["Empty path"] = "Ontbrekend bestandspad";
+App::$strings["Birthday"] = "Verjaardag of geboortedatum";
+App::$strings["Age: "] = "Leeftijd:";
+App::$strings["YYYY-MM-DD or MM-DD"] = "JJJJ-MM-DD of MM-DD";
+App::$strings["never"] = "nooit";
+App::$strings["less than a second ago"] = "minder dan een seconde geleden";
+App::$strings["__ctx:e.g. 22 hours ago, 1 minute ago__ %1\$d %2\$s ago"] = "%1\$d %2\$s geleden";
+App::$strings["__ctx:relative_date__ year"] = array(
+ 0 => "jaar",
+ 1 => "jaren",
+);
+App::$strings["__ctx:relative_date__ month"] = array(
+ 0 => "maand",
+ 1 => "maanden",
+);
+App::$strings["__ctx:relative_date__ week"] = array(
+ 0 => "week",
+ 1 => "weken",
+);
+App::$strings["__ctx:relative_date__ day"] = array(
+ 0 => "dag",
+ 1 => "dagen",
+);
+App::$strings["__ctx:relative_date__ hour"] = array(
+ 0 => "uur",
+ 1 => "uren",
+);
+App::$strings["__ctx:relative_date__ minute"] = array(
+ 0 => "minuut",
+ 1 => "minuten",
+);
+App::$strings["__ctx:relative_date__ second"] = array(
+ 0 => "seconde",
+ 1 => "seconden",
+);
+App::$strings["%1\$s's birthday"] = "Verjaardag van %1\$s";
+App::$strings["Happy Birthday %1\$s"] = "Gefeliciteerd met je verjaardag %1\$s";
+App::$strings["Directory Options"] = "Opties kanalengids";
+App::$strings["Safe Mode"] = "Veilig zoeken";
+App::$strings["Public Forums Only"] = "Alleen openbare forums";
+App::$strings["This Website Only"] = "Alleen deze hub";
+App::$strings["%s <!item_type!>"] = "%s <!item_type!>";
+App::$strings["[Hubzilla:Notify] New mail received at %s"] = "[Hubzilla:Notificatie] Nieuw privébericht ontvangen op %s";
+App::$strings["%1\$s, %2\$s sent you a new private message at %3\$s."] = "%1\$s, %2\$s zond jou een nieuw privébericht om %3\$s.";
+App::$strings["%1\$s sent you %2\$s."] = "%1\$s zond jou %2\$s.";
+App::$strings["a private message"] = "een privébericht";
+App::$strings["Please visit %s to view and/or reply to your private messages."] = "Bezoek %s om je privéberichten te bekijken en/of er op te reageren.";
+App::$strings["%1\$s, %2\$s commented on [zrl=%3\$s]a %4\$s[/zrl]"] = "%1\$s, %2\$s gaf een reactie op [zrl=%3\$s]een %4\$s[/zrl]";
+App::$strings["%1\$s, %2\$s commented on [zrl=%3\$s]%4\$s's %5\$s[/zrl]"] = "%1\$s, %2\$s gaf een reactie op [zrl=%3\$s]een %5\$s van %4\$s[/zrl]";
+App::$strings["%1\$s, %2\$s commented on [zrl=%3\$s]your %4\$s[/zrl]"] = "%1\$s, %2\$s gaf een reactie op [zrl=%3\$s]jouw %4\$s[/zrl]";
+App::$strings["[Hubzilla:Notify] Comment to conversation #%1\$d by %2\$s"] = "[Hubzilla:Notificatie] Reactie op conversatie #%1\$d door %2\$s";
+App::$strings["%1\$s, %2\$s commented on an item/conversation you have been following."] = "%1\$s, %2\$s gaf een reactie op een bericht/conversatie die jij volgt.";
+App::$strings["Please visit %s to view and/or reply to the conversation."] = "Bezoek %s om de conversatie te bekijken en/of er op te reageren.";
+App::$strings["[Hubzilla:Notify] %s posted to your profile wall"] = "[Hubzilla:Notificatie] %s heeft een bericht op jouw kanaal geplaatst";
+App::$strings["%1\$s, %2\$s posted to your profile wall at %3\$s"] = "%1\$s, %2\$s heeft om %3\$s een bericht op jouw kanaal geplaatst";
+App::$strings["%1\$s, %2\$s posted to [zrl=%3\$s]your wall[/zrl]"] = "%1\$s, %2\$s heeft een bericht op [zrl=%3\$s]jouw kanaal[/zrl] geplaatst";
+App::$strings["[Hubzilla:Notify] %s tagged you"] = "[Hubzilla:Notificatie] %s heeft je genoemd";
+App::$strings["%1\$s, %2\$s tagged you at %3\$s"] = "%1\$s, %2\$s noemde jou op %3\$s";
+App::$strings["%1\$s, %2\$s [zrl=%3\$s]tagged you[/zrl]."] = "%1\$s, %2\$s [zrl=%3\$s]noemde jou[/zrl].";
+App::$strings["[Hubzilla:Notify] %1\$s poked you"] = "[Hubzilla:Notificatie] %1\$s heeft je aangestoten";
+App::$strings["%1\$s, %2\$s poked you at %3\$s"] = "%1\$s, %2\$s heeft je aangestoten op %3\$s";
+App::$strings["%1\$s, %2\$s [zrl=%2\$s]poked you[/zrl]."] = "%1\$s, %2\$s [zrl=%2\$s]heeft je aangestoten[/zrl].";
+App::$strings["[Hubzilla:Notify] %s tagged your post"] = "[Hubzilla:Notificatie] %s heeft jouw bericht getagd";
+App::$strings["%1\$s, %2\$s tagged your post at %3\$s"] = "%1\$s, %2\$s heeft jouw bericht om %3\$s getagd";
+App::$strings["%1\$s, %2\$s tagged [zrl=%3\$s]your post[/zrl]"] = "%1\$s, %2\$s heeft [zrl=%3\$s]jouw bericht[/zrl] getagd";
+App::$strings["[Hubzilla:Notify] Introduction received"] = "[Hubzilla:Notificatie] Connectieverzoek ontvangen";
+App::$strings["%1\$s, you've received an new connection request from '%2\$s' at %3\$s"] = "%1\$s, je hebt een nieuw connectieverzoek ontvangen van '%2\$s' op %3\$s";
+App::$strings["%1\$s, you've received [zrl=%2\$s]a new connection request[/zrl] from %3\$s."] = "%1\$s, je hebt een [zrl=%2\$s]nieuw connectieverzoek[/zrl] ontvangen van %3\$s.";
+App::$strings["You may visit their profile at %s"] = "Je kan het profiel bekijken op %s";
+App::$strings["Please visit %s to approve or reject the connection request."] = "Bezoek %s om het connectieverzoek te accepteren of af te wijzen.";
+App::$strings["[Hubzilla:Notify] Friend suggestion received"] = "[Hubzilla:Notificatie] Kanaalvoorstel ontvangen";
+App::$strings["%1\$s, you've received a friend suggestion from '%2\$s' at %3\$s"] = "%1\$s, je hebt een kanaalvoorstel ontvangen van '%2\$s' om %3\$s";
+App::$strings["%1\$s, you've received [zrl=%2\$s]a friend suggestion[/zrl] for %3\$s from %4\$s."] = "%1\$s, je hebt [zrl=%2\$s]een kanaalvoorstel[/zrl] ontvangen voor %3\$s van %4\$s.";
+App::$strings["Name:"] = "Naam:";
+App::$strings["Photo:"] = "Foto:";
+App::$strings["Please visit %s to approve or reject the suggestion."] = "Bezoek %s om het voorstel te accepteren of af te wijzen.";
+App::$strings["[Hubzilla:Notify]"] = "[Hubzilla:Notificatie]";
+App::$strings["This event has been added to your calendar."] = "Dit evenement is aan jouw agenda toegevoegd.";
+App::$strings["Not specified"] = "Niet aangegeven";
+App::$strings["Needs Action"] = "Actie vereist";
+App::$strings["Completed"] = "Voltooid";
+App::$strings["In Process"] = "In behandeling";
+App::$strings["Cancelled"] = "Geannuleerd";
+App::$strings["General Features"] = "Algemene functies";
+App::$strings["Content Expiration"] = "Inhoud laten verlopen";
+App::$strings["Remove posts/comments and/or private messages at a future time"] = "Berichten, reacties en/of privéberichten na een bepaalde tijd verwijderen";
+App::$strings["Multiple Profiles"] = "Meerdere profielen";
+App::$strings["Ability to create multiple profiles"] = "Mogelijkheid om meerdere profielen aan te maken";
+App::$strings["Advanced Profiles"] = "Geavanceerde profielen";
+App::$strings["Additional profile sections and selections"] = "Extra onderdelen en keuzes voor je profiel";
+App::$strings["Profile Import/Export"] = "Profiel importen/exporteren";
+App::$strings["Save and load profile details across sites/channels"] = "Profielgegevens opslaan en in andere hubs/kanalen gebruiken.";
+App::$strings["Web Pages"] = "Webpagina's";
+App::$strings["Provide managed web pages on your channel"] = "Sta beheerde webpagina's op jouw kanaal toe";
+App::$strings["Hide Rating"] = "Beoordelingen verbergen";
+App::$strings["Hide the rating buttons on your channel and profile pages. Note: People can still rate you somewhere else."] = "Verbergt de beoordelingsknoppen op jouw kanaal- en profielpagina's. Let op: Mensen kunnen jou nog steeds ergens anders beoordelen. ";
+App::$strings["Private Notes"] = "Privé-aantekeningen";
+App::$strings["Enables a tool to store notes and reminders (note: not encrypted)"] = "Een eenvoudige toepassing om aantekeningen en herinneringen in te bewaren (let op: niet versleuteld)";
+App::$strings["Navigation Channel Select"] = "Kanaal kiezen in navigatiemenu";
+App::$strings["Change channels directly from within the navigation dropdown menu"] = "Kies een ander kanaal direct vanuit het dropdown-menu op de navigatiebalk";
+App::$strings["Photo Location"] = "Fotolocatie";
+App::$strings["If location data is available on uploaded photos, link this to a map."] = "Wanneer in de geüploade foto's locatiegegevens aanwezig zijn, link dit dan aan een kaart.";
+App::$strings["Access Controlled Chatrooms"] = "Chatkanalen met toegangscontrole ";
+App::$strings["Provide chatrooms and chat services with access control."] = "Chatkanalen en chatdiensten met toegangscontrole aanbieden.";
+App::$strings["Smart Birthdays"] = "Slimme verjaardagen";
+App::$strings["Make birthday events timezone aware in case your friends are scattered across the planet."] = "Maak verjaardagen bewust van tijdzones. Voor het geval dat jouw vrienden over de hele wereld verspreid zijn.";
+App::$strings["Expert Mode"] = "Expertmodus";
+App::$strings["Enable Expert Mode to provide advanced configuration options"] = "Schakel de expertmodus in voor geavanceerde instellingen";
+App::$strings["Premium Channel"] = "Premiumkanaal";
+App::$strings["Allows you to set restrictions and terms on those that connect with your channel"] = "Stelt je in staat om beperkingen en voorwaarden in te stellen voor jouw kanaal";
+App::$strings["Post Composition Features"] = "Functies voor het opstellen van berichten";
+App::$strings["Large Photos"] = "Grote foto's";
+App::$strings["Include large (1024px) photo thumbnails in posts. If not enabled, use small (640px) photo thumbnails"] = "Gebruik grotere foto's (1024px) in berichten. Wanneer dit is uitgeschakeld worden er kleinere foto's (640px) gebruikt.";
+App::$strings["Automatically import channel content from other channels or feeds"] = "Automatisch inhoud uit andere kanalen of feeds importeren.";
+App::$strings["Even More Encryption"] = "Extra encryptie";
+App::$strings["Allow optional encryption of content end-to-end with a shared secret key"] = "Sta toe dat inhoud extra end-to-end wordt versleuteld met een gedeelde geheime sleutel.";
+App::$strings["Enable Voting Tools"] = "Peilingen inschakelen";
+App::$strings["Provide a class of post which others can vote on"] = "Maakt het mogelijk om een bericht op te stellen, waar mensen op kunnen stemmen.";
+App::$strings["Delayed Posting"] = "Berichten uitstellen";
+App::$strings["Allow posts to be published at a later date"] = "Maakt het mogelijk dat berichten op een toekomstig moment gepubliceerd kunnen worden.";
+App::$strings["Suppress Duplicate Posts/Comments"] = "Dubbele berichten/reacties tegenhouden";
+App::$strings["Prevent posts with identical content to be published with less than two minutes in between submissions."] = "Voorkomt dat berichten en reacties met identieke inhoud en die binnen twee minuten zijn verstuurd, worden gepubliceerd. ";
+App::$strings["Network and Stream Filtering"] = "Netwerk- en streamfilter";
+App::$strings["Search by Date"] = "Zoek op datum";
+App::$strings["Ability to select posts by date ranges"] = "Mogelijkheid om berichten op datum te filteren ";
+App::$strings["Privacy Groups"] = "Privacygroepen";
+App::$strings["Enable management and selection of privacy groups"] = "Beheer en selectie van privacygroepen inschakelen";
+App::$strings["Saved Searches"] = "Opgeslagen zoekopdrachten";
+App::$strings["Save search terms for re-use"] = "Sla zoekopdrachten op voor hergebruik";
+App::$strings["Network Personal Tab"] = "Persoonlijke netwerktab";
+App::$strings["Enable tab to display only Network posts that you've interacted on"] = "Sta het toe dat de tab netwerkberichten toont waarmee je interactie had";
+App::$strings["Network New Tab"] = "Nieuwe netwerktab";
+App::$strings["Enable tab to display all new Network activity"] = "Laat de tab alle nieuwe netwerkactiviteit tonen";
+App::$strings["Affinity Tool"] = "Verwantschapsfilter";
+App::$strings["Filter stream activity by depth of relationships"] = "Filter wat je in jouw grid ziet op hoe goed je iemand kent of mag";
+App::$strings["Connection Filtering"] = "Berichtenfilters";
+App::$strings["Filter incoming posts from connections based on keywords/content"] = "Filter binnenkomende berichten van connecties aan de hand van trefwoorden en taal";
+App::$strings["Suggest Channels"] = "Kanalen voorstellen";
+App::$strings["Show channel suggestions"] = "Voor jou mogelijk interessante kanalen voorstellen";
+App::$strings["Post/Comment Tools"] = "Bericht- en reactiehulpmiddelen";
+App::$strings["Community Tagging"] = "Taggen door anderen";
+App::$strings["Ability to tag existing posts"] = "Geeft andere mensen de mogelijkheid om jouw (bestaande) berichten te taggen";
+App::$strings["Post Categories"] = "Categorieën berichten";
+App::$strings["Add categories to your posts"] = "Voeg categorieën toe aan je berichten";
+App::$strings["Ability to file posts under folders"] = "Mogelijkheid om berichten in mappen op te slaan";
+App::$strings["Dislike Posts"] = "Vind berichten niet leuk";
+App::$strings["Ability to dislike posts/comments"] = "Mogelijkheid om berichten en reacties niet leuk te vinden";
+App::$strings["Star Posts"] = "Geef berichten een ster";
+App::$strings["Ability to mark special posts with a star indicator"] = "Mogelijkheid om speciale berichten met een ster te markeren";
+App::$strings["Tag Cloud"] = "Tagwolk";
+App::$strings["Provide a personal tag cloud on your channel page"] = "Zorgt voor een persoonlijke wolk met tags op jouw kanaalpagina";
+App::$strings["Channel is blocked on this site."] = "Kanaal is op deze hub geblokkeerd.";
+App::$strings["Channel location missing."] = "Ontbrekende kanaallocatie.";
+App::$strings["Response from remote channel was incomplete."] = "Antwoord van het kanaal op afstand was niet volledig.";
+App::$strings["Channel was deleted and no longer exists."] = "Kanaal is verwijderd en bestaat niet meer.";
+App::$strings["Protocol disabled."] = "Protocol uitgeschakeld.";
+App::$strings["Channel discovery failed."] = "Kanaal ontdekken mislukt.";
+App::$strings["Cannot connect to yourself."] = "Kan niet met jezelf verbinden";
+App::$strings["A deleted group with this name was revived. Existing item permissions <strong>may</strong> apply to this group and any future members. If this is not what you intended, please create another group with a different name."] = "Een verwijderde collectie met deze naam is gereactiveerd. Bestaande itemrechten <strong>kunnen</strong> van toepassing zijn op deze collectie en toekomstige leden. Wanneer je dit niet zo bedoeld hebt, moet je een nieuwe collectie met een andere naam aanmaken.";
+App::$strings["Add new connections to this privacy group"] = "Voeg nieuwe connecties aan deze privacygroep toe";
+App::$strings["edit"] = "bewerken";
+App::$strings["Edit group"] = "Privacygroep bewerken";
+App::$strings["Add privacy group"] = "Privacygroep toevoegen";
+App::$strings["Channels not in any privacy group"] = "Kanalen die zich in geen enkele privacygroep bevinden";
+App::$strings["add"] = "toevoegen";
+App::$strings["(Unknown)"] = "(Onbekend)";
+App::$strings["Visible to anybody on the internet."] = "Voor iedereen op het internet zichtbaar.";
+App::$strings["Visible to you only."] = "Alleen voor jou zichtbaar.";
+App::$strings["Visible to anybody in this network."] = "Voor iedereen in dit netwerk zichtbaar.";
+App::$strings["Visible to anybody authenticated."] = "Voor iedereen die geauthenticeerd is zichtbaar.";
+App::$strings["Visible to anybody on %s."] = "Voor iedereen op %s zichtbaar.";
+App::$strings["Visible to all connections."] = "Voor alle connecties zichtbaar.";
+App::$strings["Visible to approved connections."] = "Voor alle geaccepteerde connecties zichtbaar.";
+App::$strings["Visible to specific connections."] = "Voor specifieke connecties zichtbaar.";
+App::$strings["Privacy group is empty."] = "Privacygroep is leeg";
+App::$strings["Privacy group: %s"] = "Privacygroep: %s";
+App::$strings["Connection not found."] = "Connectie niet gevonden.";
+App::$strings["profile photo"] = "profielfoto";
+App::$strings["Image exceeds website size limit of %lu bytes"] = "Afbeelding is groter dan op deze hub toegestane limiet van %lu bytes";
+App::$strings["Image file is empty."] = "Afbeeldingsbestand is leeg";
+App::$strings["Photo storage failed."] = "Foto kan niet worden opgeslagen";
+App::$strings["a new photo"] = "een nieuwe foto";
+App::$strings["__ctx:photo_upload__ %1\$s posted %2\$s to %3\$s"] = "%1\$s plaatste %2\$s op %3\$s";
+App::$strings["Upload New Photos"] = "Nieuwe foto's uploaden";
+App::$strings["System"] = "Systeem";
+App::$strings["Create Personal App"] = "Persoonlijke app maken";
+App::$strings["Edit Personal App"] = "Persoonlijke app bewerken";
+App::$strings["Suggestions"] = "Voorgestelde kanalen";
+App::$strings["See more..."] = "Meer...";
+App::$strings["You have %1$.0f of %2$.0f allowed connections."] = "Je hebt %1$.0f van de %2$.0f toegestane connecties.";
+App::$strings["Add New Connection"] = "Nieuwe connectie toevoegen";
+App::$strings["Enter channel address"] = "Vul kanaaladres in";
+App::$strings["Examples: bob@example.com, https://example.com/barbara"] = "Voorbeelden: bob@example.com, http://example.com/barbara";
+App::$strings["Notes"] = "Aantekeningen";
+App::$strings["Remove term"] = "Verwijder zoekterm";
+App::$strings["Archives"] = "Archieven";
+App::$strings["Refresh"] = "Vernieuwen";
+App::$strings["Account settings"] = "Account";
+App::$strings["Channel settings"] = "Kanaal";
+App::$strings["Additional features"] = "Extra functies";
+App::$strings["Feature/Addon settings"] = "Plugin-instellingen";
+App::$strings["Display settings"] = "Weergave";
+App::$strings["Manage locations"] = "Locaties beheren";
+App::$strings["Export channel"] = "Kanaal exporteren";
+App::$strings["Connected apps"] = "Verbonden applicaties";
+App::$strings["Premium Channel Settings"] = "Instellingen premiumkanaal";
+App::$strings["Private Mail Menu"] = "Privéberichten";
+App::$strings["Combined View"] = "Gecombineerd postvak";
+App::$strings["Inbox"] = "Postvak IN";
+App::$strings["Outbox"] = "Postvak UIT";
+App::$strings["New Message"] = "Nieuw bericht";
+App::$strings["Conversations"] = "Conversaties";
+App::$strings["Received Messages"] = "Ontvangen berichten";
+App::$strings["Sent Messages"] = "Verzonden berichten";
+App::$strings["No messages."] = "Geen berichten";
+App::$strings["Delete conversation"] = "Verwijder conversatie";
+App::$strings["Events Menu"] = "Agenda-menu";
+App::$strings["Day View"] = "Dag tonen";
+App::$strings["Week View"] = "Week tonen";
+App::$strings["Month View"] = "Maand tonen";
+App::$strings["Events Tools"] = "Agenda-hulpmiddelen";
+App::$strings["Export Calendar"] = "Exporteren";
+App::$strings["Import Calendar"] = "Importeren";
+App::$strings["Overview"] = "Overzicht";
+App::$strings["Chat Members"] = "Chatleden";
+App::$strings["Bookmarked Chatrooms"] = "Bladwijzers van chatkanalen";
+App::$strings["Suggested Chatrooms"] = "Voorgestelde chatkanalen";
+App::$strings["photo/image"] = "foto/afbeelding";
+App::$strings["Click to show more"] = "Klik voor meer";
+App::$strings["Rating Tools"] = "Beoordelingen";
+App::$strings["Rate Me"] = "Beoordeel mij";
+App::$strings["View Ratings"] = "Bekijk beoordelingen";
+App::$strings["Forums"] = "Forums";
+App::$strings["Tasks"] = "Taken";
+App::$strings["Documentation"] = "Documentatie";
+App::$strings["Project/Site Information"] = "Project- en hub-informatie";
+App::$strings["For Members"] = "Voor leden";
+App::$strings["For Administrators"] = "Voor beheerders";
+App::$strings["For Developers"] = "Voor ontwikkelaars";
+App::$strings["Accounts"] = "Accounts";
+App::$strings["Member registrations waiting for confirmation"] = "Accounts die op goedkeuring wachten";
+App::$strings["Inspect queue"] = "Inspecteer berichtenwachtrij";
+App::$strings["DB updates"] = "Database-updates";
+App::$strings["Admin"] = "Beheer";
+App::$strings["Plugin Features"] = "Plugin-opties";
+App::$strings["Tags"] = "Tags";
+App::$strings["Keywords"] = "Trefwoorden";
+App::$strings["have"] = "heb";
+App::$strings["has"] = "heeft";
+App::$strings["want"] = "wil";
+App::$strings["wants"] = "wil";
+App::$strings["likes"] = "vindt dit leuk";
+App::$strings["dislikes"] = "vindt dit niet leuk";
+App::$strings["Delete this item?"] = "Dit item verwijderen?";
+App::$strings["[-] show less"] = "[-] minder reacties weergeven";
+App::$strings["[+] expand"] = "[+] uitklappen";
+App::$strings["[-] collapse"] = "[-] inklappen";
+App::$strings["Password too short"] = "Wachtwoord te kort";
+App::$strings["Passwords do not match"] = "Wachtwoorden komen niet overeen";
+App::$strings["Secret Passphrase"] = "Geheim wachtwoord";
+App::$strings["Passphrase hint"] = "Wachtwoordhint";
+App::$strings["Notice: Permissions have changed but have not yet been submitted."] = "Mededeling: de permissies zijn veranderd, maar zijn nog niet opgeslagen.";
+App::$strings["close all"] = "Alles sluiten";
+App::$strings["Nothing new here"] = "Niets nieuw hier";
+App::$strings["Rate This Channel (this is public)"] = "Beoordeel dit kanaal (dit is openbaar)";
+App::$strings["Describe (optional)"] = "Omschrijving (optioneel)";
+App::$strings["Please enter a link URL"] = "Vul een URL in:";
+App::$strings["Unsaved changes. Are you sure you wish to leave this page?"] = "Niet opgeslagen wijzigingen. Ben je er zeker van dat je deze pagina wil verlaten?";
+App::$strings["timeago.prefixAgo"] = "timeago.prefixAgo";
+App::$strings["timeago.prefixFromNow"] = "timeago.prefixFromNow";
+App::$strings["ago"] = "geleden";
+App::$strings["from now"] = "vanaf nu";
+App::$strings["less than a minute"] = "minder dan een minuut";
+App::$strings["about a minute"] = "ongeveer een minuut";
+App::$strings["%d minutes"] = "%d minuten";
+App::$strings["about an hour"] = "ongeveer een uur";
+App::$strings["about %d hours"] = "ongeveer %d uren";
+App::$strings["a day"] = "een dag";
+App::$strings["%d days"] = "%d dagen";
+App::$strings["about a month"] = "ongeveer een maand";
+App::$strings["%d months"] = "%d maanden";
+App::$strings["about a year"] = "ongeveer een jaar";
+App::$strings["%d years"] = "%d jaren";
+App::$strings[" "] = " ";
+App::$strings["timeago.numbers"] = "timeago.numbers";
+App::$strings["January"] = "januari";
+App::$strings["February"] = "februari";
+App::$strings["March"] = "maart";
+App::$strings["April"] = "april";
+App::$strings["__ctx:long__ May"] = "mei";
+App::$strings["June"] = "juni";
+App::$strings["July"] = "juli";
+App::$strings["August"] = "augustus";
+App::$strings["September"] = "september";
+App::$strings["October"] = "oktober";
+App::$strings["November"] = "november";
+App::$strings["December"] = "december";
+App::$strings["Jan"] = "jan";
+App::$strings["Feb"] = "feb";
+App::$strings["Mar"] = "mrt";
+App::$strings["Apr"] = "apr";
+App::$strings["__ctx:short__ May"] = "mei";
+App::$strings["Jun"] = "jun";
+App::$strings["Jul"] = "jul";
+App::$strings["Aug"] = "aug";
+App::$strings["Sep"] = "sep";
+App::$strings["Oct"] = "okt";
+App::$strings["Nov"] = "nov";
+App::$strings["Dec"] = "dec";
+App::$strings["Sunday"] = "zondag";
+App::$strings["Monday"] = "maandag";
+App::$strings["Tuesday"] = "dinsdag";
+App::$strings["Wednesday"] = "woensdag";
+App::$strings["Thursday"] = "donderdag";
+App::$strings["Friday"] = "vrijdag";
+App::$strings["Saturday"] = "zaterdag";
+App::$strings["Sun"] = "zo";
+App::$strings["Mon"] = "ma";
+App::$strings["Tue"] = "di";
+App::$strings["Wed"] = "wo";
+App::$strings["Thu"] = "do";
+App::$strings["Fri"] = "vr";
+App::$strings["Sat"] = "za";
+App::$strings["__ctx:calendar__ today"] = "vandaag";
+App::$strings["__ctx:calendar__ month"] = "maand";
+App::$strings["__ctx:calendar__ week"] = "week";
+App::$strings["__ctx:calendar__ day"] = "dag";
+App::$strings["__ctx:calendar__ All day"] = "hele dag";
+App::$strings["No recipient provided."] = "Geen ontvanger opgegeven.";
+App::$strings["[no subject]"] = "[geen onderwerp]";
+App::$strings["Unable to determine sender."] = "Afzender kan niet bepaald worden.";
+App::$strings["Stored post could not be verified."] = "Opgeslagen bericht kon niet worden geverifieerd.";
+App::$strings["Cannot create a duplicate channel identifier on this system. Import failed."] = "Kan geen dubbele kanaal-identificator op deze hub aanmaken. Importeren mislukt.";
+App::$strings["Channel clone failed. Import failed."] = "Het klonen van het kanaal is mislukt. Importeren mislukt.";
+App::$strings["Embedded content"] = "Ingesloten (embedded) inhoud";
+App::$strings["Embedding disabled"] = "Insluiten (embedding) uitgeschakeld";
+App::$strings["New Page"] = "Nieuwe pagina";
+App::$strings["Title"] = "Titel";
+App::$strings["Can view my normal stream and posts"] = "Kan mijn normale kanaalstream en berichten bekijken";
+App::$strings["Can view my default channel profile"] = "Kan mijn standaard kanaalprofiel bekijken";
+App::$strings["Can view my connections"] = "Kan een lijst met mijn connecties bekijken";
+App::$strings["Can view my file storage and photos"] = "Kan mijn foto's en andere bestanden bekijken";
+App::$strings["Can view my webpages"] = "Kan mijn pagina's bekijken";
+App::$strings["Can send me their channel stream and posts"] = "Kan mij de inhoud van hun kanaal en berichten sturen";
+App::$strings["Can post on my channel page (\"wall\")"] = "Kan een bericht in mijn kanaal plaatsen";
+App::$strings["Can comment on or like my posts"] = "Kan op mijn berichten reageren of deze (niet) leuk vinden";
+App::$strings["Can send me private mail messages"] = "Kan mij privéberichten sturen";
+App::$strings["Can like/dislike stuff"] = "Kan dingen leuk of niet leuk vinden";
+App::$strings["Profiles and things other than posts/comments"] = "Profielen en dingen, buiten berichten en reacties";
+App::$strings["Can forward to all my channel contacts via post @mentions"] = "Kan naar al mijn kanaalconnecties berichten doorsturen met behulp van @vermeldingen+";
+App::$strings["Advanced - useful for creating group forum channels"] = "Geavanceerd - nuttig voor groepforums";
+App::$strings["Can chat with me (when available)"] = "Kan met mij chatten (wanneer beschikbaar)";
+App::$strings["Can write to my file storage and photos"] = "Kan foto's en andere bestanden aan mijn bestandsopslag toevoegen";
+App::$strings["Can edit my webpages"] = "Kan mijn pagina's bewerken";
+App::$strings["Can source my public posts in derived channels"] = "Kan mijn openbare berichten als bron voor andere kanalen gebruiken";
+App::$strings["Somewhat advanced - very useful in open communities"] = "Enigszins geavanceerd (erg nuttig voor kanalen van forums/groepen)";
+App::$strings["Can administer my channel resources"] = "Kan mijn kanaal beheren";
+App::$strings["Extremely advanced. Leave this alone unless you know what you are doing"] = "Zeer geavanceerd. Laat dit met rust, behalve als je weet wat je doet.";
+App::$strings["Social Networking"] = "Sociaal netwerk";
+App::$strings["Social - Mostly Public"] = "Sociaal - Vrijwel alles openbaar";
+App::$strings["Social - Restricted"] = "Sociaal - Beperkt zichtbaar";
+App::$strings["Social - Private"] = "Sociaal - Verborgen kanaal";
+App::$strings["Community Forum"] = "Groepsforum";
+App::$strings["Forum - Mostly Public"] = "Forum - Vrijwel alles openbaar";
+App::$strings["Forum - Restricted"] = "Forum - Beperkt zichtbaar";
+App::$strings["Forum - Private"] = "Forum - Verborgen kanaal";
+App::$strings["Feed Republish"] = "Feed herpubliceren";
+App::$strings["Feed - Mostly Public"] = "Feed - Vrijwel alles openbaar";
+App::$strings["Feed - Restricted"] = "Feed - Beperkt zichtbaar";
+App::$strings["Special Purpose"] = "Speciaal doel";
+App::$strings["Special - Celebrity/Soapbox"] = "Speciaal - Beroemdheid/alleen volgen";
+App::$strings["Special - Group Repository"] = "Speciaal - Groepsopslag";
+App::$strings["Custom/Expert Mode"] = "Expertmodus/handmatig aanpassen";
+App::$strings["prev"] = "vorige";
+App::$strings["first"] = "eerste";
+App::$strings["last"] = "laatste";
+App::$strings["next"] = "volgende";
+App::$strings["older"] = "ouder";
+App::$strings["newer"] = "nieuwer";
+App::$strings["No connections"] = "Geen connecties";
+App::$strings["View all %s connections"] = "Toon alle %s connecties";
+App::$strings["poke"] = "aanstoten";
+App::$strings["ping"] = "ping";
+App::$strings["pinged"] = "gepingd";
+App::$strings["prod"] = "por";
+App::$strings["prodded"] = "gepord";
+App::$strings["slap"] = "slaan";
+App::$strings["slapped"] = "sloeg";
+App::$strings["finger"] = "finger";
+App::$strings["fingered"] = "gefingerd";
+App::$strings["rebuff"] = "afpoeieren";
+App::$strings["rebuffed"] = "afgepoeierd";
+App::$strings["happy"] = "gelukkig";
+App::$strings["sad"] = "bedroefd";
+App::$strings["mellow"] = "mellow";
+App::$strings["tired"] = "moe";
+App::$strings["perky"] = "parmantig";
+App::$strings["angry"] = "boos";
+App::$strings["stupefied"] = "verbijsterd";
+App::$strings["puzzled"] = "verward";
+App::$strings["interested"] = "geïnteresseerd";
+App::$strings["bitter"] = "verbitterd";
+App::$strings["cheerful"] = "vrolijk";
+App::$strings["alive"] = "levendig";
+App::$strings["annoyed"] = "geërgerd";
+App::$strings["anxious"] = "bezorgd";
+App::$strings["cranky"] = "humeurig";
+App::$strings["disturbed"] = "verontrust";
+App::$strings["frustrated"] = "gefrustreerd ";
+App::$strings["depressed"] = "gedeprimeerd";
+App::$strings["motivated"] = "gemotiveerd";
+App::$strings["relaxed"] = "ontspannen";
+App::$strings["surprised"] = "verrast";
+App::$strings["May"] = "mei";
+App::$strings["Unknown Attachment"] = "Onbekende bijlage";
+App::$strings["unknown"] = "onbekend";
+App::$strings["remove category"] = "categorie verwijderen";
+App::$strings["remove from file"] = "uit map verwijderen";
+App::$strings["Click to open/close"] = "Klik om te openen of te sluiten";
+App::$strings["default"] = "standaard";
+App::$strings["Page layout"] = "Pagina-lay-out";
+App::$strings["You can create your own with the layouts tool"] = "Je kan jouw eigen lay-out ontwerpen onder lay-outs";
+App::$strings["Page content type"] = "Opmaaktype pagina";
+App::$strings["Select an alternate language"] = "Kies een andere taal";
+App::$strings["activity"] = "activiteit";
+App::$strings["Design Tools"] = "Ontwerp-hulpmiddelen";
+App::$strings["Pages"] = "Pagina's";
+App::$strings["Logout"] = "Uitloggen";
+App::$strings["End this session"] = "Beëindig deze sessie";
+App::$strings["Home"] = "Home";
+App::$strings["Your posts and conversations"] = "Jouw kanaal";
+App::$strings["Your profile page"] = "Jouw profielpagina";
+App::$strings["Manage/Edit profiles"] = "Beheer/wijzig profielen";
+App::$strings["Edit your profile"] = "Jouw profiel bewerken";
+App::$strings["Your photos"] = "Jouw foto's";
+App::$strings["Your files"] = "Jouw bestanden";
+App::$strings["Your chatrooms"] = "Jouw chatkanalen";
+App::$strings["Your bookmarks"] = "Jouw bladwijzers";
+App::$strings["Your webpages"] = "Jouw webpagina's";
+App::$strings["Sign in"] = "Inloggen";
+App::$strings["%s - click to logout"] = "%s - klik om uit te loggen";
+App::$strings["Remote authentication"] = "Authenticatie op afstand";
+App::$strings["Click to authenticate to your home hub"] = "Authenticeer jezelf via (bijvoorbeeld) jouw hub";
+App::$strings["Home Page"] = "Homepage";
+App::$strings["Create an account"] = "Maak een account aan";
+App::$strings["Help and documentation"] = "Hulp en documentatie";
+App::$strings["Applications, utilities, links, games"] = "Apps";
+App::$strings["Search site @name, #tag, ?docs, content"] = "Zoek een @kanaal, doorzoek inhoud hub met tekst en #tags, of doorzoek ?documentatie ";
+App::$strings["Channel Directory"] = "Kanalengids";
+App::$strings["Your grid"] = "Jouw grid";
+App::$strings["Mark all grid notifications seen"] = "Markeer alle gridnotificaties als bekeken";
+App::$strings["Channel home"] = "Jouw kanaal";
+App::$strings["Mark all channel notifications seen"] = "Alle kanaalnotificaties als gelezen markeren";
+App::$strings["Notices"] = "Notificaties";
+App::$strings["Notifications"] = "Notificaties";
+App::$strings["See all notifications"] = "Alle notificaties weergeven";
+App::$strings["Private mail"] = "Privéberichten";
+App::$strings["See all private messages"] = "Alle privéberichten weergeven";
+App::$strings["Mark all private messages seen"] = "Markeer alle privéberichten als bekeken";
+App::$strings["Event Calendar"] = "Agenda";
+App::$strings["See all events"] = "Alle gebeurtenissen weergeven";
+App::$strings["Mark all events seen"] = "Markeer alle gebeurtenissen als bekeken";
+App::$strings["Manage Your Channels"] = "Beheer je kanalen";
+App::$strings["Account/Channel Settings"] = "Account-/kanaal-instellingen";
+App::$strings["Site Setup and Configuration"] = "Hub instellen en beheren";
+App::$strings["@name, #tag, ?doc, content"] = "@kanaal, #tag, inhoud, ?hulp";
+App::$strings["Please wait..."] = "Wachten aub...";
+App::$strings["Invalid data packet"] = "Datapakket ongeldig";
+App::$strings["Unable to verify channel signature"] = "Kanaalkenmerk kon niet worden geverifieerd. ";
+App::$strings["Unable to verify site signature for %s"] = "Hubkenmerk voor %s kon niet worden geverifieerd";
+App::$strings["invalid target signature"] = "ongeldig doelkenmerk";
App::$strings["Focus (Hubzilla default)"] = "Focus (Hubzilla-standaard)";
App::$strings["Theme settings"] = "Thema-instellingen";
App::$strings["Select scheme"] = "Kies schema van thema";
diff --git a/view/php/theme_init.php b/view/php/theme_init.php
index 648b144b3..7c020a51f 100644
--- a/view/php/theme_init.php
+++ b/view/php/theme_init.php
@@ -21,7 +21,7 @@ head_add_js('spin.js');
head_add_js('jquery.spin.js');
head_add_js('jquery.textinputs.js');
head_add_js('autocomplete.js');
-head_add_js('library/jquery-textcomplete/jquery.textcomplete.js');
+head_add_js('library/jquery-textcomplete/jquery.textcomplete.min.js');
//head_add_js('library/colorbox/jquery.colorbox.js');
head_add_js('library/jquery.timeago.js');
head_add_js('library/readmore.js/readmore.js');
diff --git a/view/theme/redbasic/css/narrow_navbar.css b/view/theme/redbasic/css/narrow_navbar.css
index 9d14beb33..faa18dfe5 100644
--- a/view/theme/redbasic/css/narrow_navbar.css
+++ b/view/theme/redbasic/css/narrow_navbar.css
@@ -1,4 +1,13 @@
@media screen and (min-width: 760px) {
+
+ aside {
+ padding-top: 52px;
+ }
+
+ section {
+ padding-top: 52px;
+ }
+
.navbar-nav > li > a {
padding-top:7px !important;
padding-bottom:3px !important;
@@ -56,4 +65,8 @@
top: 30px;
right: 15px;
}
+
+ .contextual-help-content-open {
+ top: 32px;
+ }
}
diff --git a/view/theme/redbasic/css/style.css b/view/theme/redbasic/css/style.css
index de48ff74a..bd5df5e63 100644
--- a/view/theme/redbasic/css/style.css
+++ b/view/theme/redbasic/css/style.css
@@ -200,6 +200,31 @@ header #banner #logo-text {
font-size: 22px;
}
+/* contextual help */
+.contextual-help-content {
+ display: none;
+
+}
+
+.contextual-help-content-open {
+ display: block;
+ position: fixed;
+ top: 51px;
+ max-height: 50%;
+ background: $comment_item_colour;
+ padding: 20px;
+ border-bottom: #ccc 1px solid;
+ overflow: auto;
+ -moz-box-shadow: 0px 3px 3px rgba(0,0,0,0.2);
+ -webkit-box-shadow: 0px 3px 3px rgba(0,0,0,0.2);
+ box-shadow: 0px 3px 3px rgba(0,0,0,0.2);
+}
+
+.contextual-help-content dd {
+ margin-bottom: 1em;
+}
+/* contextual help end */
+
/* footer */
footer {
@@ -1675,7 +1700,7 @@ nav .badge.mail-update:hover {
#expand-aside,
#expand-tabs,
-#help-btn {
+#context-help-btn {
color: $nav_active_icon_colour;
padding: 7px 10px;
}
@@ -1895,31 +1920,3 @@ nav .badge.mail-update:hover {
.help-searchlist a {
font-size: 130%;
}
-
-/* contextual help */
-.help-content {
- background: rgba(255, 255, 255, 0.9);
- color: #333333;
- position: fixed;
- top: 50px;
- left: -80%;
- width: 80%;
- height: 60%;
- padding: 20px;
- transition: left 300ms cubic-bezier(0.17, 0.04, 0.03, 0.94);
- box-sizing: border-box;
- border: #CCC thin solid;
- overflow: auto;
-}
-
-.help-content-open {
- left: 0px;
- -moz-box-shadow: 3px 3px 3px #ccc;
- -webkit-box-shadow: 3px 3px 3px #ccc;
- box-shadow: 3px 3px 3px #ccc;
-}
-
-.help-content dd {
- margin-bottom: 1em;
-}
-/* contextual help end */
diff --git a/view/theme/redbasic/js/redbasic.js b/view/theme/redbasic/js/redbasic.js
index b4cde6efc..877bcd840 100644
--- a/view/theme/redbasic/js/redbasic.js
+++ b/view/theme/redbasic/js/redbasic.js
@@ -67,15 +67,3 @@ function makeFullScreen(full) {
$('main').css({'transition': ''});
}
}
-
-/* contextual help */
-$(document).mouseup(function (e) {
- var container = $("#help-content");
-
- if (!container.is(e.target) // if the target of the click isn't the container...
- && container.has(e.target).length === 0 // ... nor a descendant of the container
- && container.hasClass('help-content-open'))
- {
- container.removeClass('help-content-open');
- }
-});
diff --git a/view/theme/redbasic/schema/bluegrid.css b/view/theme/redbasic/schema/bluegrid.css
index 36e26302a..471bed5e4 100644
--- a/view/theme/redbasic/schema/bluegrid.css
+++ b/view/theme/redbasic/schema/bluegrid.css
@@ -464,4 +464,19 @@ a:hover > .icon-trash {
}
}
+.help-content {
+ color: #FFF;
+ border: none;
+}
+
+.help-content a {
+ color: #FFF;
+ font-weight: 600;
+}
+
+.help-content-open {
+ -moz-box-shadow: none;
+ -webkit-box-shadow: none;
+ box-shadow: none;
+}
diff --git a/view/theme/redbasic/schema/dark.css b/view/theme/redbasic/schema/dark.css
index 6ed2501e1..fb18a4159 100644
--- a/view/theme/redbasic/schema/dark.css
+++ b/view/theme/redbasic/schema/dark.css
@@ -360,3 +360,14 @@ pre {
.table > tbody > tr > td {
border-color: #888;
}
+
+.help-content {
+ border-bottom: #222 thin solid;
+}
+
+.help-content-open {
+ -moz-box-shadow: 0px 3px 3px #222;
+ -webkit-box-shadow: 0px 3px 3px #222;
+ box-shadow: 0px 3px 3px #222;
+}
+
diff --git a/view/theme/redbasic/schema/simple_black_on_white.css b/view/theme/redbasic/schema/simple_black_on_white.css
index ba9771a40..e5cfb5f46 100644
--- a/view/theme/redbasic/schema/simple_black_on_white.css
+++ b/view/theme/redbasic/schema/simple_black_on_white.css
@@ -275,3 +275,13 @@ pre {
background-color: inherit;
border: none;
}
+
+.help-content {
+ border-bottom: #000 thin solid;
+}
+
+.help-content-open {
+ -moz-box-shadow: none;
+ -webkit-box-shadow: none;
+ box-shadow: none;
+}
diff --git a/view/theme/redbasic/schema/simple_green_on_black.css b/view/theme/redbasic/schema/simple_green_on_black.css
index e6901143b..7e3f901ef 100644
--- a/view/theme/redbasic/schema/simple_green_on_black.css
+++ b/view/theme/redbasic/schema/simple_green_on_black.css
@@ -305,3 +305,13 @@ pre {
.table > tbody > tr > td {
border-color: #143D12;
}
+
+.help-content {
+ border-bottom: #143D12 thin solid;
+}
+
+.help-content-open {
+ -moz-box-shadow: none;
+ -webkit-box-shadow: none;
+ box-shadow: none;
+}
diff --git a/view/theme/redbasic/schema/simple_white_on_black.css b/view/theme/redbasic/schema/simple_white_on_black.css
index a2d024881..d86154297 100644
--- a/view/theme/redbasic/schema/simple_white_on_black.css
+++ b/view/theme/redbasic/schema/simple_white_on_black.css
@@ -279,3 +279,13 @@ pre {
.table > tbody > tr > td {
border-color: #FFF;
}
+
+.help-content {
+ border-bottom: #FFF thin solid;
+}
+
+.help-content-open {
+ -moz-box-shadow: none;
+ -webkit-box-shadow: none;
+ box-shadow: none;
+}
diff --git a/view/tpl/abook_edit.tpl b/view/tpl/abook_edit.tpl
index 4fa810cb4..74ba6072d 100755
--- a/view/tpl/abook_edit.tpl
+++ b/view/tpl/abook_edit.tpl
@@ -3,18 +3,18 @@
{{if $notself}}
<div class="dropdown pull-right">
<button id="connection-dropdown" class="btn btn-default btn-xs" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
- <i class="icon-caret-down"></i>
+ <i class="icon-caret-down"></i>&nbsp;{{$tools_label}}
</button>
<ul class="dropdown-menu" aria-labelledby="dLabel">
- <li><a href="{{$buttons.view.url}}" title="{{$buttons.view.title}}">{{$buttons.view.label}}</a></li>
- <li><a href="{{$buttons.recent.url}}" title="{{$buttons.recent.title}}">{{$buttons.recent.label}}</a></li>
+ <li><a href="{{$tools.view.url}}" title="{{$tools.view.title}}">{{$tools.view.label}}</a></li>
+ <li><a href="{{$tools.recent.url}}" title="{{$tools.recent.title}}">{{$tools.recent.label}}</a></li>
<li class="divider"></li>
- <li><a href="#" title="{{$buttons.refresh.title}}" onclick="window.location.href='{{$buttons.refresh.url}}'; return false;">{{$buttons.refresh.label}}</a></li>
- <li><a href="#" title="{{$buttons.block.title}}" onclick="window.location.href='{{$buttons.block.url}}'; return false;">{{$buttons.block.label}}</a></li>
- <li><a href="#" title="{{$buttons.ignore.title}}" onclick="window.location.href='{{$buttons.ignore.url}}'; return false;">{{$buttons.ignore.label}}</a></li>
- <li><a href="#" title="{{$buttons.archive.title}}" onclick="window.location.href='{{$buttons.archive.url}}'; return false;">{{$buttons.archive.label}}</a></li>
- <li><a href="#" title="{{$buttons.hide.title}}" onclick="window.location.href='{{$buttons.hide.url}}'; return false;">{{$buttons.hide.label}}</a></li>
- <li><a href="#" title="{{$buttons.delete.title}}" onclick="window.location.href='{{$buttons.delete.url}}'; return false;">{{$buttons.delete.label}}</a></li>
+ <li><a href="#" title="{{$tools.refresh.title}}" onclick="window.location.href='{{$tools.refresh.url}}'; return false;">{{$tools.refresh.label}}</a></li>
+ <li><a href="#" title="{{$tools.block.title}}" onclick="window.location.href='{{$tools.block.url}}'; return false;">{{$tools.block.label}}</a></li>
+ <li><a href="#" title="{{$tools.ignore.title}}" onclick="window.location.href='{{$tools.ignore.url}}'; return false;">{{$tools.ignore.label}}</a></li>
+ <li><a href="#" title="{{$tools.archive.title}}" onclick="window.location.href='{{$tools.archive.url}}'; return false;">{{$tools.archive.label}}</a></li>
+ <li><a href="#" title="{{$tools.hide.title}}" onclick="window.location.href='{{$tools.hide.url}}'; return false;">{{$tools.hide.label}}</a></li>
+ <li><a href="#" title="{{$tools.delete.title}}" onclick="window.location.href='{{$tools.delete.url}}'; return false;">{{$tools.delete.label}}</a></li>
</ul>
</div>
{{/if}}
@@ -22,11 +22,11 @@
</div>
<div class="section-content-wrapper-np">
{{if $notself}}
- {{foreach $buttons as $b}}
- {{if $b.info}}
+ {{foreach $tools as $tool}}
+ {{if $tool.info}}
<div class="section-content-danger-wrapper">
<div>
- {{$b.info}}
+ {{$tool.info}}
</div>
</div>
{{/if}}
diff --git a/view/tpl/admin_site.tpl b/view/tpl/admin_site.tpl
index 54f625e0b..6b8729ee6 100755
--- a/view/tpl/admin_site.tpl
+++ b/view/tpl/admin_site.tpl
@@ -49,6 +49,7 @@
{{include file="field_input.tpl" field=$frontpage}}
{{include file="field_checkbox.tpl" field=$mirror_frontpage}}
{{include file="field_checkbox.tpl" field=$login_on_homepage}}
+ {{include file="field_checkbox.tpl" field=$enable_context_help}}
{{if $directory_server}}
{{include file="field_select.tpl" field=$directory_server}}
{{/if}}
diff --git a/view/tpl/head.tpl b/view/tpl/head.tpl
index 9fcdf1735..9502dd91c 100755
--- a/view/tpl/head.tpl
+++ b/view/tpl/head.tpl
@@ -11,6 +11,7 @@
{{$head_js}}
<link rel="shortcut icon" href="{{$icon}}" />
<link rel="search" href="{{$baseurl}}/opensearch" type="application/opensearchdescription+xml" title="{{$osearch}}" />
+<link rel="EditURI" type="application/rsd+xml" href="{{$baseurl}}/rsd.xml" />
<script>
var updateInterval = {{$update_interval}};
var localUser = {{if $local_channel}}{{$local_channel}}{{else}}false{{/if}};
diff --git a/view/tpl/jot.tpl b/view/tpl/jot.tpl
index 026c586a0..44e010e77 100755
--- a/view/tpl/jot.tpl
+++ b/view/tpl/jot.tpl
@@ -115,18 +115,20 @@
<button type="button" id="more-tools" class="btn btn-default btn-sm dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
<i id="more-tools-icon" class="icon-caret-down jot-icons"></i>
</button>
- <ul class="dropdown-menu dropdown-menu-right" role="menu">
+ <ul class="dropdown-menu dropdown-menu" role="menu">
<li class="visible-xs"><a href="#" onclick="preview_post();return false;"><i class="icon-eye-open"></i>&nbsp;{{$preview}}</a></li>
{{if $visitor}}
<li class="divider visible-xs"></li>
- {{if $writefiles}}<li class="visible-xs"><a id="wall-file-upload-sub" href="#" ><i class="icon-paper-clip"></i>&nbsp;{{$attach}}</a></li>{{/if}}
- <li class="visible-xs"><a href="#" onclick="jotGetLink(); return false;"><i class="icon-link"></i>&nbsp;{{$weblink}}</a></li>
+ {{if $writefiles}}
+ <li class="visible-xs"><a id="wall-file-upload-sub" href="#" ><i class="icon-paper-clip"></i>&nbsp;{{$attach}}</a></li>
{{/if}}
+ <li class="visible-xs"><a href="#" onclick="jotGetLink(); return false;"><i class="icon-link"></i>&nbsp;{{$weblink}}</a></li>
<li class="divider visible-xs"></li>
<li class="visible-xs visible-sm"><a href="#" onclick="jotGetLocation(); return false;"><i class="icon-globe"></i>&nbsp;{{$setloc}}</a></li>
{{if $noloc}}
<li class="visible-xs visible-sm"><a href="#" onclick="jotClearLocation(); return false;"><i class="icon-circle-blank"></i>&nbsp;{{$noloc}}</a></li>
{{/if}}
+ {{/if}}
{{if $feature_expire}}
<li class="visible-xs visible-sm"><a href="#" onclick="jotGetExpiry(); return false;"><i class="icon-eraser"></i>&nbsp;{{$expires}}</a></li>
{{/if}}
diff --git a/view/tpl/nav.tpl b/view/tpl/nav.tpl
index 7f6c33c61..03b48fd00 100755
--- a/view/tpl/nav.tpl
+++ b/view/tpl/nav.tpl
@@ -1,195 +1,212 @@
-<div class="container-fluid">
- <div class="navbar-header">
- <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#navbar-collapse-1">
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- </button>
- <button id="expand-tabs" type="button" class="navbar-toggle" data-toggle="collapse" data-target="#tabs-collapse-1">
- <i class="icon-circle-arrow-down" id="expand-tabs-icon"></i>
- </button>
- <button id="expand-aside" type="button" class="navbar-toggle" data-toggle="offcanvas" data-target="#region_1">
- <i class="icon-circle-arrow-right" id="expand-aside-icon"></i>
- </button>
- {{if $nav.help}}
- <button id="help-btn" type="button" class="navbar-toggle" title="{{$nav.help.3}}" onclick="$('#help-content').toggleClass('help-content-open');">
- <i class="icon-question"></i>
- </button>
- {{/if}}
- {{if $userinfo}}
- <img class="dropdown-toggle fakelink" data-toggle="dropdown" id="avatar" src="{{$userinfo.icon}}" alt="{{$userinfo.name}}"><span class="caret" id="usermenu-caret"></span>
- {{if $localuser}}
- <ul class="dropdown-menu" role="menu" aria-labelledby="avatar">
- {{foreach $nav.usermenu as $usermenu}}
- <li role="presentation"><a href="{{$usermenu.0}}" title="{{$usermenu.3}}" role="menuitem" id="{{$usermenu.4}}">{{$usermenu.1}}</a></li>
- {{/foreach}}
- <li role="presentation" class="divider"></li>
- {{if $nav.profiles}}<li role="presentation"><a href="{{$nav.profiles.0}}" title="{{$nav.profiles.3}}" role="menuitem" id="{{$nav.profiles.4}}">{{$nav.profiles.1}}</a></li>{{/if}}
- {{if $nav.settings}}<li role="presentation"><a href="{{$nav.settings.0}}" title="{{$nav.settings.3}}" role="menuitem" id="{{$nav.settings.4}}">{{$nav.settings.1}}</a></li>{{/if}}
- {{if $nav.manage}}<li role="presentation"><a href="{{$nav.manage.0}}" title="{{$nav.manage.3}}" role="menuitem" id="{{$nav.manage.4}}">{{$nav.manage.1}}</a></li>{{/if}}
- {{if $nav.channels}}
- {{foreach $nav.channels as $chan}}
- <li role="presentation" class="nav-channel-select"><a href="manage/{{$chan.channel_id}}" title="{{$chan.channel_name}}" role="menuitem">{{$chan.channel_name}}</a></li>
- {{/foreach}}
- {{/if}}
- {{if $nav.admin}}
- <li role="presentation" class="divider"></li>
- <li role="presentation"><a href="{{$nav.admin.0}}" title="{{$nav.admin.3}}" role="menuitem" id="{{$nav.admin.4}}">{{$nav.admin.1}}</a></li>
- {{/if}}
- {{if $nav.logout}}
- <li role="presentation" class="divider"></li>
- <li role="presentation"><a href="{{$nav.logout.0}}" title="{{$nav.logout.3}}" role="menuitem" id="{{$nav.logout.4}}">{{$nav.logout.1}}</a></li>
+ <div class="container-fluid">
+ <div class="navbar-header">
+ <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#navbar-collapse-1">
+ <span class="icon-bar"></span>
+ <span class="icon-bar"></span>
+ <span class="icon-bar"></span>
+ </button>
+ <button id="expand-tabs" type="button" class="navbar-toggle" data-toggle="collapse" data-target="#tabs-collapse-1">
+ <i class="icon-circle-arrow-down" id="expand-tabs-icon"></i>
+ </button>
+ <button id="expand-aside" type="button" class="navbar-toggle" data-toggle="offcanvas" data-target="#region_1">
+ <i class="icon-circle-arrow-right" id="expand-aside-icon"></i>
+ </button>
+ {{if $nav.help.6}}
+ <button id="context-help-btn"class="navbar-toggle" type="button" onclick="contextualHelp(); return false;">
+ <i class="icon-question-sign"></i>
+ </button>
+ {{/if}}
+ {{if $userinfo}}
+ <img class="dropdown-toggle fakelink" data-toggle="dropdown" id="avatar" src="{{$userinfo.icon}}" alt="{{$userinfo.name}}"><span class="caret" id="usermenu-caret"></span>
+ {{if $localuser}}
+ <ul class="dropdown-menu" role="menu" aria-labelledby="avatar">
+ {{foreach $nav.usermenu as $usermenu}}
+ <li role="presentation"><a href="{{$usermenu.0}}" title="{{$usermenu.3}}" role="menuitem" id="{{$usermenu.4}}">{{$usermenu.1}}</a></li>
+ {{/foreach}}
+ <li role="presentation" class="divider"></li>
+ {{if $nav.profiles}}<li role="presentation"><a href="{{$nav.profiles.0}}" title="{{$nav.profiles.3}}" role="menuitem" id="{{$nav.profiles.4}}">{{$nav.profiles.1}}</a></li>{{/if}}
+ {{if $nav.settings}}<li role="presentation"><a href="{{$nav.settings.0}}" title="{{$nav.settings.3}}" role="menuitem" id="{{$nav.settings.4}}">{{$nav.settings.1}}</a></li>{{/if}}
+ {{if $nav.manage}}<li role="presentation"><a href="{{$nav.manage.0}}" title="{{$nav.manage.3}}" role="menuitem" id="{{$nav.manage.4}}">{{$nav.manage.1}}</a></li>{{/if}}
+ {{if $nav.channels}}
+ {{foreach $nav.channels as $chan}}
+ <li role="presentation" class="nav-channel-select"><a href="manage/{{$chan.channel_id}}" title="{{$chan.channel_name}}" role="menuitem">{{$chan.channel_name}}</a></li>
+ {{/foreach}}
+ {{/if}}
+ {{if $nav.admin}}
+ <li role="presentation" class="divider"></li>
+ <li role="presentation"><a href="{{$nav.admin.0}}" title="{{$nav.admin.3}}" role="menuitem" id="{{$nav.admin.4}}">{{$nav.admin.1}}</a></li>
+ {{/if}}
+ {{if $nav.help.6}}
+ <li role="presentation" class="divider"></li>
+ <li role="presentation"><a href="{{$nav.help.0}}" title="{{$nav.help.3}}" role="menuitem" id="{{$nav.help.4}}">{{$nav.help.1}}</a></li>
+ {{/if}}
+ {{if $nav.logout}}
+ <li role="presentation" class="divider"></li>
+ <li role="presentation"><a href="{{$nav.logout.0}}" title="{{$nav.logout.3}}" role="menuitem" id="{{$nav.logout.4}}">{{$nav.logout.1}}</a></li>
+ {{/if}}
+ </ul>
+ {{else}}
+ {{if $nav.lock}}
+ <ul class="dropdown-menu" role="menu" aria-labelledby="avatar">
+ <li role="presentation"><a href="{{$nav.lock.0}}" title="{{$nav.lock.3}}" role="menuitem">{{$nav.lock.3}}</a></li>
+ </ul>
{{/if}}
- </ul>
- {{else}}
- {{if $nav.lock}}
- <ul class="dropdown-menu" role="menu" aria-labelledby="avatar">
- <li role="presentation"><a href="{{$nav.lock.0}}" title="{{$nav.lock.3}}" role="menuitem">{{$nav.lock.3}}</a></li>
- </ul>
{{/if}}
{{/if}}
- {{/if}}
- </div>
- <div class="collapse navbar-collapse" id="navbar-collapse-1">
- <ul class="nav navbar-nav navbar-left">
- {{if $nav.register}}<li class="{{$nav.register.2}}"><a href="{{$nav.register.0}}" title="{{$nav.register.3}}" id="{{$nav.register.4}}">{{$nav.register.1}}</a></li>{{/if}}
- {{if !$userinfo}}
+ </div>
+ <div class="collapse navbar-collapse" id="navbar-collapse-1">
+ <ul class="nav navbar-nav navbar-left">
+ {{if $nav.register}}<li class="{{$nav.register.2}}"><a href="{{$nav.register.0}}" title="{{$nav.register.3}}" id="{{$nav.register.4}}">{{$nav.register.1}}</a></li>{{/if}}
+ {{if !$userinfo}}
{{if $nav.loginmenu}}
- <li class="{{$nav.loginmenu.0.2}} hidden-xs">
- <a data-toggle="dropdown" data-target="#" href="{{$nav.loginmenu.0.0}}" title="{{$nav.loginmenu.0.3}}" id="{{$nav.loginmenu.0.4}}">{{$nav.loginmenu.0.1}} <span class="caret" id="loginmenu-caret"></span></a>
- <ul class="dropdown-menu" role="menu">
- {{foreach $nav.loginmenu as $loginmenu}}
- <li role="presentation"><a class="{{$loginmenu.2}}" href="{{$loginmenu.0}}" title="{{$loginmenu.3}}" role="menuitem" id="{{$loginmenu.4}}">{{$loginmenu.1}}</a></li>
- {{/foreach}}
- </ul>
- </li>
- {{foreach $nav.loginmenu as $loginmenu}}
- <li role="presentation"><a class="{{$loginmenu.2}} visible-xs" href="{{$loginmenu.0}}" title="{{$loginmenu.3}}" role="menuitem">{{$loginmenu.1}}</a></li>
- {{/foreach}}
+ <li class="{{$nav.loginmenu.0.2}} hidden-xs">
+ <a data-toggle="dropdown" data-target="#" href="{{$nav.loginmenu.0.0}}" title="{{$nav.loginmenu.0.3}}" id="{{$nav.loginmenu.0.4}}">{{$nav.loginmenu.0.1}} <span class="caret" id="loginmenu-caret"></span></a>
+ <ul class="dropdown-menu" role="menu">
+ {{foreach $nav.loginmenu as $loginmenu}}
+ <li role="presentation"><a class="{{$loginmenu.2}}" href="{{$loginmenu.0}}" title="{{$loginmenu.3}}" role="menuitem" id="{{$loginmenu.4}}">{{$loginmenu.1}}</a></li>
+ {{/foreach}}
+ </ul>
+ </li>
+ {{foreach $nav.loginmenu as $loginmenu}}
+ <li role="presentation"><a class="{{$loginmenu.2}} visible-xs" href="{{$loginmenu.0}}" title="{{$loginmenu.3}}" role="menuitem">{{$loginmenu.1}}</a></li>
+ {{/foreach}}
+ {{/if}}
+ {{/if}}
+
+ {{if $nav.alogout}}<li class="{{$nav}}-alogout.2"><a href="{{$nav.alogout.0}}" title="{{$nav.alogout.3}}" id="{{$nav.alogout.4}}">{{$nav.alogout.1}}</a></li>{{/if}}
+
+ {{if $nav.network}}
+ <li class="{{$sel.network}} hidden-xs">
+ <a href="{{$nav.network.0}}" title="{{$nav.network.3}}" id="{{$nav.network.4}}"><i class="icon-th"></i></a>
+ <span class="net-update badge dropdown-toggle" data-toggle="dropdown" rel="#nav-network-menu"></span>
+ <ul id="nav-network-menu" role="menu" class="dropdown-menu" rel="network">
+ {{* <li id="nav-network-see-all"><a href="{{$nav.network.all.0}}">{{$nav.network.all.1}}</a></li> *}}
+ <li id="nav-network-mark-all"><a href="#" onclick="markRead('network'); return false;">{{$nav.network.mark.1}}</a></li>
+ <li class="empty">{{$emptynotifications}}</li>
+ </ul>
+ </li>
+ <li class="{{$sel.network}} visible-xs">
+ <a href="{{$nav.network.0}}" title="{{$nav.network.3}}" ><i class="icon-th"></i></a>
+ <span class="net-update badge" rel="#nav-network-menu"></span>
+ </li>
+ {{/if}}
+
+ {{if $nav.home}}
+ <li class="{{$sel.home}} hidden-xs">
+ <a class="{{$nav.home.2}}" href="{{$nav.home.0}}" title="{{$nav.home.3}}" id="{{$nav.home.4}}"><i class="icon-home"></i></a>
+ <span class="home-update badge dropdown-toggle" data-toggle="dropdown" rel="#nav-home-menu"></span>
+ <ul id="nav-home-menu" class="dropdown-menu" rel="home">
+ {{* <li id="nav-home-see-all"><a href="{{$nav.home.all.0}}">{{$nav.home.all.1}}</a></li> *}}
+ <li id="nav-home-mark-all"><a href="#" onclick="markRead('home'); return false;">{{$nav.home.mark.1}}</a></li>
+ <li class="empty">{{$emptynotifications}}</li>
+ </ul>
+ </li>
+ <li class="{{$sel.home}} visible-xs">
+ <a class="{{$nav.home.2}}" href="{{$nav.home.0}}" title="{{$nav.home.3}}" ><i class="icon-home"></i></a>
+ <span class="home-update badge" rel="#nav-home-menu"></span>
+ </li>
+ {{/if}}
+
+
+ {{if $nav.messages}}
+ <li class="{{$sel.messages}} hidden-xs">
+ <a class="{{$nav.messages.2}}" href="{{$nav.messages.0}}" title="{{$nav.messages.3}}" id="{{$nav.messages.4}}"><i class="icon-envelope"></i></a>
+ <span class="mail-update badge dropdown-toggle" data-toggle="dropdown" rel="#nav-messages-menu"></span>
+ <ul id="nav-messages-menu" class="dropdown-menu" rel="messages">
+ <li id="nav-messages-see-all"><a href="{{$nav.messages.all.0}}">{{$nav.messages.all.1}}</a></li>
+ <li id="nav-messages-mark-all"><a href="#" onclick="markRead('messages'); return false;">{{$nav.messages.mark.1}}</a></li>
+ <li class="empty">{{$emptynotifications}}</li>
+ </ul>
+ </li>
+ <li class="{{$sel.messages}} visible-xs">
+ <a class="{{$nav.messages.2}}" href="{{$nav.messages.0}}" title="{{$nav.messages.3}}" ><i class="icon-envelope"></i></a>
+ <span class="mail-update badge" rel="#nav-messages-menu"></span>
+ </li>
+ {{/if}}
+
+ {{if $nav.all_events}}
+ <li class="{{$sel.all_events}} hidden-xs">
+ <a class="{{$nav.all_events.2}}" href="{{$nav.all_events.0}}" title="{{$nav.all_events.3}}" id='{{$nav.all_events.4}}'><i class="icon-calendar"></i></a>
+ <span class="all_events-update badge dropdown-toggle" data-toggle="dropdown" rel="#nav-all_events-menu"></span>
+ <ul id="nav-all_events-menu" class="dropdown-menu" rel="all_events">
+ <li id="nav-all_events-see-all"><a href="{{$nav.all_events.all.0}}">{{$nav.all_events.all.1}}</a></li>
+ <li id="nav-all_events-mark-all"><a href="#" onclick="markRead('all_events'); return false;">{{$nav.all_events.mark.1}}</a></li>
+ <li class="empty">{{$emptynotifications}}</li>
+ </ul>
+ </li>
+ <li class="{{$sel.all_events}} visible-xs">
+ <a class="{{$nav.all_events.2}}" href="{{$nav.all_events.0}}" title="{{$nav.all_events.3}}" ><i class="icon-calendar"></i></a>
+ <span class="all_events-update badge" rel="#nav-all_events-menu"></span>
+ </li>
+ {{/if}}
+
+ {{if $nav.intros}}
+ <li class="{{$sel.intros}} hidden-xs">
+ <a class="{{$nav.intros.2}}" href="{{$nav.intros.0}}" title="{{$nav.intros.3}}" id="{{$nav.intros.4}}"><i class="icon-user"></i></a>
+ <span class="intro-update badge dropdown-toggle" data-toggle="dropdown" rel="#nav-intros-menu"></span>
+ <ul id="nav-intros-menu" class="dropdown-menu" rel="intros">
+ <li id="nav-intros-see-all"><a href="{{$nav.intros.all.0}}">{{$nav.intros.all.1}}</a></li>
+ <li class="empty">{{$emptynotifications}}</li>
+ </ul>
+ </li>
+ <li class="{{$sel.intros}} visible-xs">
+ <a class="{{$nav.intros.2}}" href="{{$nav.intros.0}}" title="{{$nav.intros.3}}" ><i class="icon-user"></i></a>
+ <span class="intro-update badge" rel="#nav-intros-menu"></span>
+ </li>
+ {{/if}}
+
+ {{if $nav.notifications}}
+ <li class="{{$sel.notifications}} hidden-xs">
+ <a href="{{$nav.notifications.0}}" title="{{$nav.notifications.1}}" id="{{$nav.notifications.4}}"><i class="icon-exclamation"></i></a>
+ <span class="notify-update badge dropdown-toggle" data-toggle="dropdown" rel="#nav-notify-menu"></span>
+ <ul id="nav-notify-menu" class="dropdown-menu" rel="notify">
+ <li id="nav-notify-see-all"><a href="{{$nav.notifications.all.0}}">{{$nav.notifications.all.1}}</a></li>
+ <li id="nav-notify-mark-all"><a href="#" onclick="markRead('notify'); return false;">{{$nav.notifications.mark.1}}</a></li>
+ <li class="empty">{{$emptynotifications}}</li>
+ </ul>
+ </li>
+ <li class="{{$sel.notifications}} visible-xs">
+ <a href="{{$nav.notifications.0}}" title="{{$nav.notifications.1}}"><i class="icon-exclamation"></i></a>
+ <span class="notify-update badge" rel="#nav-notify-menu"></span>
+ </li>
{{/if}}
- {{/if}}
- {{if $nav.alogout}}<li class="{{$nav}}-alogout.2"><a href="{{$nav.alogout.0}}" title="{{$nav.alogout.3}}" id="{{$nav.alogout.4}}">{{$nav.alogout.1}}</a></li>{{/if}}
- {{if $nav.network}}
- <li class="{{$sel.network}} hidden-xs">
- <a href="{{$nav.network.0}}" title="{{$nav.network.3}}" id="{{$nav.network.4}}"><i class="icon-th"></i></a>
- <span class="net-update badge dropdown-toggle" data-toggle="dropdown" rel="#nav-network-menu"></span>
- <ul id="nav-network-menu" role="menu" class="dropdown-menu" rel="network">
- {{* <li id="nav-network-see-all"><a href="{{$nav.network.all.0}}">{{$nav.network.all.1}}</a></li> *}}
- <li id="nav-network-mark-all"><a href="#" onclick="markRead('network'); return false;">{{$nav.network.mark.1}}</a></li>
- <li class="empty">{{$emptynotifications}}</li>
- </ul>
- </li>
- <li class="{{$sel.network}} visible-xs">
- <a href="{{$nav.network.0}}" title="{{$nav.network.3}}" ><i class="icon-th"></i></a>
- <span class="net-update badge" rel="#nav-network-menu"></span>
- </li>
- {{/if}}
- {{if $nav.home}}
- <li class="{{$sel.home}} hidden-xs">
- <a class="{{$nav.home.2}}" href="{{$nav.home.0}}" title="{{$nav.home.3}}" id="{{$nav.home.4}}"><i class="icon-home"></i></a>
- <span class="home-update badge dropdown-toggle" data-toggle="dropdown" rel="#nav-home-menu"></span>
- <ul id="nav-home-menu" class="dropdown-menu" rel="home">
- {{* <li id="nav-home-see-all"><a href="{{$nav.home.all.0}}">{{$nav.home.all.1}}</a></li> *}}
- <li id="nav-home-mark-all"><a href="#" onclick="markRead('home'); return false;">{{$nav.home.mark.1}}</a></li>
- <li class="empty">{{$emptynotifications}}</li>
- </ul>
- </li>
- <li class="{{$sel.home}} visible-xs">
- <a class="{{$nav.home.2}}" href="{{$nav.home.0}}" title="{{$nav.home.3}}" ><i class="icon-home"></i></a>
- <span class="home-update badge" rel="#nav-home-menu"></span>
- </li>
- {{/if}}
- {{if $nav.messages}}
- <li class="{{$sel.messages}} hidden-xs">
- <a class="{{$nav.messages.2}}" href="{{$nav.messages.0}}" title="{{$nav.messages.3}}" id="{{$nav.messages.4}}"><i class="icon-envelope"></i></a>
- <span class="mail-update badge dropdown-toggle" data-toggle="dropdown" rel="#nav-messages-menu"></span>
- <ul id="nav-messages-menu" class="dropdown-menu" rel="messages">
- <li id="nav-messages-see-all"><a href="{{$nav.messages.all.0}}">{{$nav.messages.all.1}}</a></li>
- <li id="nav-messages-mark-all"><a href="#" onclick="markRead('messages'); return false;">{{$nav.messages.mark.1}}</a></li>
- <li class="empty">{{$emptynotifications}}</li>
- </ul>
- </li>
- <li class="{{$sel.messages}} visible-xs">
- <a class="{{$nav.messages.2}}" href="{{$nav.messages.0}}" title="{{$nav.messages.3}}" ><i class="icon-envelope"></i></a>
- <span class="mail-update badge" rel="#nav-messages-menu"></span>
- </li>
- {{/if}}
- {{if $nav.all_events}}
- <li class="{{$sel.all_events}} hidden-xs">
- <a class="{{$nav.all_events.2}}" href="{{$nav.all_events.0}}" title="{{$nav.all_events.3}}" id='{{$nav.all_events.4}}'><i class="icon-calendar"></i></a>
- <span class="all_events-update badge dropdown-toggle" data-toggle="dropdown" rel="#nav-all_events-menu"></span>
- <ul id="nav-all_events-menu" class="dropdown-menu" rel="all_events">
- <li id="nav-all_events-see-all"><a href="{{$nav.all_events.all.0}}">{{$nav.all_events.all.1}}</a></li>
- <li id="nav-all_events-mark-all"><a href="#" onclick="markRead('all_events'); return false;">{{$nav.all_events.mark.1}}</a></li>
- <li class="empty">{{$emptynotifications}}</li>
- </ul>
- </li>
- <li class="{{$sel.all_events}} visible-xs">
- <a class="{{$nav.all_events.2}}" href="{{$nav.all_events.0}}" title="{{$nav.all_events.3}}" ><i class="icon-calendar"></i></a>
- <span class="all_events-update badge" rel="#nav-all_events-menu"></span>
- </li>
- {{/if}}
- {{if $nav.intros}}
- <li class="{{$sel.intros}} hidden-xs">
- <a class="{{$nav.intros.2}}" href="{{$nav.intros.0}}" title="{{$nav.intros.3}}" id="{{$nav.intros.4}}"><i class="icon-user"></i></a>
- <span class="intro-update badge dropdown-toggle" data-toggle="dropdown" rel="#nav-intros-menu"></span>
- <ul id="nav-intros-menu" class="dropdown-menu" rel="intros">
- <li id="nav-intros-see-all"><a href="{{$nav.intros.all.0}}">{{$nav.intros.all.1}}</a></li>
- <li class="empty">{{$emptynotifications}}</li>
- </ul>
- </li>
- <li class="{{$sel.intros}} visible-xs">
- <a class="{{$nav.intros.2}}" href="{{$nav.intros.0}}" title="{{$nav.intros.3}}" ><i class="icon-user"></i></a>
- <span class="intro-update badge" rel="#nav-intros-menu"></span>
- </li>
- {{/if}}
- {{if $nav.notifications}}
- <li class="{{$sel.notifications}} hidden-xs">
- <a href="{{$nav.notifications.0}}" title="{{$nav.notifications.1}}" id="{{$nav.notifications.4}}"><i class="icon-exclamation"></i></a>
- <span class="notify-update badge dropdown-toggle" data-toggle="dropdown" rel="#nav-notify-menu"></span>
- <ul id="nav-notify-menu" class="dropdown-menu" rel="notify">
- <li id="nav-notify-see-all"><a href="{{$nav.notifications.all.0}}">{{$nav.notifications.all.1}}</a></li>
- <li id="nav-notify-mark-all"><a href="#" onclick="markRead('notify'); return false;">{{$nav.notifications.mark.1}}</a></li>
- <li class="empty">{{$emptynotifications}}</li>
- </ul>
- </li>
- <li class="{{$sel.notifications}} visible-xs">
- <a href="{{$nav.notifications.0}}" title="{{$nav.notifications.1}}"><i class="icon-exclamation"></i></a>
- <span class="notify-update badge" rel="#nav-notify-menu"></span>
- </li>
- {{/if}}
- </ul>
- <ul class="nav navbar-nav navbar-right">
- <li class="hidden-xs">
- <form method="get" action="search" role="search">
- <div id="nav-search-spinner"></div><input class="icon-search" id="nav-search-text" type="text" value="" placeholder="&#xf002; {{$help}}" name="search" title="{{$nav.search.3}}" onclick="this.submit();"/>
- </form>
- </li>
- <li class="visible-xs">
- <a href="/search" title="{{$nav.search.3}}"><i class="icon-search"></i></a>
- </li>
+ </ul>
+ <ul class="nav navbar-nav navbar-right">
+ <li class="hidden-xs">
+ <form method="get" action="search" role="search">
+ <div id="nav-search-spinner"></div><input class="icon-search" id="nav-search-text" type="text" value="" placeholder="&#xf002; {{$help}}" name="search" title="{{$nav.search.3}}" onclick="this.submit();"/>
+ </form>
+ </li>
+ <li class="visible-xs">
+ <a href="/search" title="{{$nav.search.3}}"><i class="icon-search"></i></a>
+ </li>
+
{{if $powered_by}}
- <div id="powered-by">{{$powered_by}}</div>
+ <div id="powered-by">{{$powered_by}}</div>
{{/if}}
{{if $nav.directory}}
- <li class="{{$sel.directory}}">
- <a class="{{$nav.directory.2}}" href="{{$nav.directory.0}}" title="{{$nav.directory.3}}" id="{{$nav.directory.4}}"><i class="icon-sitemap"></i></a>
- </li>
+ <li class="{{$sel.directory}}">
+ <a class="{{$nav.directory.2}}" href="{{$nav.directory.0}}" title="{{$nav.directory.3}}" id="{{$nav.directory.4}}"><i class="icon-sitemap"></i></a>
+ </li>
{{/if}}
+
{{if $nav.apps}}
- <li class="{{$sel.apps}}">
- <a class="{{$nav.apps.2}}" href="{{$nav.apps.0}}" title="{{$nav.apps.3}}" id="{{$nav.apps.4}}"><i class="icon-cogs"></i></a>
- </li>
+ <li class="{{$sel.apps}}">
+ <a class="{{$nav.apps.2}}" href="{{$nav.apps.0}}" title="{{$nav.apps.3}}" id="{{$nav.apps.4}}"><i class="icon-cogs"></i></a>
+ </li>
{{/if}}
+
{{if $nav.help}}
- <li class="{{$sel.help}} hidden-xs">
- <a class="{{$nav.help.2}}" target="hubzilla-help" href="{{$nav.help.0}}" title="{{$nav.help.3}}" id="{{$nav.help.4}}" onclick="$('#help-content').toggleClass('help-content-open'); return false;"><i class="icon-question"></i></a>
- </li>
+ <li class="{{$sel.help}}{{if $nav.help.6}} hidden-xs{{/if}}">
+ <a class="{{$nav.help.2}}" target="hubzilla-help" href="{{$nav.help.0}}" title="{{$nav.help.3}}" id="{{$nav.help.4}}"{{if $nav.help.6}} onclick="contextualHelp(); return false;"{{/if}}>{{if $nav.help.6}}<i class="icon-question-sign"></i>{{else}}<i class="icon-question"></i>{{/if}}</a>
+ </li>
{{/if}}
- </ul>
+ </ul>
+ </div>
</div>
- <div id="help-content" class="help-content">
+ {{if $nav.help.6}}
+ <div id="contextual-help-content" class="contextual-help-content">
{{$nav.help.5}}
- <p class="pull-right"><a href="{{$nav.help.0}}">Click here for more documentation...</a></p>
+ <button type="button" class="close" onclick="contextualHelp();">×</button>
</div>
-</div>
+ {{/if}}
diff --git a/view/tpl/photo_view.tpl b/view/tpl/photo_view.tpl
index 254733622..ca2b5e090 100755
--- a/view/tpl/photo_view.tpl
+++ b/view/tpl/photo_view.tpl
@@ -5,7 +5,7 @@
{{if $tools || $map || $edit}}
<div class="btn-group">
<button type="button" class="btn btn-default btn-xs dropdown-toggle" data-toggle="dropdown">
- <i class="icon-caret-down"></i>
+ <i class="icon-caret-down"></i>&nbsp;{{$tools_label}}
</button>
<ul class="dropdown-menu">
{{if $tools}}
diff --git a/view/tpl/profile_edit.tpl b/view/tpl/profile_edit.tpl
index a02323e45..4908646b9 100755
--- a/view/tpl/profile_edit.tpl
+++ b/view/tpl/profile_edit.tpl
@@ -2,7 +2,7 @@
<div class="section-title-wrapper">
<div class="dropdown pull-right" id="profile-edit-links">
<button type="button" class="btn btn-default btn-xs dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
- <i class="icon-caret-down"></i>
+ <i class="icon-caret-down"></i>&nbsp;{{$tools_label}}
</button>
<ul class="dropdown-menu">
<li class="nav-item">
diff --git a/view/tpl/rsd.tpl b/view/tpl/rsd.tpl
new file mode 100644
index 000000000..9fd02c472
--- /dev/null
+++ b/view/tpl/rsd.tpl
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<rsd version="1.0" xmlns="http://archipelago.phrasewise.com/rsd">
+ <service>
+ <engineName>{{$project}}</engineName>
+ <engineLink>{{$baseurl}}</engineLink>
+ <apis>
+ <api name="Twitter" preferred="true" apiLink="{{$apipath}}" blogID="">
+ <settings>
+ <docs>http://status.net/wiki/TwitterCompatibleAPI</docs>
+ <setting name="OAuth">true</setting>
+ </settings>
+ </api>
+ </apis>
+ </service>
+</rsd> \ No newline at end of file